diff options
| -rw-r--r-- | fs/nfsd/fault_inject.c | 13 | ||||
| -rw-r--r-- | fs/nfsd/nfs4state.c | 42 | ||||
| -rw-r--r-- | fs/nfsd/state.h | 5 | 
3 files changed, 58 insertions, 2 deletions
diff --git a/fs/nfsd/fault_inject.c b/fs/nfsd/fault_inject.c index bf6161adf66..545f8e4ed10 100644 --- a/fs/nfsd/fault_inject.c +++ b/fs/nfsd/fault_inject.c @@ -14,28 +14,34 @@  struct nfsd_fault_inject_op {  	char *file;  	u64 (*forget)(struct nfs4_client *, u64); +	u64 (*print)(struct nfs4_client *, u64);  };  static struct nfsd_fault_inject_op inject_ops[] = {  	{  		.file   = "forget_clients",  		.forget = nfsd_forget_client, +		.print  = nfsd_print_client,  	},  	{  		.file   = "forget_locks",  		.forget = nfsd_forget_client_locks, +		.print  = nfsd_print_client_locks,  	},  	{  		.file   = "forget_openowners",  		.forget = nfsd_forget_client_openowners, +		.print  = nfsd_print_client_openowners,  	},  	{  		.file   = "forget_delegations",  		.forget = nfsd_forget_client_delegations, +		.print  = nfsd_print_client_delegations,  	},  	{  		.file   = "recall_delegations",  		.forget = nfsd_recall_client_delegations, +		.print  = nfsd_print_client_delegations,  	},  }; @@ -59,9 +65,12 @@ static int nfsd_inject_set(void *op_ptr, u64 val)  	return 0;  } -static int nfsd_inject_get(void *data, u64 *val) +static int nfsd_inject_get(void *op_ptr, u64 *val)  { -	*val = 0; +	struct nfsd_fault_inject_op *op = op_ptr; +	nfs4_lock_state(); +	*val = nfsd_for_n_state(0, op->print); +	nfs4_unlock_state();  	return 0;  } diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index ab45cdd7b3d..9fb8e52580f 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -4611,6 +4611,22 @@ 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, 129); +	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) +{ +	char buf[INET6_ADDRSTRLEN]; +	rpc_ntop((struct sockaddr *)&clp->cl_addr, buf, 129); +	printk(KERN_INFO "NFS Client: %s has %u %s\n", buf, count, type); +} +  static u64 nfsd_foreach_client_lock(struct nfs4_client *clp, u64 max, void (*func)(struct nfs4_lockowner *))  {  	struct nfs4_openowner *oop; @@ -4637,6 +4653,13 @@ u64 nfsd_forget_client_locks(struct nfs4_client *clp, u64 max)  	return nfsd_foreach_client_lock(clp, max, release_lockowner);  } +u64 nfsd_print_client_locks(struct nfs4_client *clp, u64 max) +{ +	u64 count = nfsd_foreach_client_lock(clp, max, NULL); +	nfsd_print_count(clp, count, "locked files"); +	return count; +} +  static u64 nfsd_foreach_client_open(struct nfs4_client *clp, u64 max, void (*func)(struct nfs4_openowner *))  {  	struct nfs4_openowner *oop, *next; @@ -4657,6 +4680,13 @@ u64 nfsd_forget_client_openowners(struct nfs4_client *clp, u64 max)  	return nfsd_foreach_client_open(clp, max, release_openowner);  } +u64 nfsd_print_client_openowners(struct nfs4_client *clp, u64 max) +{ +	u64 count = nfsd_foreach_client_open(clp, max, NULL); +	nfsd_print_count(clp, count, "open files"); +	return count; +} +  static u64 nfsd_find_all_delegations(struct nfs4_client *clp, u64 max,  				     struct list_head *victims)  { @@ -4703,6 +4733,18 @@ u64 nfsd_recall_client_delegations(struct nfs4_client *clp, u64 max)  	return count;  } +u64 nfsd_print_client_delegations(struct nfs4_client *clp, u64 max) +{ +	u64 count = 0; + +	spin_lock(&recall_lock); +	count = nfsd_find_all_delegations(clp, max, NULL); +	spin_unlock(&recall_lock); + +	nfsd_print_count(clp, count, "delegations"); +	return count; +} +  u64 nfsd_for_n_state(u64 max, u64 (*func)(struct nfs4_client *, u64))  {  	struct nfs4_client *clp, *next; diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index 423ac64ceb7..4017f3553a6 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -508,6 +508,11 @@ 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);  #else /* CONFIG_NFSD_FAULT_INJECTION */  static inline int nfsd_fault_inject_init(void) { return 0; }  static inline void nfsd_fault_inject_cleanup(void) {}  |