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

index a0387fd..5f3ead0 100644 (file)
@@ -136,7 +136,7 @@ static struct nfsd_fault_inject_op inject_ops[] = {
                .file     = "forget_clients",
                .get      = nfsd_inject_print_clients,
                .set_val  = nfsd_inject_set,
-               .set_clnt = nfsd_inject_set_client,
+               .set_clnt = nfsd_inject_forget_client,
                .forget   = nfsd_forget_client,
        },
        {
index 2225e11..c4c28f8 100644 (file)
@@ -5760,6 +5760,34 @@ u64 nfsd_forget_client(struct nfs4_client *clp, u64 max)
        return 1;
 }
 
+u64
+nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
+                         struct sockaddr_storage *addr, size_t addr_size)
+{
+       u64 count = 0;
+       struct nfs4_client *clp;
+       struct nfsd_net *nn = net_generic(current->nsproxy->net_ns,
+                                         nfsd_net_id);
+
+       if (!nfsd_netns_ready(nn))
+               return count;
+
+       spin_lock(&nn->client_lock);
+       clp = nfsd_find_client(addr, addr_size);
+       if (clp) {
+               if (mark_client_expired_locked(clp) == nfs_ok)
+                       ++count;
+               else
+                       clp = NULL;
+       }
+       spin_unlock(&nn->client_lock);
+
+       if (clp)
+               expire_client(clp);
+
+       return count;
+}
+
 static void nfsd_print_count(struct nfs4_client *clp, unsigned int count,
                             const char *type)
 {
index 7c7580e..77a1903 100644 (file)
@@ -480,6 +480,9 @@ 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_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);