diff options
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
| -rw-r--r-- | fs/nfs/nfs4xdr.c | 135 |
1 files changed, 116 insertions, 19 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 20b4e30e6c82..e437fd6a819f 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
| @@ -46,11 +46,13 @@ | |||
| 46 | #include <linux/proc_fs.h> | 46 | #include <linux/proc_fs.h> |
| 47 | #include <linux/kdev_t.h> | 47 | #include <linux/kdev_t.h> |
| 48 | #include <linux/sunrpc/clnt.h> | 48 | #include <linux/sunrpc/clnt.h> |
| 49 | #include <linux/sunrpc/msg_prot.h> | ||
| 49 | #include <linux/nfs.h> | 50 | #include <linux/nfs.h> |
| 50 | #include <linux/nfs4.h> | 51 | #include <linux/nfs4.h> |
| 51 | #include <linux/nfs_fs.h> | 52 | #include <linux/nfs_fs.h> |
| 52 | #include <linux/nfs_idmap.h> | 53 | #include <linux/nfs_idmap.h> |
| 53 | #include "nfs4_fs.h" | 54 | #include "nfs4_fs.h" |
| 55 | #include "internal.h" | ||
| 54 | 56 | ||
| 55 | #define NFSDBG_FACILITY NFSDBG_XDR | 57 | #define NFSDBG_FACILITY NFSDBG_XDR |
| 56 | 58 | ||
| @@ -134,7 +136,7 @@ static int nfs4_stat_to_errno(int); | |||
| 134 | #define decode_lookup_maxsz (op_decode_hdr_maxsz) | 136 | #define decode_lookup_maxsz (op_decode_hdr_maxsz) |
| 135 | #define encode_share_access_maxsz \ | 137 | #define encode_share_access_maxsz \ |
| 136 | (2) | 138 | (2) |
| 137 | #define encode_createmode_maxsz (1 + encode_attrs_maxsz) | 139 | #define encode_createmode_maxsz (1 + encode_attrs_maxsz + encode_verifier_maxsz) |
| 138 | #define encode_opentype_maxsz (1 + encode_createmode_maxsz) | 140 | #define encode_opentype_maxsz (1 + encode_createmode_maxsz) |
| 139 | #define encode_claim_null_maxsz (1 + nfs4_name_maxsz) | 141 | #define encode_claim_null_maxsz (1 + nfs4_name_maxsz) |
| 140 | #define encode_open_maxsz (op_encode_hdr_maxsz + \ | 142 | #define encode_open_maxsz (op_encode_hdr_maxsz + \ |
| @@ -299,6 +301,8 @@ static int nfs4_stat_to_errno(int); | |||
| 299 | XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + 4) | 301 | XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + 4) |
| 300 | #define decode_sequence_maxsz (op_decode_hdr_maxsz + \ | 302 | #define decode_sequence_maxsz (op_decode_hdr_maxsz + \ |
| 301 | XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + 5) | 303 | XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + 5) |
| 304 | #define encode_reclaim_complete_maxsz (op_encode_hdr_maxsz + 4) | ||
| 305 | #define decode_reclaim_complete_maxsz (op_decode_hdr_maxsz + 4) | ||
| 302 | #else /* CONFIG_NFS_V4_1 */ | 306 | #else /* CONFIG_NFS_V4_1 */ |
| 303 | #define encode_sequence_maxsz 0 | 307 | #define encode_sequence_maxsz 0 |
| 304 | #define decode_sequence_maxsz 0 | 308 | #define decode_sequence_maxsz 0 |
| @@ -676,6 +680,25 @@ static int nfs4_stat_to_errno(int); | |||
| 676 | decode_sequence_maxsz + \ | 680 | decode_sequence_maxsz + \ |
| 677 | decode_putrootfh_maxsz + \ | 681 | decode_putrootfh_maxsz + \ |
| 678 | decode_fsinfo_maxsz) | 682 | decode_fsinfo_maxsz) |
| 683 | #define NFS4_enc_reclaim_complete_sz (compound_encode_hdr_maxsz + \ | ||
| 684 | encode_sequence_maxsz + \ | ||
| 685 | encode_reclaim_complete_maxsz) | ||
| 686 | #define NFS4_dec_reclaim_complete_sz (compound_decode_hdr_maxsz + \ | ||
| 687 | decode_sequence_maxsz + \ | ||
| 688 | decode_reclaim_complete_maxsz) | ||
| 689 | |||
| 690 | const u32 nfs41_maxwrite_overhead = ((RPC_MAX_HEADER_WITH_AUTH + | ||
| 691 | compound_encode_hdr_maxsz + | ||
| 692 | encode_sequence_maxsz + | ||
| 693 | encode_putfh_maxsz + | ||
| 694 | encode_getattr_maxsz) * | ||
| 695 | XDR_UNIT); | ||
| 696 | |||
| 697 | const u32 nfs41_maxread_overhead = ((RPC_MAX_HEADER_WITH_AUTH + | ||
| 698 | compound_decode_hdr_maxsz + | ||
| 699 | decode_sequence_maxsz + | ||
| 700 | decode_putfh_maxsz) * | ||
| 701 | XDR_UNIT); | ||
| 679 | #endif /* CONFIG_NFS_V4_1 */ | 702 | #endif /* CONFIG_NFS_V4_1 */ |
| 680 | 703 | ||
| 681 | static const umode_t nfs_type2fmt[] = { | 704 | static const umode_t nfs_type2fmt[] = { |
| @@ -1140,6 +1163,7 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena | |||
| 1140 | static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg) | 1163 | static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg) |
| 1141 | { | 1164 | { |
| 1142 | __be32 *p; | 1165 | __be32 *p; |
| 1166 | struct nfs_client *clp; | ||
| 1143 | 1167 | ||
| 1144 | p = reserve_space(xdr, 4); | 1168 | p = reserve_space(xdr, 4); |
| 1145 | switch(arg->open_flags & O_EXCL) { | 1169 | switch(arg->open_flags & O_EXCL) { |
| @@ -1148,8 +1172,23 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op | |||
| 1148 | encode_attrs(xdr, arg->u.attrs, arg->server); | 1172 | encode_attrs(xdr, arg->u.attrs, arg->server); |
| 1149 | break; | 1173 | break; |
| 1150 | default: | 1174 | default: |
| 1151 | *p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE); | 1175 | clp = arg->server->nfs_client; |
| 1152 | encode_nfs4_verifier(xdr, &arg->u.verifier); | 1176 | if (clp->cl_minorversion > 0) { |
| 1177 | if (nfs4_has_persistent_session(clp)) { | ||
| 1178 | *p = cpu_to_be32(NFS4_CREATE_GUARDED); | ||
| 1179 | encode_attrs(xdr, arg->u.attrs, arg->server); | ||
| 1180 | } else { | ||
| 1181 | struct iattr dummy; | ||
| 1182 | |||
| 1183 | *p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE4_1); | ||
| 1184 | encode_nfs4_verifier(xdr, &arg->u.verifier); | ||
| 1185 | dummy.ia_valid = 0; | ||
| 1186 | encode_attrs(xdr, &dummy, arg->server); | ||
| 1187 | } | ||
| 1188 | } else { | ||
| 1189 | *p = cpu_to_be32(NFS4_CREATE_EXCLUSIVE); | ||
| 1190 | encode_nfs4_verifier(xdr, &arg->u.verifier); | ||
| 1191 | } | ||
| 1153 | } | 1192 | } |
| 1154 | } | 1193 | } |
| 1155 | 1194 | ||
| @@ -1592,6 +1631,19 @@ static void encode_destroy_session(struct xdr_stream *xdr, | |||
| 1592 | hdr->nops++; | 1631 | hdr->nops++; |
| 1593 | hdr->replen += decode_destroy_session_maxsz; | 1632 | hdr->replen += decode_destroy_session_maxsz; |
| 1594 | } | 1633 | } |
| 1634 | |||
| 1635 | static void encode_reclaim_complete(struct xdr_stream *xdr, | ||
| 1636 | struct nfs41_reclaim_complete_args *args, | ||
| 1637 | struct compound_hdr *hdr) | ||
| 1638 | { | ||
| 1639 | __be32 *p; | ||
| 1640 | |||
| 1641 | p = reserve_space(xdr, 8); | ||
| 1642 | *p++ = cpu_to_be32(OP_RECLAIM_COMPLETE); | ||
| 1643 | *p++ = cpu_to_be32(args->one_fs); | ||
| 1644 | hdr->nops++; | ||
| 1645 | hdr->replen += decode_reclaim_complete_maxsz; | ||
| 1646 | } | ||
| 1595 | #endif /* CONFIG_NFS_V4_1 */ | 1647 | #endif /* CONFIG_NFS_V4_1 */ |
| 1596 | 1648 | ||
| 1597 | static void encode_sequence(struct xdr_stream *xdr, | 1649 | static void encode_sequence(struct xdr_stream *xdr, |
| @@ -2096,7 +2148,7 @@ nfs4_xdr_enc_getacl(struct rpc_rqst *req, __be32 *p, | |||
| 2096 | encode_compound_hdr(&xdr, req, &hdr); | 2148 | encode_compound_hdr(&xdr, req, &hdr); |
| 2097 | encode_sequence(&xdr, &args->seq_args, &hdr); | 2149 | encode_sequence(&xdr, &args->seq_args, &hdr); |
| 2098 | encode_putfh(&xdr, args->fh, &hdr); | 2150 | encode_putfh(&xdr, args->fh, &hdr); |
| 2099 | replen = hdr.replen + nfs4_fattr_bitmap_maxsz + 1; | 2151 | replen = hdr.replen + op_decode_hdr_maxsz + nfs4_fattr_bitmap_maxsz + 1; |
| 2100 | encode_getattr_two(&xdr, FATTR4_WORD0_ACL, 0, &hdr); | 2152 | encode_getattr_two(&xdr, FATTR4_WORD0_ACL, 0, &hdr); |
| 2101 | 2153 | ||
| 2102 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, | 2154 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, |
| @@ -2420,6 +2472,26 @@ static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p, | |||
| 2420 | encode_nops(&hdr); | 2472 | encode_nops(&hdr); |
| 2421 | return 0; | 2473 | return 0; |
| 2422 | } | 2474 | } |
| 2475 | |||
| 2476 | /* | ||
| 2477 | * a RECLAIM_COMPLETE request | ||
| 2478 | */ | ||
| 2479 | static int nfs4_xdr_enc_reclaim_complete(struct rpc_rqst *req, uint32_t *p, | ||
| 2480 | struct nfs41_reclaim_complete_args *args) | ||
| 2481 | { | ||
| 2482 | struct xdr_stream xdr; | ||
| 2483 | struct compound_hdr hdr = { | ||
| 2484 | .minorversion = nfs4_xdr_minorversion(&args->seq_args) | ||
| 2485 | }; | ||
| 2486 | |||
| 2487 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | ||
| 2488 | encode_compound_hdr(&xdr, req, &hdr); | ||
| 2489 | encode_sequence(&xdr, &args->seq_args, &hdr); | ||
| 2490 | encode_reclaim_complete(&xdr, args, &hdr); | ||
| 2491 | encode_nops(&hdr); | ||
| 2492 | return 0; | ||
| 2493 | } | ||
| 2494 | |||
| 2423 | #endif /* CONFIG_NFS_V4_1 */ | 2495 | #endif /* CONFIG_NFS_V4_1 */ |
| 2424 | 2496 | ||
| 2425 | static void print_overflow_msg(const char *func, const struct xdr_stream *xdr) | 2497 | static void print_overflow_msg(const char *func, const struct xdr_stream *xdr) |
| @@ -4528,6 +4600,11 @@ static int decode_destroy_session(struct xdr_stream *xdr, void *dummy) | |||
| 4528 | { | 4600 | { |
| 4529 | return decode_op_hdr(xdr, OP_DESTROY_SESSION); | 4601 | return decode_op_hdr(xdr, OP_DESTROY_SESSION); |
| 4530 | } | 4602 | } |
| 4603 | |||
| 4604 | static int decode_reclaim_complete(struct xdr_stream *xdr, void *dummy) | ||
| 4605 | { | ||
| 4606 | return decode_op_hdr(xdr, OP_RECLAIM_COMPLETE); | ||
| 4607 | } | ||
| 4531 | #endif /* CONFIG_NFS_V4_1 */ | 4608 | #endif /* CONFIG_NFS_V4_1 */ |
| 4532 | 4609 | ||
| 4533 | static int decode_sequence(struct xdr_stream *xdr, | 4610 | static int decode_sequence(struct xdr_stream *xdr, |
| @@ -4583,8 +4660,8 @@ static int decode_sequence(struct xdr_stream *xdr, | |||
| 4583 | dummy = be32_to_cpup(p++); | 4660 | dummy = be32_to_cpup(p++); |
| 4584 | /* target highest slot id - currently not processed */ | 4661 | /* target highest slot id - currently not processed */ |
| 4585 | dummy = be32_to_cpup(p++); | 4662 | dummy = be32_to_cpup(p++); |
| 4586 | /* result flags - currently not processed */ | 4663 | /* result flags */ |
| 4587 | dummy = be32_to_cpup(p); | 4664 | res->sr_status_flags = be32_to_cpup(p); |
| 4588 | status = 0; | 4665 | status = 0; |
| 4589 | out_err: | 4666 | out_err: |
| 4590 | res->sr_status = status; | 4667 | res->sr_status = status; |
| @@ -5309,7 +5386,7 @@ out: | |||
| 5309 | } | 5386 | } |
| 5310 | 5387 | ||
| 5311 | /* | 5388 | /* |
| 5312 | * FSINFO request | 5389 | * Decode FSINFO response |
| 5313 | */ | 5390 | */ |
| 5314 | static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, __be32 *p, | 5391 | static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, __be32 *p, |
| 5315 | struct nfs4_fsinfo_res *res) | 5392 | struct nfs4_fsinfo_res *res) |
| @@ -5330,7 +5407,7 @@ static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, __be32 *p, | |||
| 5330 | } | 5407 | } |
| 5331 | 5408 | ||
| 5332 | /* | 5409 | /* |
| 5333 | * PATHCONF request | 5410 | * Decode PATHCONF response |
| 5334 | */ | 5411 | */ |
| 5335 | static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, __be32 *p, | 5412 | static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, __be32 *p, |
| 5336 | struct nfs4_pathconf_res *res) | 5413 | struct nfs4_pathconf_res *res) |
| @@ -5351,7 +5428,7 @@ static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, __be32 *p, | |||
| 5351 | } | 5428 | } |
| 5352 | 5429 | ||
| 5353 | /* | 5430 | /* |
| 5354 | * STATFS request | 5431 | * Decode STATFS response |
| 5355 | */ | 5432 | */ |
| 5356 | static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, __be32 *p, | 5433 | static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, __be32 *p, |
| 5357 | struct nfs4_statfs_res *res) | 5434 | struct nfs4_statfs_res *res) |
| @@ -5372,7 +5449,7 @@ static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, __be32 *p, | |||
| 5372 | } | 5449 | } |
| 5373 | 5450 | ||
| 5374 | /* | 5451 | /* |
| 5375 | * GETATTR_BITMAP request | 5452 | * Decode GETATTR_BITMAP response |
| 5376 | */ | 5453 | */ |
| 5377 | static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req, __be32 *p, struct nfs4_server_caps_res *res) | 5454 | static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req, __be32 *p, struct nfs4_server_caps_res *res) |
| 5378 | { | 5455 | { |
| @@ -5411,7 +5488,7 @@ static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, __be32 *p, void *dummy) | |||
| 5411 | } | 5488 | } |
| 5412 | 5489 | ||
| 5413 | /* | 5490 | /* |
| 5414 | * a SETCLIENTID request | 5491 | * Decode SETCLIENTID response |
| 5415 | */ | 5492 | */ |
| 5416 | static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, __be32 *p, | 5493 | static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, __be32 *p, |
| 5417 | struct nfs_client *clp) | 5494 | struct nfs_client *clp) |
| @@ -5428,7 +5505,7 @@ static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, __be32 *p, | |||
| 5428 | } | 5505 | } |
| 5429 | 5506 | ||
| 5430 | /* | 5507 | /* |
| 5431 | * a SETCLIENTID_CONFIRM request | 5508 | * Decode SETCLIENTID_CONFIRM response |
| 5432 | */ | 5509 | */ |
| 5433 | static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_fsinfo *fsinfo) | 5510 | static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, __be32 *p, struct nfs_fsinfo *fsinfo) |
| 5434 | { | 5511 | { |
| @@ -5448,7 +5525,7 @@ static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, __be32 *p, str | |||
| 5448 | } | 5525 | } |
| 5449 | 5526 | ||
| 5450 | /* | 5527 | /* |
| 5451 | * DELEGRETURN request | 5528 | * Decode DELEGRETURN response |
| 5452 | */ | 5529 | */ |
| 5453 | static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_delegreturnres *res) | 5530 | static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_delegreturnres *res) |
| 5454 | { | 5531 | { |
| @@ -5474,7 +5551,7 @@ out: | |||
| 5474 | } | 5551 | } |
| 5475 | 5552 | ||
| 5476 | /* | 5553 | /* |
| 5477 | * FS_LOCATIONS request | 5554 | * Decode FS_LOCATIONS response |
| 5478 | */ | 5555 | */ |
| 5479 | static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req, __be32 *p, | 5556 | static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req, __be32 *p, |
| 5480 | struct nfs4_fs_locations_res *res) | 5557 | struct nfs4_fs_locations_res *res) |
| @@ -5504,7 +5581,7 @@ out: | |||
| 5504 | 5581 | ||
| 5505 | #if defined(CONFIG_NFS_V4_1) | 5582 | #if defined(CONFIG_NFS_V4_1) |
| 5506 | /* | 5583 | /* |
| 5507 | * EXCHANGE_ID request | 5584 | * Decode EXCHANGE_ID response |
| 5508 | */ | 5585 | */ |
| 5509 | static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp, uint32_t *p, | 5586 | static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp, uint32_t *p, |
| 5510 | void *res) | 5587 | void *res) |
| @@ -5521,7 +5598,7 @@ static int nfs4_xdr_dec_exchange_id(struct rpc_rqst *rqstp, uint32_t *p, | |||
| 5521 | } | 5598 | } |
| 5522 | 5599 | ||
| 5523 | /* | 5600 | /* |
| 5524 | * a CREATE_SESSION request | 5601 | * Decode CREATE_SESSION response |
| 5525 | */ | 5602 | */ |
| 5526 | static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp, uint32_t *p, | 5603 | static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp, uint32_t *p, |
| 5527 | struct nfs41_create_session_res *res) | 5604 | struct nfs41_create_session_res *res) |
| @@ -5538,7 +5615,7 @@ static int nfs4_xdr_dec_create_session(struct rpc_rqst *rqstp, uint32_t *p, | |||
| 5538 | } | 5615 | } |
| 5539 | 5616 | ||
| 5540 | /* | 5617 | /* |
| 5541 | * a DESTROY_SESSION request | 5618 | * Decode DESTROY_SESSION response |
| 5542 | */ | 5619 | */ |
| 5543 | static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp, uint32_t *p, | 5620 | static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp, uint32_t *p, |
| 5544 | void *dummy) | 5621 | void *dummy) |
| @@ -5555,7 +5632,7 @@ static int nfs4_xdr_dec_destroy_session(struct rpc_rqst *rqstp, uint32_t *p, | |||
| 5555 | } | 5632 | } |
| 5556 | 5633 | ||
| 5557 | /* | 5634 | /* |
| 5558 | * a SEQUENCE request | 5635 | * Decode SEQUENCE response |
| 5559 | */ | 5636 | */ |
| 5560 | static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp, uint32_t *p, | 5637 | static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp, uint32_t *p, |
| 5561 | struct nfs4_sequence_res *res) | 5638 | struct nfs4_sequence_res *res) |
| @@ -5572,7 +5649,7 @@ static int nfs4_xdr_dec_sequence(struct rpc_rqst *rqstp, uint32_t *p, | |||
| 5572 | } | 5649 | } |
| 5573 | 5650 | ||
| 5574 | /* | 5651 | /* |
| 5575 | * a GET_LEASE_TIME request | 5652 | * Decode GET_LEASE_TIME response |
| 5576 | */ | 5653 | */ |
| 5577 | static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp, uint32_t *p, | 5654 | static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp, uint32_t *p, |
| 5578 | struct nfs4_get_lease_time_res *res) | 5655 | struct nfs4_get_lease_time_res *res) |
| @@ -5591,6 +5668,25 @@ static int nfs4_xdr_dec_get_lease_time(struct rpc_rqst *rqstp, uint32_t *p, | |||
| 5591 | status = decode_fsinfo(&xdr, res->lr_fsinfo); | 5668 | status = decode_fsinfo(&xdr, res->lr_fsinfo); |
| 5592 | return status; | 5669 | return status; |
| 5593 | } | 5670 | } |
| 5671 | |||
| 5672 | /* | ||
| 5673 | * Decode RECLAIM_COMPLETE response | ||
| 5674 | */ | ||
| 5675 | static int nfs4_xdr_dec_reclaim_complete(struct rpc_rqst *rqstp, uint32_t *p, | ||
| 5676 | struct nfs41_reclaim_complete_res *res) | ||
| 5677 | { | ||
| 5678 | struct xdr_stream xdr; | ||
| 5679 | struct compound_hdr hdr; | ||
| 5680 | int status; | ||
| 5681 | |||
| 5682 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | ||
| 5683 | status = decode_compound_hdr(&xdr, &hdr); | ||
| 5684 | if (!status) | ||
| 5685 | status = decode_sequence(&xdr, &res->seq_res, rqstp); | ||
| 5686 | if (!status) | ||
| 5687 | status = decode_reclaim_complete(&xdr, (void *)NULL); | ||
| 5688 | return status; | ||
| 5689 | } | ||
| 5594 | #endif /* CONFIG_NFS_V4_1 */ | 5690 | #endif /* CONFIG_NFS_V4_1 */ |
| 5595 | 5691 | ||
| 5596 | __be32 *nfs4_decode_dirent(__be32 *p, struct nfs_entry *entry, int plus) | 5692 | __be32 *nfs4_decode_dirent(__be32 *p, struct nfs_entry *entry, int plus) |
| @@ -5767,6 +5863,7 @@ struct rpc_procinfo nfs4_procedures[] = { | |||
| 5767 | PROC(DESTROY_SESSION, enc_destroy_session, dec_destroy_session), | 5863 | PROC(DESTROY_SESSION, enc_destroy_session, dec_destroy_session), |
| 5768 | PROC(SEQUENCE, enc_sequence, dec_sequence), | 5864 | PROC(SEQUENCE, enc_sequence, dec_sequence), |
| 5769 | PROC(GET_LEASE_TIME, enc_get_lease_time, dec_get_lease_time), | 5865 | PROC(GET_LEASE_TIME, enc_get_lease_time, dec_get_lease_time), |
| 5866 | PROC(RECLAIM_COMPLETE, enc_reclaim_complete, dec_reclaim_complete), | ||
| 5770 | #endif /* CONFIG_NFS_V4_1 */ | 5867 | #endif /* CONFIG_NFS_V4_1 */ |
| 5771 | }; | 5868 | }; |
| 5772 | 5869 | ||
