tree 3f79b8c23a393c119e0de31294c2843d7bd3b01e
parent 52fd004e296ac07cde820af9e3139d47dda03cf8
author NeilBrown <[EMAIL PROTECTED]> Fri, 08 Jul 2005 07:59:25 -0700
committer Linus Torvalds <[EMAIL PROTECTED]> Fri, 08 Jul 2005 08:24:10 -0700

[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 <[EMAIL PROTECTED]>
Signed-off-by: Neil Brown <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>

 fs/nfsd/nfs4state.c |   40 ++++++++++++++--------------------------
 1 files changed, 14 insertions(+), 26 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1988,14 +1988,11 @@ laundromat_main(void *not_used)
        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 *
-find_openstateowner_id(u32 st_id, int flags) {
+search_close_lru(u32 st_id, int flags)
+{
        struct nfs4_stateowner *local = NULL;
 
-       dprintk("NFSD: find_openstateowner_id %d\n", st_id);
        if (flags & CLOSE_STATE) {
                list_for_each_entry(local, &close_lru, so_close_lru) {
                        if (local->so_id == st_id)
@@ -2193,13 +2190,19 @@ nfs4_preprocess_seqid_op(struct svc_fh *
        * We return BAD_STATEID if filehandle doesn't match stateid, 
        * the confirmed flag is incorrecly set, or the generation 
        * 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)))
-               goto no_nfs4_stateid;
+       stp = find_stateid(stateid, flags);
+       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;
 
@@ -2263,21 +2266,6 @@ nfs4_preprocess_seqid_op(struct svc_fh *
 
 out:
        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:
        if (seqid == sop->so_seqid - 1) {
                printk("NFSD: preprocess_seqid_op: retransmission?\n");
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to