aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/callback_proc.c
diff options
context:
space:
mode:
authorAlexandros Batsakis <batsakis@netapp.com>2009-12-05 13:27:02 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2009-12-05 13:27:02 -0500
commit31f0960778c78198957cf02cc970d92b72b929e4 (patch)
treeb5d061437c4a952e0fe78006a2ad9186c2e6ecc9 /fs/nfs/callback_proc.c
parentc79571a508801e055a0be583d6dc70bddad7bb64 (diff)
nfs41: V2 initial support for CB_RECALL_ANY
For now the clients returns _all_ the delegations of the specificed type it holds Signed-off-by: Alexandros Batsakis <batsakis@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/callback_proc.c')
-rw-r--r--fs/nfs/callback_proc.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
index b7da1f54da68..61b85306bb25 100644
--- a/fs/nfs/callback_proc.c
+++ b/fs/nfs/callback_proc.c
@@ -227,4 +227,33 @@ out:
227 return res->csr_status; 227 return res->csr_status;
228} 228}
229 229
230unsigned nfs4_callback_recallany(struct cb_recallanyargs *args, void *dummy)
231{
232 struct nfs_client *clp;
233 int status;
234 fmode_t flags = 0;
235
236 status = htonl(NFS4ERR_OP_NOT_IN_SESSION);
237 clp = nfs_find_client(args->craa_addr, 4);
238 if (clp == NULL)
239 goto out;
240
241 dprintk("NFS: RECALL_ANY callback request from %s\n",
242 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR));
243
244 if (test_bit(RCA4_TYPE_MASK_RDATA_DLG, (const unsigned long *)
245 &args->craa_type_mask))
246 flags = FMODE_READ;
247 if (test_bit(RCA4_TYPE_MASK_WDATA_DLG, (const unsigned long *)
248 &args->craa_type_mask))
249 flags |= FMODE_WRITE;
250
251 if (flags)
252 nfs_expire_all_delegation_types(clp, flags);
253 status = htonl(NFS4_OK);
254out:
255 dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
256 return status;
257}
258
230#endif /* CONFIG_NFS_V4_1 */ 259#endif /* CONFIG_NFS_V4_1 */