aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJeff Layton <jlayton@primarydata.com>2014-07-30 08:27:19 -0400
committerJ. Bruce Fields <bfields@redhat.com>2014-08-05 10:55:05 -0400
commit69fc9edf987ca451831575b1e5450a9fe49fbfe0 (patch)
tree862e96ba621daf5a341706d0101c965e8907585d /fs
parenta0926d15271a0139606d54d0521c527746e2815b (diff)
nfsd: add nfsd_inject_forget_clients
...which uses the client_lock for protection instead of client_mutex. Also remove nfsd_forget_client as there are no more callers. Signed-off-by: Jeff Layton <jlayton@primarydata.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/fault_inject.c3
-rw-r--r--fs/nfsd/nfs4state.c42
-rw-r--r--fs/nfsd/state.h2
3 files changed, 30 insertions, 17 deletions
diff --git a/fs/nfsd/fault_inject.c b/fs/nfsd/fault_inject.c
index 5f3ead0c72fb..76ecdff37ea2 100644
--- a/fs/nfsd/fault_inject.c
+++ b/fs/nfsd/fault_inject.c
@@ -135,9 +135,8 @@ static struct nfsd_fault_inject_op inject_ops[] = {
135 { 135 {
136 .file = "forget_clients", 136 .file = "forget_clients",
137 .get = nfsd_inject_print_clients, 137 .get = nfsd_inject_print_clients,
138 .set_val = nfsd_inject_set, 138 .set_val = nfsd_inject_forget_clients,
139 .set_clnt = nfsd_inject_forget_client, 139 .set_clnt = nfsd_inject_forget_client,
140 .forget = nfsd_forget_client,
141 }, 140 },
142 { 141 {
143 .file = "forget_locks", 142 .file = "forget_locks",
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index c4c28f8f48a1..226d89e2c7b2 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -5746,20 +5746,6 @@ nfsd_inject_print_clients(struct nfsd_fault_inject_op *op)
5746 return count; 5746 return count;
5747} 5747}
5748 5748
5749u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
5750{
5751 __be32 ret;
5752 struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
5753
5754 spin_lock(&nn->client_lock);
5755 ret = mark_client_expired_locked(clp);
5756 spin_unlock(&nn->client_lock);
5757 if (ret != nfs_ok)
5758 return 0;
5759 expire_client(clp);
5760 return 1;
5761}
5762
5763u64 5749u64
5764nfsd_inject_forget_client(struct nfsd_fault_inject_op *op, 5750nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
5765 struct sockaddr_storage *addr, size_t addr_size) 5751 struct sockaddr_storage *addr, size_t addr_size)
@@ -5788,6 +5774,34 @@ nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
5788 return count; 5774 return count;
5789} 5775}
5790 5776
5777u64
5778nfsd_inject_forget_clients(struct nfsd_fault_inject_op *op, u64 max)
5779{
5780 u64 count = 0;
5781 struct nfs4_client *clp, *next;
5782 struct nfsd_net *nn = net_generic(current->nsproxy->net_ns,
5783 nfsd_net_id);
5784 LIST_HEAD(reaplist);
5785
5786 if (!nfsd_netns_ready(nn))
5787 return count;
5788
5789 spin_lock(&nn->client_lock);
5790 list_for_each_entry_safe(clp, next, &nn->client_lru, cl_lru) {
5791 if (mark_client_expired_locked(clp) == nfs_ok) {
5792 list_add(&clp->cl_lru, &reaplist);
5793 if (max != 0 && ++count >= max)
5794 break;
5795 }
5796 }
5797 spin_unlock(&nn->client_lock);
5798
5799 list_for_each_entry_safe(clp, next, &reaplist, cl_lru)
5800 expire_client(clp);
5801
5802 return count;
5803}
5804
5791static void nfsd_print_count(struct nfs4_client *clp, unsigned int count, 5805static void nfsd_print_count(struct nfs4_client *clp, unsigned int count,
5792 const char *type) 5806 const char *type)
5793{ 5807{
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index 77a1903d58ab..eb3b35a74795 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -479,9 +479,9 @@ u64 nfsd_for_n_state(u64, u64 (*)(struct nfs4_client *, u64));
479struct nfs4_client *nfsd_find_client(struct sockaddr_storage *, size_t); 479struct nfs4_client *nfsd_find_client(struct sockaddr_storage *, size_t);
480 480
481u64 nfsd_inject_print_clients(struct nfsd_fault_inject_op *op); 481u64 nfsd_inject_print_clients(struct nfsd_fault_inject_op *op);
482u64 nfsd_forget_client(struct nfs4_client *, u64);
483u64 nfsd_inject_forget_client(struct nfsd_fault_inject_op *, 482u64 nfsd_inject_forget_client(struct nfsd_fault_inject_op *,
484 struct sockaddr_storage *, size_t); 483 struct sockaddr_storage *, size_t);
484u64 nfsd_inject_forget_clients(struct nfsd_fault_inject_op *, u64);
485 485
486u64 nfsd_forget_client_locks(struct nfs4_client*, u64); 486u64 nfsd_forget_client_locks(struct nfs4_client*, u64);
487u64 nfsd_forget_client_openowners(struct nfs4_client *, u64); 487u64 nfsd_forget_client_openowners(struct nfs4_client *, u64);