Skip to content

Commit

Permalink
[PATCH] nfsd4: stop overusing RECLAIM_BAD
Browse files Browse the repository at this point in the history
A misreading of the spec lead us to convert all errors on open and lock
reclaims to RECLAIM_BAD.  This causes problems--for example, a reboot within
the grace period could lead to reclaims with stale stateid's, and we'd like to
return STALE errors in those cases.

What rfc3530 actually says about RECLAIM_BAD: "The reclaim provided by the
client does not match any of the server's state consistency checks and is
bad." I'm assuming that "state consistency checks" refers to checks for
consistency with the state recorded to stable storage, and that the error
should be reserved for that case.

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 Jul 8, 2005
1 parent 0dd395d commit 3751517
Showing 1 changed file with 7 additions and 18 deletions.
25 changes: 7 additions & 18 deletions fs/nfsd/nfs4state.c
Original file line number Diff line number Diff line change
Expand Up @@ -1531,8 +1531,6 @@ nfsd4_process_open1(struct nfsd4_open *open)
status = nfs_ok;
renew_client(sop->so_client);
out:
if (status && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
status = nfserr_reclaim_bad;
return status;
}

Expand Down Expand Up @@ -1688,17 +1686,11 @@ nfs4_upgrade_open(struct svc_rqst *rqstp, struct svc_fh *cur_fh, struct nfs4_sta

/* decrement seqid on successful reclaim, it will be bumped in encode_open */
static void
nfs4_set_claim_prev(struct nfsd4_open *open, int *status)
nfs4_set_claim_prev(struct nfsd4_open *open)
{
if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS) {
if (*status)
*status = nfserr_reclaim_bad;
else {
open->op_stateowner->so_confirmed = 1;
open->op_stateowner->so_client->cl_firststate = 1;
open->op_stateowner->so_seqid--;
}
}
open->op_stateowner->so_confirmed = 1;
open->op_stateowner->so_client->cl_firststate = 1;
open->op_stateowner->so_seqid--;
}

/*
Expand Down Expand Up @@ -1863,8 +1855,8 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
out:
if (fp)
put_nfs4_file(fp);
/* CLAIM_PREVIOUS has different error returns */
nfs4_set_claim_prev(open, &status);
if (status == 0 && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
nfs4_set_claim_prev(open);
/*
* To finish the open response, we just need to set the rflags.
*/
Expand Down Expand Up @@ -2738,11 +2730,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock
CHECK_FH | OPEN_STATE,
&open_sop, &open_stp,
&lock->v.new.clientid);
if (status) {
if (lock->lk_reclaim)
status = nfserr_reclaim_bad;
if (status)
goto out;
}
/* create lockowner and lock stateid */
fp = open_stp->st_file;
strhashval = lock_ownerstr_hashval(fp->fi_inode,
Expand Down

0 comments on commit 3751517

Please sign in to comment.