aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@primarydata.com>2014-07-30 08:27:18 -0400
committerJ. Bruce Fields <bfields@redhat.com>2014-08-05 10:55:04 -0400
commita0926d15271a0139606d54d0521c527746e2815b (patch)
treea4f0b952e2433fe3c505f7136c63d63934b396d9
parent7ec0e36f1a35c9c241726f6639178fafda654e09 (diff)
nfsd: add a forget_client set_clnt routine
...that relies on the client_lock instead of client_mutex. Signed-off-by: Jeff Layton <jlayton@primarydata.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r--fs/nfsd/fault_inject.c2
-rw-r--r--fs/nfsd/nfs4state.c28
-rw-r--r--fs/nfsd/state.h3
3 files changed, 32 insertions, 1 deletions
diff --git a/fs/nfsd/fault_inject.c b/fs/nfsd/fault_inject.c
index a0387fd47e14..5f3ead0c72fb 100644
--- a/fs/nfsd/fault_inject.c
+++ b/fs/nfsd/fault_inject.c
@@ -136,7 +136,7 @@ static struct nfsd_fault_inject_op inject_ops[] = {
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_set,
139 .set_clnt = nfsd_inject_set_client, 139 .set_clnt = nfsd_inject_forget_client,
140 .forget = nfsd_forget_client, 140 .forget = nfsd_forget_client,
141 }, 141 },
142 { 142 {
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 2225e1103742..c4c28f8f48a1 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -5760,6 +5760,34 @@ u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
5760 return 1; 5760 return 1;
5761} 5761}
5762 5762
5763u64
5764nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
5765 struct sockaddr_storage *addr, size_t addr_size)
5766{
5767 u64 count = 0;
5768 struct nfs4_client *clp;
5769 struct nfsd_net *nn = net_generic(current->nsproxy->net_ns,
5770 nfsd_net_id);
5771
5772 if (!nfsd_netns_ready(nn))
5773 return count;
5774
5775 spin_lock(&nn->client_lock);
5776 clp = nfsd_find_client(addr, addr_size);
5777 if (clp) {
5778 if (mark_client_expired_locked(clp) == nfs_ok)
5779 ++count;
5780 else
5781 clp = NULL;
5782 }
5783 spin_unlock(&nn->client_lock);
5784
5785 if (clp)
5786 expire_client(clp);
5787
5788 return count;
5789}
5790
5763static void nfsd_print_count(struct nfs4_client *clp, unsigned int count, 5791static void nfsd_print_count(struct nfs4_client *clp, unsigned int count,
5764 const char *type) 5792 const char *type)
5765{ 5793{
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index 7c7580ea9680..77a1903d58ab 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -480,6 +480,9 @@ struct 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); 482u64 nfsd_forget_client(struct nfs4_client *, u64);
483u64 nfsd_inject_forget_client(struct nfsd_fault_inject_op *,
484 struct sockaddr_storage *, size_t);
485
483u64 nfsd_forget_client_locks(struct nfs4_client*, u64); 486u64 nfsd_forget_client_locks(struct nfs4_client*, u64);
484u64 nfsd_forget_client_openowners(struct nfs4_client *, u64); 487u64 nfsd_forget_client_openowners(struct nfs4_client *, u64);
485u64 nfsd_forget_client_delegations(struct nfs4_client *, u64); 488u64 nfsd_forget_client_delegations(struct nfs4_client *, u64);