Skip to content

Commit

Permalink
[PATCH] knfsd: nfsd4: grace period end
Browse files Browse the repository at this point in the history
For the purposes of reboot recovery, we want to do some work during the
transition period at the end of the grace period.  Some of that work must be
guaranteed to have a certain relationship with the end of the grace period, so
we want to control the transition there.

Our approach is to modify the in_grace() checks to consult a global variable
instead of checking the time directly, to schedule the first run of the
laundromat thread at the end of the grace period, and to set the global
end-of-grace-period there.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
NeilBrown authored and Linus Torvalds committed Jun 24, 2005
1 parent 28ce605 commit a76b431
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions fs/nfsd/nfs4state.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
static time_t lease_time = 90; /* default lease time */
static time_t user_lease_time = 90;
time_t boot_time;
static time_t grace_end = 0;
static int in_grace = 1;
static u32 current_clientid = 1;
static u32 current_ownerid = 1;
static u32 current_fileid = 1;
Expand Down Expand Up @@ -1908,6 +1908,13 @@ nfsd4_renew(clientid_t *clid)
return status;
}

static void
end_grace(void)
{
dprintk("NFSD: end of grace period\n");
in_grace = 0;
}

time_t
nfs4_laundromat(void)
{
Expand All @@ -1922,6 +1929,8 @@ nfs4_laundromat(void)
nfs4_lock_state();

dprintk("NFSD: laundromat service - starting\n");
if (in_grace)
end_grace();
list_for_each_safe(pos, next, &client_lru) {
clp = list_entry(pos, struct nfs4_client, cl_lru);
if (time_after((unsigned long)clp->cl_time, (unsigned long)cutoff)) {
Expand Down Expand Up @@ -3223,10 +3232,10 @@ __nfs4_state_start(void)
boot_time = get_seconds();
grace_time = max(user_lease_time, lease_time);
lease_time = user_lease_time;
in_grace = 1;
printk("NFSD: starting %ld-second grace period\n", grace_time);
grace_end = boot_time + grace_time;
laundry_wq = create_singlethread_workqueue("nfsd4");
queue_delayed_work(laundry_wq, &laundromat_work, NFSD_LEASE_TIME*HZ);
queue_delayed_work(laundry_wq, &laundromat_work, grace_time*HZ);
}

int
Expand All @@ -3247,14 +3256,7 @@ nfs4_state_start(void)
int
nfs4_in_grace(void)
{
return get_seconds() < grace_end;
}

void
set_no_grace(void)
{
printk("NFSD: ERROR in reboot recovery. State reclaims will fail.\n");
grace_end = get_seconds();
return in_grace;
}

time_t
Expand Down

0 comments on commit a76b431

Please sign in to comment.