nfsd: add a forget_clients "get" routine with proper locking
authorJeff Layton <jlayton@primarydata.com>
Wed, 30 Jul 2014 12:27:17 +0000 (08:27 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 5 Aug 2014 14:55:04 +0000 (10:55 -0400)
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>
fs/nfsd/fault_inject.c
fs/nfsd/nfs4state.c
fs/nfsd/state.h

index b115990..a0387fd 100644 (file)
@@ -134,11 +134,10 @@ void nfsd_fault_inject_cleanup(void)
 static struct nfsd_fault_inject_op inject_ops[] = {
        {
                .file     = "forget_clients",
-               .get      = nfsd_inject_get,
+               .get      = nfsd_inject_print_clients,
                .set_val  = nfsd_inject_set,
                .set_clnt = nfsd_inject_set_client,
                .forget   = nfsd_forget_client,
-               .print    = nfsd_print_client,
        },
        {
                .file     = "forget_locks",
index 2cb5590..2225e11 100644 (file)
@@ -5723,6 +5723,28 @@ nfs4_check_open_reclaim(clientid_t *clid,
 }
 
 #ifdef CONFIG_NFSD_FAULT_INJECTION
+u64
+nfsd_inject_print_clients(struct nfsd_fault_inject_op *op)
+{
+       struct nfs4_client *clp;
+       u64 count = 0;
+       struct nfsd_net *nn = net_generic(current->nsproxy->net_ns,
+                                         nfsd_net_id);
+       char buf[INET6_ADDRSTRLEN];
+
+       if (!nfsd_netns_ready(nn))
+               return 0;
+
+       spin_lock(&nn->client_lock);
+       list_for_each_entry(clp, &nn->client_lru, cl_lru) {
+               rpc_ntop((struct sockaddr *)&clp->cl_addr, buf, sizeof(buf));
+               pr_info("NFS Client: %s\n", buf);
+               ++count;
+       }
+       spin_unlock(&nn->client_lock);
+
+       return count;
+}
 
 u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
 {
@@ -5738,14 +5760,6 @@ u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
        return 1;
 }
 
-u64 nfsd_print_client(struct nfs4_client *clp, u64 num)
-{
-       char buf[INET6_ADDRSTRLEN];
-       rpc_ntop((struct sockaddr *)&clp->cl_addr, buf, sizeof(buf));
-       printk(KERN_INFO "NFS Client: %s\n", buf);
-       return 1;
-}
-
 static void nfsd_print_count(struct nfs4_client *clp, unsigned int count,
                             const char *type)
 {
index 0b23450..7c7580e 100644 (file)
@@ -471,18 +471,20 @@ extern void nfsd4_record_grace_done(struct nfsd_net *nn, time_t boot_time);
 
 /* nfs fault injection functions */
 #ifdef CONFIG_NFSD_FAULT_INJECTION
+struct nfsd_fault_inject_op;
+
 int nfsd_fault_inject_init(void);
 void nfsd_fault_inject_cleanup(void);
 u64 nfsd_for_n_state(u64, u64 (*)(struct nfs4_client *, u64));
 struct nfs4_client *nfsd_find_client(struct sockaddr_storage *, size_t);
 
+u64 nfsd_inject_print_clients(struct nfsd_fault_inject_op *op);
 u64 nfsd_forget_client(struct nfs4_client *, u64);
 u64 nfsd_forget_client_locks(struct nfs4_client*, u64);
 u64 nfsd_forget_client_openowners(struct nfs4_client *, u64);
 u64 nfsd_forget_client_delegations(struct nfs4_client *, u64);
 u64 nfsd_recall_client_delegations(struct nfs4_client *, u64);
 
-u64 nfsd_print_client(struct nfs4_client *, u64);
 u64 nfsd_print_client_locks(struct nfs4_client *, u64);
 u64 nfsd_print_client_openowners(struct nfs4_client *, u64);
 u64 nfsd_print_client_delegations(struct nfs4_client *, u64);