diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-04-15 17:34:18 -0400 |
---|---|---|
committer | Andi Kleen <ak@linux.intel.com> | 2011-08-01 13:54:42 -0700 |
commit | 67d456fdeff3f5ee21ea788b0ce1800eba0db5cb (patch) | |
tree | 959e640ee63fd5188fe6a34145320ff592873b04 /fs | |
parent | 86b7b580a603f3ecd18e3b19e5d9dc2eb7c458dc (diff) |
NFSv4.1: Ensure state manager thread dies on last umount
commit 47c2199b6eb5fbe38ddb844db7cdbd914d304f9c upstream.
Currently, the state manager may continue to try recovering state forever
even after the last filesystem to reference that nfs_client has umounted.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4state.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 53f05ddce76..55bfe0e2afe 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -1410,7 +1410,7 @@ static void nfs4_state_manager(struct nfs_client *clp) int status = 0; /* Ensure exclusive access to NFSv4 state */ - for(;;) { + do { if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) { /* We're going to have to re-establish a clientid */ status = nfs4_reclaim_lease(clp); @@ -1493,7 +1493,7 @@ static void nfs4_state_manager(struct nfs_client *clp) break; if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) break; - } + } while (atomic_read(&clp->cl_count) > 1); return; out_error: printk(KERN_WARNING "Error: state manager failed on NFSv4 server %s" |