nfsd: don't destroy clients that are busy
authorJeff Layton <jlayton@primarydata.com>
Wed, 30 Jul 2014 12:27:14 +0000 (08:27 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 5 Aug 2014 14:55:01 +0000 (10:55 -0400)
It's possible that we'll have an in-progress call on some of the clients
while a rogue EXCHANGE_ID or DESTROY_CLIENTID call comes in. Be sure to
try and mark the client expired first, so that the refcount is
respected.

This will only be a problem once the client_mutex is removed.

Signed-off-by: Jeff Layton <jlayton@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index 028ae55e5f7a9e8a2a3346f0b74360057691caa8..037bb924ce63623cc0b90aa97a9e215b8b6aa4c7 100644 (file)
@@ -2267,8 +2267,11 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
 
        /* case 1 (normal case) */
 out_new:
-       if (conf)
-               unhash_client_locked(conf);
+       if (conf) {
+               status = mark_client_expired_locked(conf);
+               if (status)
+                       goto out;
+       }
        new->cl_minorversion = cstate->minorversion;
        new->cl_mach_cred = (exid->spa_how == SP4_MACH_CRED);
 
@@ -2881,6 +2884,9 @@ nfsd4_destroy_clientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *csta
                        status = nfserr_clientid_busy;
                        goto out;
                }
+               status = mark_client_expired_locked(conf);
+               if (status)
+                       goto out;
                clp = conf;
        } else if (unconf)
                clp = unconf;