nfsd4: probe callback channel only once
authorJ. Bruce Fields <bfields@citi.umich.edu>
Thu, 22 Nov 2007 18:54:18 +0000 (13:54 -0500)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Fri, 1 Feb 2008 21:42:01 +0000 (16:42 -0500)
Our callback code doesn't actually handle concurrent attempts to probe
the callback channel.  Some rethinking of the locking may be required.
However, we can also just move the callback probing to this case.  Since
this is the only time a client is "confirmed" (and since that can only
happen once in the lifetime of a client), this ensures we only probe
once.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4callback.c
fs/nfsd/nfs4state.c

index 9d536a8cb3795651551af7b228407a09d890f7b7..a9735a672963fca4ffb9ca84b9e7920b8cf6192f 100644 (file)
@@ -395,8 +395,7 @@ nfsd4_probe_callback(struct nfs4_client *clp)
        };
        struct task_struct *t;
 
-       if (atomic_read(&cb->cb_set))
-               return;
+       BUG_ON(atomic_read(&clp->cl_callback.cb_set));
 
        /* Initialize address */
        memset(&addr, 0, sizeof(addr));
index 31673cd251c3c2936b99e566a34773f5a0dce0c1..9d81c7117ae653d3717e0885f75090d1a43478e2 100644 (file)
@@ -948,6 +948,7 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
                        }
                        move_to_confirmed(unconf);
                        conf = unconf;
+                       nfsd4_probe_callback(conf);
                        status = nfs_ok;
                }
        } else if ((!conf || (conf && !same_verf(&conf->cl_confirm, &confirm)))
@@ -965,8 +966,6 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
                status = nfserr_clid_inuse;
        }
 out:
-       if (!status)
-               nfsd4_probe_callback(conf);
        nfs4_unlock_state();
        return status;
 }