nfsd: add nfsd_inject_forget_clients

...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>
This commit is contained in:
Jeff Layton 2014-07-30 08:27:19 -04:00 committed by J. Bruce Fields
parent a0926d1527
commit 69fc9edf98
3 changed files with 30 additions and 17 deletions

View File

@ -135,9 +135,8 @@ static struct nfsd_fault_inject_op inject_ops[] = {
{ {
.file = "forget_clients", .file = "forget_clients",
.get = nfsd_inject_print_clients, .get = nfsd_inject_print_clients,
.set_val = nfsd_inject_set, .set_val = nfsd_inject_forget_clients,
.set_clnt = nfsd_inject_forget_client, .set_clnt = nfsd_inject_forget_client,
.forget = nfsd_forget_client,
}, },
{ {
.file = "forget_locks", .file = "forget_locks",

View File

@ -5746,20 +5746,6 @@ nfsd_inject_print_clients(struct nfsd_fault_inject_op *op)
return count; 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 u64
nfsd_inject_forget_client(struct nfsd_fault_inject_op *op, nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
struct sockaddr_storage *addr, size_t addr_size) struct sockaddr_storage *addr, size_t addr_size)
@ -5788,6 +5774,34 @@ nfsd_inject_forget_client(struct nfsd_fault_inject_op *op,
return count; 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, static void nfsd_print_count(struct nfs4_client *clp, unsigned int count,
const char *type) const char *type)
{ {

View 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); struct nfs4_client *nfsd_find_client(struct sockaddr_storage *, size_t);
u64 nfsd_inject_print_clients(struct nfsd_fault_inject_op *op); 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 *, u64 nfsd_inject_forget_client(struct nfsd_fault_inject_op *,
struct sockaddr_storage *, size_t); 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_locks(struct nfs4_client*, u64);
u64 nfsd_forget_client_openowners(struct nfs4_client *, u64); u64 nfsd_forget_client_openowners(struct nfs4_client *, u64);