nfsd: add nfsd_inject_forget_clients
authorJeff Layton <jlayton@primarydata.com>
Wed, 30 Jul 2014 12:27:19 +0000 (08:27 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 5 Aug 2014 14:55:05 +0000 (10:55 -0400)
...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>
fs/nfsd/fault_inject.c
fs/nfsd/nfs4state.c
fs/nfsd/state.h

index 5f3ead0c72fb45e9fdc322b68ed41208c7e6e06c..76ecdff37ea288239b79654e7ec87183e3325f1d 100644 (file)
@@ -135,9 +135,8 @@ static struct nfsd_fault_inject_op inject_ops[] = {
        {
                .file     = "forget_clients",
                .get      = nfsd_inject_print_clients,
-               .set_val  = nfsd_inject_set,
+               .set_val  = nfsd_inject_forget_clients,
                .set_clnt = nfsd_inject_forget_client,
-               .forget   = nfsd_forget_client,
        },
        {
                .file     = "forget_locks",
index c4c28f8f48a1bd8a3b5bed43837bf88669d25453..226d89e2c7b29404fbeae3f1ed712f5856a7dd38 100644 (file)
@@ -5746,20 +5746,6 @@ nfsd_inject_print_clients(struct nfsd_fault_inject_op *op)
        return count;
 }
 
-u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
-{
-       __be32 ret;
-       struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
-
-       spin_lock(&nn->client_lock);
-       ret = mark_client_expired_locked(clp);
-       spin_unlock(&nn->client_lock);
-       if (ret != nfs_ok)
-               return 0;
-       expire_client(clp);
-       return 1;
-}
-
 u64
 nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
                          struct sockaddr_storage *addr, size_t addr_size)
@@ -5788,6 +5774,34 @@ nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
        return count;
 }
 
+u64
+nfsd_inject_forget_clients(struct nfsd_fault_inject_op *op, u64 max)
+{
+       u64 count = 0;
+       struct nfs4_client *clp, *next;
+       struct nfsd_net *nn = net_generic(current->nsproxy->net_ns,
+                                               nfsd_net_id);
+       LIST_HEAD(reaplist);
+
+       if (!nfsd_netns_ready(nn))
+               return count;
+
+       spin_lock(&nn->client_lock);
+       list_for_each_entry_safe(clp, next, &nn->client_lru, cl_lru) {
+               if (mark_client_expired_locked(clp) == nfs_ok) {
+                       list_add(&clp->cl_lru, &reaplist);
+                       if (max != 0 && ++count >= max)
+                               break;
+               }
+       }
+       spin_unlock(&nn->client_lock);
+
+       list_for_each_entry_safe(clp, next, &reaplist, cl_lru)
+               expire_client(clp);
+
+       return count;
+}
+
 static void nfsd_print_count(struct nfs4_client *clp, unsigned int count,
                             const char *type)
 {
index 77a1903d58ab1f3da9067c247bf42005b7ba8555..eb3b35a747955a099ec38b37bb2fd7bd89cbee9c 100644 (file)
@@ -479,9 +479,9 @@ 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_inject_forget_client(struct nfsd_fault_inject_op *,
                              struct sockaddr_storage *, size_t);
+u64 nfsd_inject_forget_clients(struct nfsd_fault_inject_op *, u64);
 
 u64 nfsd_forget_client_locks(struct nfs4_client*, u64);
 u64 nfsd_forget_client_openowners(struct nfs4_client *, u64);