diff options
author | Alexandros Batsakis <batsakis@netapp.com> | 2011-01-06 06:36:31 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-01-06 14:46:32 -0500 |
commit | 36840370845629e6cb4324d1dd4aff6778670503 (patch) | |
tree | b295dba561cefecd6845c4402a52df5f7894f520 /fs/nfs/callback_proc.c | |
parent | 43f1b3da8b35d706d6c47880fc211d2519b4a587 (diff) |
pnfs: update nfs4_callback_recallany to handle layouts
While here, update the code a bit.
Signed-off-by: Alexandros Batsakis <batsakis@netapp.com>
Signed-off-by: Fred Isaman <iisaman@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.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index 6619c05b55a0..4bb91cb2620d 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c | |||
@@ -230,6 +230,17 @@ __be32 nfs4_callback_layoutrecall(struct cb_layoutrecallargs *args, | |||
230 | return cpu_to_be32(res); | 230 | return cpu_to_be32(res); |
231 | } | 231 | } |
232 | 232 | ||
233 | static void pnfs_recall_all_layouts(struct nfs_client *clp) | ||
234 | { | ||
235 | struct cb_layoutrecallargs args; | ||
236 | |||
237 | /* Pretend we got a CB_LAYOUTRECALL(ALL) */ | ||
238 | memset(&args, 0, sizeof(args)); | ||
239 | args.cbl_recall_type = RETURN_ALL; | ||
240 | /* FIXME we ignore errors, what should we do? */ | ||
241 | do_callback_layoutrecall(clp, &args); | ||
242 | } | ||
243 | |||
233 | int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, const nfs4_stateid *stateid) | 244 | int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, const nfs4_stateid *stateid) |
234 | { | 245 | { |
235 | if (delegation == NULL) | 246 | if (delegation == NULL) |
@@ -421,29 +432,41 @@ out: | |||
421 | return status; | 432 | return status; |
422 | } | 433 | } |
423 | 434 | ||
435 | static bool | ||
436 | validate_bitmap_values(unsigned long mask) | ||
437 | { | ||
438 | return (mask & ~RCA4_TYPE_MASK_ALL) == 0; | ||
439 | } | ||
440 | |||
424 | __be32 nfs4_callback_recallany(struct cb_recallanyargs *args, void *dummy, | 441 | __be32 nfs4_callback_recallany(struct cb_recallanyargs *args, void *dummy, |
425 | struct cb_process_state *cps) | 442 | struct cb_process_state *cps) |
426 | { | 443 | { |
427 | __be32 status; | 444 | __be32 status; |
428 | fmode_t flags = 0; | 445 | fmode_t flags = 0; |
429 | 446 | ||
430 | status = htonl(NFS4ERR_OP_NOT_IN_SESSION); | 447 | status = cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION); |
431 | if (!cps->clp) /* set in cb_sequence */ | 448 | if (!cps->clp) /* set in cb_sequence */ |
432 | goto out; | 449 | goto out; |
433 | 450 | ||
434 | dprintk("NFS: RECALL_ANY callback request from %s\n", | 451 | dprintk("NFS: RECALL_ANY callback request from %s\n", |
435 | rpc_peeraddr2str(cps->clp->cl_rpcclient, RPC_DISPLAY_ADDR)); | 452 | rpc_peeraddr2str(cps->clp->cl_rpcclient, RPC_DISPLAY_ADDR)); |
436 | 453 | ||
454 | status = cpu_to_be32(NFS4ERR_INVAL); | ||
455 | if (!validate_bitmap_values(args->craa_type_mask)) | ||
456 | goto out; | ||
457 | |||
458 | status = cpu_to_be32(NFS4_OK); | ||
437 | if (test_bit(RCA4_TYPE_MASK_RDATA_DLG, (const unsigned long *) | 459 | if (test_bit(RCA4_TYPE_MASK_RDATA_DLG, (const unsigned long *) |
438 | &args->craa_type_mask)) | 460 | &args->craa_type_mask)) |
439 | flags = FMODE_READ; | 461 | flags = FMODE_READ; |
440 | if (test_bit(RCA4_TYPE_MASK_WDATA_DLG, (const unsigned long *) | 462 | if (test_bit(RCA4_TYPE_MASK_WDATA_DLG, (const unsigned long *) |
441 | &args->craa_type_mask)) | 463 | &args->craa_type_mask)) |
442 | flags |= FMODE_WRITE; | 464 | flags |= FMODE_WRITE; |
443 | 465 | if (test_bit(RCA4_TYPE_MASK_FILE_LAYOUT, (const unsigned long *) | |
466 | &args->craa_type_mask)) | ||
467 | pnfs_recall_all_layouts(cps->clp); | ||
444 | if (flags) | 468 | if (flags) |
445 | nfs_expire_all_delegation_types(cps->clp, flags); | 469 | nfs_expire_all_delegation_types(cps->clp, flags); |
446 | status = htonl(NFS4_OK); | ||
447 | out: | 470 | out: |
448 | dprintk("%s: exit with status = %d\n", __func__, ntohl(status)); | 471 | dprintk("%s: exit with status = %d\n", __func__, ntohl(status)); |
449 | return status; | 472 | return status; |