[PATCH] nfsd4: stop overusing RECLAIM_BAD
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>
This commit is contained in:
Родитель
0dd395dc76
Коммит
3751517731
|
@ -1531,8 +1531,6 @@ renew:
|
||||||
status = nfs_ok;
|
status = nfs_ok;
|
||||||
renew_client(sop->so_client);
|
renew_client(sop->so_client);
|
||||||
out:
|
out:
|
||||||
if (status && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
|
|
||||||
status = nfserr_reclaim_bad;
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
/* decrement seqid on successful reclaim, it will be bumped in encode_open */
|
||||||
static void
|
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) {
|
open->op_stateowner->so_confirmed = 1;
|
||||||
if (*status)
|
open->op_stateowner->so_client->cl_firststate = 1;
|
||||||
*status = nfserr_reclaim_bad;
|
open->op_stateowner->so_seqid--;
|
||||||
else {
|
|
||||||
open->op_stateowner->so_confirmed = 1;
|
|
||||||
open->op_stateowner->so_client->cl_firststate = 1;
|
|
||||||
open->op_stateowner->so_seqid--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1863,8 +1855,8 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
|
||||||
out:
|
out:
|
||||||
if (fp)
|
if (fp)
|
||||||
put_nfs4_file(fp);
|
put_nfs4_file(fp);
|
||||||
/* CLAIM_PREVIOUS has different error returns */
|
if (status == 0 && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
|
||||||
nfs4_set_claim_prev(open, &status);
|
nfs4_set_claim_prev(open);
|
||||||
/*
|
/*
|
||||||
* To finish the open response, we just need to set the rflags.
|
* To finish the open response, we just need to set the rflags.
|
||||||
*/
|
*/
|
||||||
|
@ -2738,11 +2730,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock
|
||||||
CHECK_FH | OPEN_STATE,
|
CHECK_FH | OPEN_STATE,
|
||||||
&open_sop, &open_stp,
|
&open_sop, &open_stp,
|
||||||
&lock->v.new.clientid);
|
&lock->v.new.clientid);
|
||||||
if (status) {
|
if (status)
|
||||||
if (lock->lk_reclaim)
|
|
||||||
status = nfserr_reclaim_bad;
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
/* create lockowner and lock stateid */
|
/* create lockowner and lock stateid */
|
||||||
fp = open_stp->st_file;
|
fp = open_stp->st_file;
|
||||||
strhashval = lock_ownerstr_hashval(fp->fi_inode,
|
strhashval = lock_ownerstr_hashval(fp->fi_inode,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче