diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r-- | fs/nfsd/nfs4state.c | 87 |
1 files changed, 33 insertions, 54 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index d18bbb1e334d..90aa953420b6 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -5729,8 +5729,25 @@ put_client(struct nfs4_client *clp) | |||
5729 | atomic_dec(&clp->cl_refcount); | 5729 | atomic_dec(&clp->cl_refcount); |
5730 | } | 5730 | } |
5731 | 5731 | ||
5732 | static struct nfs4_client * | ||
5733 | nfsd_find_client(struct sockaddr_storage *addr, size_t addr_size) | ||
5734 | { | ||
5735 | struct nfs4_client *clp; | ||
5736 | struct nfsd_net *nn = net_generic(current->nsproxy->net_ns, | ||
5737 | nfsd_net_id); | ||
5738 | |||
5739 | if (!nfsd_netns_ready(nn)) | ||
5740 | return NULL; | ||
5741 | |||
5742 | list_for_each_entry(clp, &nn->client_lru, cl_lru) { | ||
5743 | if (memcmp(&clp->cl_addr, addr, addr_size) == 0) | ||
5744 | return clp; | ||
5745 | } | ||
5746 | return NULL; | ||
5747 | } | ||
5748 | |||
5732 | u64 | 5749 | u64 |
5733 | nfsd_inject_print_clients(struct nfsd_fault_inject_op *op) | 5750 | nfsd_inject_print_clients(void) |
5734 | { | 5751 | { |
5735 | struct nfs4_client *clp; | 5752 | struct nfs4_client *clp; |
5736 | u64 count = 0; | 5753 | u64 count = 0; |
@@ -5753,8 +5770,7 @@ nfsd_inject_print_clients(struct nfsd_fault_inject_op *op) | |||
5753 | } | 5770 | } |
5754 | 5771 | ||
5755 | u64 | 5772 | u64 |
5756 | nfsd_inject_forget_client(struct nfsd_fault_inject_op *op, | 5773 | nfsd_inject_forget_client(struct sockaddr_storage *addr, size_t addr_size) |
5757 | struct sockaddr_storage *addr, size_t addr_size) | ||
5758 | { | 5774 | { |
5759 | u64 count = 0; | 5775 | u64 count = 0; |
5760 | struct nfs4_client *clp; | 5776 | struct nfs4_client *clp; |
@@ -5781,7 +5797,7 @@ nfsd_inject_forget_client(struct nfsd_fault_inject_op *op, | |||
5781 | } | 5797 | } |
5782 | 5798 | ||
5783 | u64 | 5799 | u64 |
5784 | nfsd_inject_forget_clients(struct nfsd_fault_inject_op *op, u64 max) | 5800 | nfsd_inject_forget_clients(u64 max) |
5785 | { | 5801 | { |
5786 | u64 count = 0; | 5802 | u64 count = 0; |
5787 | struct nfs4_client *clp, *next; | 5803 | struct nfs4_client *clp, *next; |
@@ -5888,7 +5904,7 @@ nfsd_print_client_locks(struct nfs4_client *clp) | |||
5888 | } | 5904 | } |
5889 | 5905 | ||
5890 | u64 | 5906 | u64 |
5891 | nfsd_inject_print_locks(struct nfsd_fault_inject_op *op) | 5907 | nfsd_inject_print_locks(void) |
5892 | { | 5908 | { |
5893 | struct nfs4_client *clp; | 5909 | struct nfs4_client *clp; |
5894 | u64 count = 0; | 5910 | u64 count = 0; |
@@ -5921,8 +5937,7 @@ nfsd_reap_locks(struct list_head *reaplist) | |||
5921 | } | 5937 | } |
5922 | 5938 | ||
5923 | u64 | 5939 | u64 |
5924 | nfsd_inject_forget_client_locks(struct nfsd_fault_inject_op *op, | 5940 | nfsd_inject_forget_client_locks(struct sockaddr_storage *addr, size_t addr_size) |
5925 | struct sockaddr_storage *addr, size_t addr_size) | ||
5926 | { | 5941 | { |
5927 | unsigned int count = 0; | 5942 | unsigned int count = 0; |
5928 | struct nfs4_client *clp; | 5943 | struct nfs4_client *clp; |
@@ -5943,7 +5958,7 @@ nfsd_inject_forget_client_locks(struct nfsd_fault_inject_op *op, | |||
5943 | } | 5958 | } |
5944 | 5959 | ||
5945 | u64 | 5960 | u64 |
5946 | nfsd_inject_forget_locks(struct nfsd_fault_inject_op *op, u64 max) | 5961 | nfsd_inject_forget_locks(u64 max) |
5947 | { | 5962 | { |
5948 | u64 count = 0; | 5963 | u64 count = 0; |
5949 | struct nfs4_client *clp; | 5964 | struct nfs4_client *clp; |
@@ -6020,7 +6035,7 @@ nfsd_collect_client_openowners(struct nfs4_client *clp, | |||
6020 | } | 6035 | } |
6021 | 6036 | ||
6022 | u64 | 6037 | u64 |
6023 | nfsd_inject_print_openowners(struct nfsd_fault_inject_op *op) | 6038 | nfsd_inject_print_openowners(void) |
6024 | { | 6039 | { |
6025 | struct nfs4_client *clp; | 6040 | struct nfs4_client *clp; |
6026 | u64 count = 0; | 6041 | u64 count = 0; |
@@ -6053,8 +6068,8 @@ nfsd_reap_openowners(struct list_head *reaplist) | |||
6053 | } | 6068 | } |
6054 | 6069 | ||
6055 | u64 | 6070 | u64 |
6056 | nfsd_inject_forget_client_openowners(struct nfsd_fault_inject_op *op, | 6071 | nfsd_inject_forget_client_openowners(struct sockaddr_storage *addr, |
6057 | struct sockaddr_storage *addr, size_t addr_size) | 6072 | size_t addr_size) |
6058 | { | 6073 | { |
6059 | unsigned int count = 0; | 6074 | unsigned int count = 0; |
6060 | struct nfs4_client *clp; | 6075 | struct nfs4_client *clp; |
@@ -6075,7 +6090,7 @@ nfsd_inject_forget_client_openowners(struct nfsd_fault_inject_op *op, | |||
6075 | } | 6090 | } |
6076 | 6091 | ||
6077 | u64 | 6092 | u64 |
6078 | nfsd_inject_forget_openowners(struct nfsd_fault_inject_op *op, u64 max) | 6093 | nfsd_inject_forget_openowners(u64 max) |
6079 | { | 6094 | { |
6080 | u64 count = 0; | 6095 | u64 count = 0; |
6081 | struct nfs4_client *clp; | 6096 | struct nfs4_client *clp; |
@@ -6149,7 +6164,7 @@ nfsd_print_client_delegations(struct nfs4_client *clp) | |||
6149 | } | 6164 | } |
6150 | 6165 | ||
6151 | u64 | 6166 | u64 |
6152 | nfsd_inject_print_delegations(struct nfsd_fault_inject_op *op) | 6167 | nfsd_inject_print_delegations(void) |
6153 | { | 6168 | { |
6154 | struct nfs4_client *clp; | 6169 | struct nfs4_client *clp; |
6155 | u64 count = 0; | 6170 | u64 count = 0; |
@@ -6182,8 +6197,8 @@ nfsd_forget_delegations(struct list_head *reaplist) | |||
6182 | } | 6197 | } |
6183 | 6198 | ||
6184 | u64 | 6199 | u64 |
6185 | nfsd_inject_forget_client_delegations(struct nfsd_fault_inject_op *op, | 6200 | nfsd_inject_forget_client_delegations(struct sockaddr_storage *addr, |
6186 | struct sockaddr_storage *addr, size_t addr_size) | 6201 | size_t addr_size) |
6187 | { | 6202 | { |
6188 | u64 count = 0; | 6203 | u64 count = 0; |
6189 | struct nfs4_client *clp; | 6204 | struct nfs4_client *clp; |
@@ -6205,7 +6220,7 @@ nfsd_inject_forget_client_delegations(struct nfsd_fault_inject_op *op, | |||
6205 | } | 6220 | } |
6206 | 6221 | ||
6207 | u64 | 6222 | u64 |
6208 | nfsd_inject_forget_delegations(struct nfsd_fault_inject_op *op, u64 max) | 6223 | nfsd_inject_forget_delegations(u64 max) |
6209 | { | 6224 | { |
6210 | u64 count = 0; | 6225 | u64 count = 0; |
6211 | struct nfs4_client *clp; | 6226 | struct nfs4_client *clp; |
@@ -6251,8 +6266,7 @@ nfsd_recall_delegations(struct list_head *reaplist) | |||
6251 | } | 6266 | } |
6252 | 6267 | ||
6253 | u64 | 6268 | u64 |
6254 | nfsd_inject_recall_client_delegations(struct nfsd_fault_inject_op *op, | 6269 | nfsd_inject_recall_client_delegations(struct sockaddr_storage *addr, |
6255 | struct sockaddr_storage *addr, | ||
6256 | size_t addr_size) | 6270 | size_t addr_size) |
6257 | { | 6271 | { |
6258 | u64 count = 0; | 6272 | u64 count = 0; |
@@ -6275,7 +6289,7 @@ nfsd_inject_recall_client_delegations(struct nfsd_fault_inject_op *op, | |||
6275 | } | 6289 | } |
6276 | 6290 | ||
6277 | u64 | 6291 | u64 |
6278 | nfsd_inject_recall_delegations(struct nfsd_fault_inject_op *op, u64 max) | 6292 | nfsd_inject_recall_delegations(u64 max) |
6279 | { | 6293 | { |
6280 | u64 count = 0; | 6294 | u64 count = 0; |
6281 | struct nfs4_client *clp, *next; | 6295 | struct nfs4_client *clp, *next; |
@@ -6296,41 +6310,6 @@ nfsd_inject_recall_delegations(struct nfsd_fault_inject_op *op, u64 max) | |||
6296 | nfsd_recall_delegations(&reaplist); | 6310 | nfsd_recall_delegations(&reaplist); |
6297 | return count; | 6311 | return count; |
6298 | } | 6312 | } |
6299 | |||
6300 | u64 nfsd_for_n_state(u64 max, u64 (*func)(struct nfs4_client *, u64)) | ||
6301 | { | ||
6302 | struct nfs4_client *clp, *next; | ||
6303 | u64 count = 0; | ||
6304 | struct nfsd_net *nn = net_generic(current->nsproxy->net_ns, | ||
6305 | nfsd_net_id); | ||
6306 | |||
6307 | if (!nfsd_netns_ready(nn)) | ||
6308 | return 0; | ||
6309 | |||
6310 | list_for_each_entry_safe(clp, next, &nn->client_lru, cl_lru) { | ||
6311 | count += func(clp, max - count); | ||
6312 | if ((max != 0) && (count >= max)) | ||
6313 | break; | ||
6314 | } | ||
6315 | |||
6316 | return count; | ||
6317 | } | ||
6318 | |||
6319 | struct nfs4_client *nfsd_find_client(struct sockaddr_storage *addr, size_t addr_size) | ||
6320 | { | ||
6321 | struct nfs4_client *clp; | ||
6322 | struct nfsd_net *nn = net_generic(current->nsproxy->net_ns, nfsd_net_id); | ||
6323 | |||
6324 | if (!nfsd_netns_ready(nn)) | ||
6325 | return NULL; | ||
6326 | |||
6327 | list_for_each_entry(clp, &nn->client_lru, cl_lru) { | ||
6328 | if (memcmp(&clp->cl_addr, addr, addr_size) == 0) | ||
6329 | return clp; | ||
6330 | } | ||
6331 | return NULL; | ||
6332 | } | ||
6333 | |||
6334 | #endif /* CONFIG_NFSD_FAULT_INJECTION */ | 6313 | #endif /* CONFIG_NFSD_FAULT_INJECTION */ |
6335 | 6314 | ||
6336 | /* | 6315 | /* |