nfsd4: refactor expire_client
authorBenny Halevy <bhalevy@panasas.com>
Tue, 11 May 2010 21:13:16 +0000 (00:13 +0300)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Wed, 12 May 2010 01:02:02 +0000 (21:02 -0400)
Separate out unhashing of the client and session.
To be used later by the laundromat.

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4state.c

index 3f572cb3f8961d2cda326473be82723ec886621c..dede43c373361849bf5fa2194be7f33266e0fc05 100644 (file)
@@ -693,6 +693,20 @@ free_client(struct nfs4_client *clp)
        kfree(clp);
 }
 
+/* must be called under the client_lock */
+static inline void
+unhash_client_locked(struct nfs4_client *clp)
+{
+       list_del(&clp->cl_lru);
+       while (!list_empty(&clp->cl_sessions)) {
+               struct nfsd4_session  *ses;
+               ses = list_entry(clp->cl_sessions.next, struct nfsd4_session,
+                                se_perclnt);
+               unhash_session(ses);
+               nfsd4_put_session(ses);
+       }
+}
+
 static void
 expire_client(struct nfs4_client *clp)
 {
@@ -719,21 +733,14 @@ expire_client(struct nfs4_client *clp)
                sop = list_entry(clp->cl_openowners.next, struct nfs4_stateowner, so_perclient);
                release_openowner(sop);
        }
+       nfsd4_set_callback_client(clp, NULL);
+       if (clp->cl_cb_conn.cb_xprt)
+               svc_xprt_put(clp->cl_cb_conn.cb_xprt);
        list_del(&clp->cl_idhash);
        list_del(&clp->cl_strhash);
        spin_lock(&client_lock);
-       list_del(&clp->cl_lru);
-       while (!list_empty(&clp->cl_sessions)) {
-               struct nfsd4_session  *ses;
-               ses = list_entry(clp->cl_sessions.next, struct nfsd4_session,
-                                se_perclnt);
-               unhash_session(ses);
-               nfsd4_put_session(ses);
-       }
+       unhash_client_locked(clp);
        spin_unlock(&client_lock);
-       nfsd4_set_callback_client(clp, NULL);
-       if (clp->cl_cb_conn.cb_xprt)
-               svc_xprt_put(clp->cl_cb_conn.cb_xprt);
        free_client(clp);
 }