aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@primarydata.com>2014-07-30 08:27:17 -0400
committerJ. Bruce Fields <bfields@redhat.com>2014-08-05 10:55:04 -0400
commit7ec0e36f1a35c9c241726f6639178fafda654e09 (patch)
tree89f8dde561df816824f8dcf861b4ba23c2ba06a0
parentc96223d3b6b2794b6262d1a31d35694760cff5b2 (diff)
nfsd: add a forget_clients "get" routine with proper locking
Add a new "get" routine for forget_clients that relies on the client_lock instead of the 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.c3
-rw-r--r--fs/nfsd/nfs4state.c30
-rw-r--r--fs/nfsd/state.h4
3 files changed, 26 insertions, 11 deletions
diff --git a/fs/nfsd/fault_inject.c b/fs/nfsd/fault_inject.c
index b1159900d934..a0387fd47e14 100644
--- a/fs/nfsd/fault_inject.c
+++ b/fs/nfsd/fault_inject.c
@@ -134,11 +134,10 @@ void nfsd_fault_inject_cleanup(void)
134static struct nfsd_fault_inject_op inject_ops[] = { 134static struct nfsd_fault_inject_op inject_ops[] = {
135 { 135 {
136 .file = "forget_clients", 136 .file = "forget_clients",
137 .get = nfsd_inject_get, 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_set_client,
140 .forget = nfsd_forget_client, 140 .forget = nfsd_forget_client,
141 .print = nfsd_print_client,
142 }, 141 },
143 { 142 {
144 .file = "forget_locks", 143 .file = "forget_locks",
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 2cb559017ac9..2225e1103742 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -5723,6 +5723,28 @@ nfs4_check_open_reclaim(clientid_t *clid,
5723} 5723}
5724 5724
5725#ifdef CONFIG_NFSD_FAULT_INJECTION 5725#ifdef CONFIG_NFSD_FAULT_INJECTION
5726u64
5727nfsd_inject_print_clients(struct nfsd_fault_inject_op *op)
5728{
5729 struct nfs4_client *clp;
5730 u64 count = 0;
5731 struct nfsd_net *nn = net_generic(current->nsproxy->net_ns,
5732 nfsd_net_id);
5733 char buf[INET6_ADDRSTRLEN];
5734
5735 if (!nfsd_netns_ready(nn))
5736 return 0;
5737
5738 spin_lock(&nn->client_lock);
5739 list_for_each_entry(clp, &nn->client_lru, cl_lru) {
5740 rpc_ntop((struct sockaddr *)&clp->cl_addr, buf, sizeof(buf));
5741 pr_info("NFS Client: %s\n", buf);
5742 ++count;
5743 }
5744 spin_unlock(&nn->client_lock);
5745
5746 return count;
5747}
5726 5748
5727u64 nfsd_forget_client(struct nfs4_client *clp, u64 max) 5749u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
5728{ 5750{
@@ -5738,14 +5760,6 @@ u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
5738 return 1; 5760 return 1;
5739} 5761}
5740 5762
5741u64 nfsd_print_client(struct nfs4_client *clp, u64 num)
5742{
5743 char buf[INET6_ADDRSTRLEN];
5744 rpc_ntop((struct sockaddr *)&clp->cl_addr, buf, sizeof(buf));
5745 printk(KERN_INFO "NFS Client: %s\n", buf);
5746 return 1;
5747}
5748
5749static void nfsd_print_count(struct nfs4_client *clp, unsigned int count, 5763static void nfsd_print_count(struct nfs4_client *clp, unsigned int count,
5750 const char *type) 5764 const char *type)
5751{ 5765{
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index 0b234500f104..7c7580ea9680 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -471,18 +471,20 @@ extern void nfsd4_record_grace_done(struct nfsd_net *nn, time_t boot_time);
471 471
472/* nfs fault injection functions */ 472/* nfs fault injection functions */
473#ifdef CONFIG_NFSD_FAULT_INJECTION 473#ifdef CONFIG_NFSD_FAULT_INJECTION
474struct nfsd_fault_inject_op;
475
474int nfsd_fault_inject_init(void); 476int nfsd_fault_inject_init(void);
475void nfsd_fault_inject_cleanup(void); 477void nfsd_fault_inject_cleanup(void);
476u64 nfsd_for_n_state(u64, u64 (*)(struct nfs4_client *, u64)); 478u64 nfsd_for_n_state(u64, u64 (*)(struct nfs4_client *, u64));
477struct nfs4_client *nfsd_find_client(struct sockaddr_storage *, size_t); 479struct nfs4_client *nfsd_find_client(struct sockaddr_storage *, size_t);
478 480
481u64 nfsd_inject_print_clients(struct nfsd_fault_inject_op *op);
479u64 nfsd_forget_client(struct nfs4_client *, u64); 482u64 nfsd_forget_client(struct nfs4_client *, u64);
480u64 nfsd_forget_client_locks(struct nfs4_client*, u64); 483u64 nfsd_forget_client_locks(struct nfs4_client*, u64);
481u64 nfsd_forget_client_openowners(struct nfs4_client *, u64); 484u64 nfsd_forget_client_openowners(struct nfs4_client *, u64);
482u64 nfsd_forget_client_delegations(struct nfs4_client *, u64); 485u64 nfsd_forget_client_delegations(struct nfs4_client *, u64);
483u64 nfsd_recall_client_delegations(struct nfs4_client *, u64); 486u64 nfsd_recall_client_delegations(struct nfs4_client *, u64);
484 487
485u64 nfsd_print_client(struct nfs4_client *, u64);
486u64 nfsd_print_client_locks(struct nfs4_client *, u64); 488u64 nfsd_print_client_locks(struct nfs4_client *, u64);
487u64 nfsd_print_client_openowners(struct nfs4_client *, u64); 489u64 nfsd_print_client_openowners(struct nfs4_client *, u64);
488u64 nfsd_print_client_delegations(struct nfs4_client *, u64); 490u64 nfsd_print_client_delegations(struct nfs4_client *, u64);