diff options
author | Andy Adamson <andros@netapp.com> | 2010-01-20 16:06:27 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-02-10 08:30:59 -0500 |
commit | b9efa1b27e25b1286504973c0a6bf0f24106faa8 (patch) | |
tree | e2cff0c8c7a33869123ea3e340d3b9ac3eefcef2 /fs/nfs/callback_xdr.c | |
parent | 4911096f1a5df73c12c287a42ece4e7b5d9c19ec (diff) |
nfs41: implement cb_recall_slot
Drain the fore channel and reset the max_slots to the new value.
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/callback_xdr.c')
-rw-r--r-- | fs/nfs/callback_xdr.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c index 08b430d922c4..8e66e20b59fd 100644 --- a/fs/nfs/callback_xdr.c +++ b/fs/nfs/callback_xdr.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #define CB_OP_SEQUENCE_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \ | 24 | #define CB_OP_SEQUENCE_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ + \ |
25 | 4 + 1 + 3) | 25 | 4 + 1 + 3) |
26 | #define CB_OP_RECALLANY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ) | 26 | #define CB_OP_RECALLANY_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ) |
27 | #define CB_OP_RECALLSLOT_RES_MAXSZ (CB_OP_HDR_RES_MAXSZ) | ||
27 | #endif /* CONFIG_NFS_V4_1 */ | 28 | #endif /* CONFIG_NFS_V4_1 */ |
28 | 29 | ||
29 | #define NFSDBG_FACILITY NFSDBG_CALLBACK | 30 | #define NFSDBG_FACILITY NFSDBG_CALLBACK |
@@ -349,6 +350,20 @@ static unsigned decode_recallany_args(struct svc_rqst *rqstp, | |||
349 | return 0; | 350 | return 0; |
350 | } | 351 | } |
351 | 352 | ||
353 | static unsigned decode_recallslot_args(struct svc_rqst *rqstp, | ||
354 | struct xdr_stream *xdr, | ||
355 | struct cb_recallslotargs *args) | ||
356 | { | ||
357 | __be32 *p; | ||
358 | |||
359 | args->crsa_addr = svc_addr(rqstp); | ||
360 | p = read_buf(xdr, 4); | ||
361 | if (unlikely(p == NULL)) | ||
362 | return htonl(NFS4ERR_BADXDR); | ||
363 | args->crsa_target_max_slots = ntohl(*p++); | ||
364 | return 0; | ||
365 | } | ||
366 | |||
352 | #endif /* CONFIG_NFS_V4_1 */ | 367 | #endif /* CONFIG_NFS_V4_1 */ |
353 | 368 | ||
354 | static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) | 369 | static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) |
@@ -557,6 +572,7 @@ preprocess_nfs41_op(int nop, unsigned int op_nr, struct callback_op **op) | |||
557 | case OP_CB_RECALL: | 572 | case OP_CB_RECALL: |
558 | case OP_CB_SEQUENCE: | 573 | case OP_CB_SEQUENCE: |
559 | case OP_CB_RECALL_ANY: | 574 | case OP_CB_RECALL_ANY: |
575 | case OP_CB_RECALL_SLOT: | ||
560 | *op = &callback_ops[op_nr]; | 576 | *op = &callback_ops[op_nr]; |
561 | break; | 577 | break; |
562 | 578 | ||
@@ -565,7 +581,6 @@ preprocess_nfs41_op(int nop, unsigned int op_nr, struct callback_op **op) | |||
565 | case OP_CB_NOTIFY: | 581 | case OP_CB_NOTIFY: |
566 | case OP_CB_PUSH_DELEG: | 582 | case OP_CB_PUSH_DELEG: |
567 | case OP_CB_RECALLABLE_OBJ_AVAIL: | 583 | case OP_CB_RECALLABLE_OBJ_AVAIL: |
568 | case OP_CB_RECALL_SLOT: | ||
569 | case OP_CB_WANTS_CANCELLED: | 584 | case OP_CB_WANTS_CANCELLED: |
570 | case OP_CB_NOTIFY_LOCK: | 585 | case OP_CB_NOTIFY_LOCK: |
571 | return htonl(NFS4ERR_NOTSUPP); | 586 | return htonl(NFS4ERR_NOTSUPP); |
@@ -734,6 +749,11 @@ static struct callback_op callback_ops[] = { | |||
734 | .decode_args = (callback_decode_arg_t)decode_recallany_args, | 749 | .decode_args = (callback_decode_arg_t)decode_recallany_args, |
735 | .res_maxsize = CB_OP_RECALLANY_RES_MAXSZ, | 750 | .res_maxsize = CB_OP_RECALLANY_RES_MAXSZ, |
736 | }, | 751 | }, |
752 | [OP_CB_RECALL_SLOT] = { | ||
753 | .process_op = (callback_process_op_t)nfs4_callback_recallslot, | ||
754 | .decode_args = (callback_decode_arg_t)decode_recallslot_args, | ||
755 | .res_maxsize = CB_OP_RECALLSLOT_RES_MAXSZ, | ||
756 | }, | ||
737 | #endif /* CONFIG_NFS_V4_1 */ | 757 | #endif /* CONFIG_NFS_V4_1 */ |
738 | }; | 758 | }; |
739 | 759 | ||