[PATCH] nfsd4: clarify close_lru handling
The handling of close_lru in preprocess_stateid_op was a source of some confusion here recently. Try to make the logic a little clearer, by renaming find_openstateowner_id to make its purpose clearer and untangling some unnecessarily complicated goto's. 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:
parent
52fd004e29
commit
f8816512fc
|
@ -1988,14 +1988,11 @@ laundromat_main(void *not_used)
|
||||||
queue_delayed_work(laundry_wq, &laundromat_work, t*HZ);
|
queue_delayed_work(laundry_wq, &laundromat_work, t*HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* search ownerid_hashtbl[] and close_lru for stateid owner
|
|
||||||
* (stateid->si_stateownerid)
|
|
||||||
*/
|
|
||||||
static struct nfs4_stateowner *
|
static struct nfs4_stateowner *
|
||||||
find_openstateowner_id(u32 st_id, int flags) {
|
search_close_lru(u32 st_id, int flags)
|
||||||
|
{
|
||||||
struct nfs4_stateowner *local = NULL;
|
struct nfs4_stateowner *local = NULL;
|
||||||
|
|
||||||
dprintk("NFSD: find_openstateowner_id %d\n", st_id);
|
|
||||||
if (flags & CLOSE_STATE) {
|
if (flags & CLOSE_STATE) {
|
||||||
list_for_each_entry(local, &close_lru, so_close_lru) {
|
list_for_each_entry(local, &close_lru, so_close_lru) {
|
||||||
if (local->so_id == st_id)
|
if (local->so_id == st_id)
|
||||||
|
@ -2193,13 +2190,19 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
|
||||||
* We return BAD_STATEID if filehandle doesn't match stateid,
|
* We return BAD_STATEID if filehandle doesn't match stateid,
|
||||||
* the confirmed flag is incorrecly set, or the generation
|
* the confirmed flag is incorrecly set, or the generation
|
||||||
* number is incorrect.
|
* number is incorrect.
|
||||||
* If there is no entry in the openfile table for this id,
|
|
||||||
* we can't always return BAD_STATEID;
|
|
||||||
* this might be a retransmitted CLOSE which has arrived after
|
|
||||||
* the openfile has been released.
|
|
||||||
*/
|
*/
|
||||||
if (!(stp = find_stateid(stateid, flags)))
|
stp = find_stateid(stateid, flags);
|
||||||
goto no_nfs4_stateid;
|
if (stp == NULL) {
|
||||||
|
/*
|
||||||
|
* Also, we should make sure this isn't just the result of
|
||||||
|
* a replayed close:
|
||||||
|
*/
|
||||||
|
sop = search_close_lru(stateid->si_stateownerid, flags);
|
||||||
|
if (sop == NULL)
|
||||||
|
return nfserr_bad_stateid;
|
||||||
|
*sopp = sop;
|
||||||
|
goto check_replay;
|
||||||
|
}
|
||||||
|
|
||||||
status = nfserr_bad_stateid;
|
status = nfserr_bad_stateid;
|
||||||
|
|
||||||
|
@ -2263,21 +2266,6 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
no_nfs4_stateid:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We determine whether this is a bad stateid or a replay,
|
|
||||||
* starting by trying to look up the stateowner.
|
|
||||||
* If stateowner is not found - stateid is bad.
|
|
||||||
*/
|
|
||||||
if (!(sop = find_openstateowner_id(stateid->si_stateownerid, flags))) {
|
|
||||||
printk("NFSD: preprocess_seqid_op: no stateowner or nfs4_stateid!\n");
|
|
||||||
status = nfserr_bad_stateid;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
*sopp = sop;
|
|
||||||
|
|
||||||
check_replay:
|
check_replay:
|
||||||
if (seqid == sop->so_seqid - 1) {
|
if (seqid == sop->so_seqid - 1) {
|
||||||
printk("NFSD: preprocess_seqid_op: retransmission?\n");
|
printk("NFSD: preprocess_seqid_op: retransmission?\n");
|
||||||
|
|
Loading…
Reference in New Issue