diff options
| -rw-r--r-- | fs/nfs/nfs4xdr.c | 490 |
1 files changed, 245 insertions, 245 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 7dde309ce1ac..29656c5090c2 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
| @@ -755,12 +755,12 @@ static int encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *arg | |||
| 755 | { | 755 | { |
| 756 | __be32 *p; | 756 | __be32 *p; |
| 757 | 757 | ||
| 758 | RESERVE_SPACE(16); | 758 | RESERVE_SPACE(16); |
| 759 | WRITE32(OP_COMMIT); | 759 | WRITE32(OP_COMMIT); |
| 760 | WRITE64(args->offset); | 760 | WRITE64(args->offset); |
| 761 | WRITE32(args->count); | 761 | WRITE32(args->count); |
| 762 | 762 | ||
| 763 | return 0; | 763 | return 0; |
| 764 | } | 764 | } |
| 765 | 765 | ||
| 766 | static int encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *create) | 766 | static int encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *create) |
| @@ -797,25 +797,25 @@ static int encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *c | |||
| 797 | 797 | ||
| 798 | static int encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap) | 798 | static int encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap) |
| 799 | { | 799 | { |
| 800 | __be32 *p; | 800 | __be32 *p; |
| 801 | 801 | ||
| 802 | RESERVE_SPACE(12); | 802 | RESERVE_SPACE(12); |
| 803 | WRITE32(OP_GETATTR); | 803 | WRITE32(OP_GETATTR); |
| 804 | WRITE32(1); | 804 | WRITE32(1); |
| 805 | WRITE32(bitmap); | 805 | WRITE32(bitmap); |
| 806 | return 0; | 806 | return 0; |
| 807 | } | 807 | } |
| 808 | 808 | ||
| 809 | static int encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm1) | 809 | static int encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm1) |
| 810 | { | 810 | { |
| 811 | __be32 *p; | 811 | __be32 *p; |
| 812 | 812 | ||
| 813 | RESERVE_SPACE(16); | 813 | RESERVE_SPACE(16); |
| 814 | WRITE32(OP_GETATTR); | 814 | WRITE32(OP_GETATTR); |
| 815 | WRITE32(2); | 815 | WRITE32(2); |
| 816 | WRITE32(bm0); | 816 | WRITE32(bm0); |
| 817 | WRITE32(bm1); | 817 | WRITE32(bm1); |
| 818 | return 0; | 818 | return 0; |
| 819 | } | 819 | } |
| 820 | 820 | ||
| 821 | static int encode_getfattr(struct xdr_stream *xdr, const u32* bitmask) | 821 | static int encode_getfattr(struct xdr_stream *xdr, const u32* bitmask) |
| @@ -959,17 +959,17 @@ static void encode_share_access(struct xdr_stream *xdr, fmode_t fmode) | |||
| 959 | 959 | ||
| 960 | RESERVE_SPACE(8); | 960 | RESERVE_SPACE(8); |
| 961 | switch (fmode & (FMODE_READ|FMODE_WRITE)) { | 961 | switch (fmode & (FMODE_READ|FMODE_WRITE)) { |
| 962 | case FMODE_READ: | 962 | case FMODE_READ: |
| 963 | WRITE32(NFS4_SHARE_ACCESS_READ); | 963 | WRITE32(NFS4_SHARE_ACCESS_READ); |
| 964 | break; | 964 | break; |
| 965 | case FMODE_WRITE: | 965 | case FMODE_WRITE: |
| 966 | WRITE32(NFS4_SHARE_ACCESS_WRITE); | 966 | WRITE32(NFS4_SHARE_ACCESS_WRITE); |
| 967 | break; | 967 | break; |
| 968 | case FMODE_READ|FMODE_WRITE: | 968 | case FMODE_READ|FMODE_WRITE: |
| 969 | WRITE32(NFS4_SHARE_ACCESS_BOTH); | 969 | WRITE32(NFS4_SHARE_ACCESS_BOTH); |
| 970 | break; | 970 | break; |
| 971 | default: | 971 | default: |
| 972 | WRITE32(0); | 972 | WRITE32(0); |
| 973 | } | 973 | } |
| 974 | WRITE32(0); /* for linux, share_deny = 0 always */ | 974 | WRITE32(0); /* for linux, share_deny = 0 always */ |
| 975 | } | 975 | } |
| @@ -998,13 +998,13 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op | |||
| 998 | 998 | ||
| 999 | RESERVE_SPACE(4); | 999 | RESERVE_SPACE(4); |
| 1000 | switch(arg->open_flags & O_EXCL) { | 1000 | switch(arg->open_flags & O_EXCL) { |
| 1001 | case 0: | 1001 | case 0: |
| 1002 | WRITE32(NFS4_CREATE_UNCHECKED); | 1002 | WRITE32(NFS4_CREATE_UNCHECKED); |
| 1003 | encode_attrs(xdr, arg->u.attrs, arg->server); | 1003 | encode_attrs(xdr, arg->u.attrs, arg->server); |
| 1004 | break; | 1004 | break; |
| 1005 | default: | 1005 | default: |
| 1006 | WRITE32(NFS4_CREATE_EXCLUSIVE); | 1006 | WRITE32(NFS4_CREATE_EXCLUSIVE); |
| 1007 | encode_nfs4_verifier(xdr, &arg->u.verifier); | 1007 | encode_nfs4_verifier(xdr, &arg->u.verifier); |
| 1008 | } | 1008 | } |
| 1009 | } | 1009 | } |
| 1010 | 1010 | ||
| @@ -1014,13 +1014,13 @@ static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *a | |||
| 1014 | 1014 | ||
| 1015 | RESERVE_SPACE(4); | 1015 | RESERVE_SPACE(4); |
| 1016 | switch (arg->open_flags & O_CREAT) { | 1016 | switch (arg->open_flags & O_CREAT) { |
| 1017 | case 0: | 1017 | case 0: |
| 1018 | WRITE32(NFS4_OPEN_NOCREATE); | 1018 | WRITE32(NFS4_OPEN_NOCREATE); |
| 1019 | break; | 1019 | break; |
| 1020 | default: | 1020 | default: |
| 1021 | BUG_ON(arg->claim != NFS4_OPEN_CLAIM_NULL); | 1021 | BUG_ON(arg->claim != NFS4_OPEN_CLAIM_NULL); |
| 1022 | WRITE32(NFS4_OPEN_CREATE); | 1022 | WRITE32(NFS4_OPEN_CREATE); |
| 1023 | encode_createmode(xdr, arg); | 1023 | encode_createmode(xdr, arg); |
| 1024 | } | 1024 | } |
| 1025 | } | 1025 | } |
| 1026 | 1026 | ||
| @@ -1030,17 +1030,17 @@ static inline void encode_delegation_type(struct xdr_stream *xdr, fmode_t delega | |||
| 1030 | 1030 | ||
| 1031 | RESERVE_SPACE(4); | 1031 | RESERVE_SPACE(4); |
| 1032 | switch (delegation_type) { | 1032 | switch (delegation_type) { |
| 1033 | case 0: | 1033 | case 0: |
| 1034 | WRITE32(NFS4_OPEN_DELEGATE_NONE); | 1034 | WRITE32(NFS4_OPEN_DELEGATE_NONE); |
| 1035 | break; | 1035 | break; |
| 1036 | case FMODE_READ: | 1036 | case FMODE_READ: |
| 1037 | WRITE32(NFS4_OPEN_DELEGATE_READ); | 1037 | WRITE32(NFS4_OPEN_DELEGATE_READ); |
| 1038 | break; | 1038 | break; |
| 1039 | case FMODE_WRITE|FMODE_READ: | 1039 | case FMODE_WRITE|FMODE_READ: |
| 1040 | WRITE32(NFS4_OPEN_DELEGATE_WRITE); | 1040 | WRITE32(NFS4_OPEN_DELEGATE_WRITE); |
| 1041 | break; | 1041 | break; |
| 1042 | default: | 1042 | default: |
| 1043 | BUG(); | 1043 | BUG(); |
| 1044 | } | 1044 | } |
| 1045 | } | 1045 | } |
| 1046 | 1046 | ||
| @@ -1077,17 +1077,17 @@ static int encode_open(struct xdr_stream *xdr, const struct nfs_openargs *arg) | |||
| 1077 | encode_openhdr(xdr, arg); | 1077 | encode_openhdr(xdr, arg); |
| 1078 | encode_opentype(xdr, arg); | 1078 | encode_opentype(xdr, arg); |
| 1079 | switch (arg->claim) { | 1079 | switch (arg->claim) { |
| 1080 | case NFS4_OPEN_CLAIM_NULL: | 1080 | case NFS4_OPEN_CLAIM_NULL: |
| 1081 | encode_claim_null(xdr, arg->name); | 1081 | encode_claim_null(xdr, arg->name); |
| 1082 | break; | 1082 | break; |
| 1083 | case NFS4_OPEN_CLAIM_PREVIOUS: | 1083 | case NFS4_OPEN_CLAIM_PREVIOUS: |
| 1084 | encode_claim_previous(xdr, arg->u.delegation_type); | 1084 | encode_claim_previous(xdr, arg->u.delegation_type); |
| 1085 | break; | 1085 | break; |
| 1086 | case NFS4_OPEN_CLAIM_DELEGATE_CUR: | 1086 | case NFS4_OPEN_CLAIM_DELEGATE_CUR: |
| 1087 | encode_claim_delegate_cur(xdr, arg->name, &arg->u.delegation); | 1087 | encode_claim_delegate_cur(xdr, arg->name, &arg->u.delegation); |
| 1088 | break; | 1088 | break; |
| 1089 | default: | 1089 | default: |
| 1090 | BUG(); | 1090 | BUG(); |
| 1091 | } | 1091 | } |
| 1092 | return 0; | 1092 | return 0; |
| 1093 | } | 1093 | } |
| @@ -1132,12 +1132,12 @@ encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh) | |||
| 1132 | 1132 | ||
| 1133 | static int encode_putrootfh(struct xdr_stream *xdr) | 1133 | static int encode_putrootfh(struct xdr_stream *xdr) |
| 1134 | { | 1134 | { |
| 1135 | __be32 *p; | 1135 | __be32 *p; |
| 1136 | 1136 | ||
| 1137 | RESERVE_SPACE(4); | 1137 | RESERVE_SPACE(4); |
| 1138 | WRITE32(OP_PUTROOTFH); | 1138 | WRITE32(OP_PUTROOTFH); |
| 1139 | 1139 | ||
| 1140 | return 0; | 1140 | return 0; |
| 1141 | } | 1141 | } |
| 1142 | 1142 | ||
| 1143 | static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_context *ctx) | 1143 | static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_context *ctx) |
| @@ -1297,14 +1297,14 @@ static int encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs * | |||
| 1297 | int status; | 1297 | int status; |
| 1298 | __be32 *p; | 1298 | __be32 *p; |
| 1299 | 1299 | ||
| 1300 | RESERVE_SPACE(4+NFS4_STATEID_SIZE); | 1300 | RESERVE_SPACE(4+NFS4_STATEID_SIZE); |
| 1301 | WRITE32(OP_SETATTR); | 1301 | WRITE32(OP_SETATTR); |
| 1302 | WRITEMEM(arg->stateid.data, NFS4_STATEID_SIZE); | 1302 | WRITEMEM(arg->stateid.data, NFS4_STATEID_SIZE); |
| 1303 | 1303 | ||
| 1304 | if ((status = encode_attrs(xdr, arg->iap, server))) | 1304 | if ((status = encode_attrs(xdr, arg->iap, server))) |
| 1305 | return status; | 1305 | return status; |
| 1306 | 1306 | ||
| 1307 | return 0; | 1307 | return 0; |
| 1308 | } | 1308 | } |
| 1309 | 1309 | ||
| 1310 | static int encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclientid *setclientid) | 1310 | static int encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclientid *setclientid) |
| @@ -1328,14 +1328,14 @@ static int encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclien | |||
| 1328 | 1328 | ||
| 1329 | static int encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_client *client_state) | 1329 | static int encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_client *client_state) |
| 1330 | { | 1330 | { |
| 1331 | __be32 *p; | 1331 | __be32 *p; |
| 1332 | 1332 | ||
| 1333 | RESERVE_SPACE(12 + NFS4_VERIFIER_SIZE); | 1333 | RESERVE_SPACE(12 + NFS4_VERIFIER_SIZE); |
| 1334 | WRITE32(OP_SETCLIENTID_CONFIRM); | 1334 | WRITE32(OP_SETCLIENTID_CONFIRM); |
| 1335 | WRITE64(client_state->cl_clientid); | 1335 | WRITE64(client_state->cl_clientid); |
| 1336 | WRITEMEM(client_state->cl_confirm.data, NFS4_VERIFIER_SIZE); | 1336 | WRITEMEM(client_state->cl_confirm.data, NFS4_VERIFIER_SIZE); |
| 1337 | 1337 | ||
| 1338 | return 0; | 1338 | return 0; |
| 1339 | } | 1339 | } |
| 1340 | 1340 | ||
| 1341 | static int encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *args) | 1341 | static int encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *args) |
| @@ -1584,23 +1584,23 @@ static int nfs4_xdr_enc_getattr(struct rpc_rqst *req, __be32 *p, const struct nf | |||
| 1584 | */ | 1584 | */ |
| 1585 | static int nfs4_xdr_enc_close(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args) | 1585 | static int nfs4_xdr_enc_close(struct rpc_rqst *req, __be32 *p, struct nfs_closeargs *args) |
| 1586 | { | 1586 | { |
| 1587 | struct xdr_stream xdr; | 1587 | struct xdr_stream xdr; |
| 1588 | struct compound_hdr hdr = { | 1588 | struct compound_hdr hdr = { |
| 1589 | .nops = 3, | 1589 | .nops = 3, |
| 1590 | }; | 1590 | }; |
| 1591 | int status; | 1591 | int status; |
| 1592 | 1592 | ||
| 1593 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1593 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
| 1594 | encode_compound_hdr(&xdr, &hdr); | 1594 | encode_compound_hdr(&xdr, &hdr); |
| 1595 | status = encode_putfh(&xdr, args->fh); | 1595 | status = encode_putfh(&xdr, args->fh); |
| 1596 | if(status) | 1596 | if(status) |
| 1597 | goto out; | 1597 | goto out; |
| 1598 | status = encode_close(&xdr, args); | 1598 | status = encode_close(&xdr, args); |
| 1599 | if (status != 0) | 1599 | if (status != 0) |
| 1600 | goto out; | 1600 | goto out; |
| 1601 | status = encode_getfattr(&xdr, args->bitmask); | 1601 | status = encode_getfattr(&xdr, args->bitmask); |
| 1602 | out: | 1602 | out: |
| 1603 | return status; | 1603 | return status; |
| 1604 | } | 1604 | } |
| 1605 | 1605 | ||
| 1606 | /* | 1606 | /* |
| @@ -1875,25 +1875,24 @@ out: | |||
| 1875 | * Encode an SETATTR request | 1875 | * Encode an SETATTR request |
| 1876 | */ | 1876 | */ |
| 1877 | static int nfs4_xdr_enc_setattr(struct rpc_rqst *req, __be32 *p, struct nfs_setattrargs *args) | 1877 | static int nfs4_xdr_enc_setattr(struct rpc_rqst *req, __be32 *p, struct nfs_setattrargs *args) |
| 1878 | |||
| 1879 | { | 1878 | { |
| 1880 | struct xdr_stream xdr; | 1879 | struct xdr_stream xdr; |
| 1881 | struct compound_hdr hdr = { | 1880 | struct compound_hdr hdr = { |
| 1882 | .nops = 3, | 1881 | .nops = 3, |
| 1883 | }; | 1882 | }; |
| 1884 | int status; | 1883 | int status; |
| 1885 | 1884 | ||
| 1886 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 1885 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
| 1887 | encode_compound_hdr(&xdr, &hdr); | 1886 | encode_compound_hdr(&xdr, &hdr); |
| 1888 | status = encode_putfh(&xdr, args->fh); | 1887 | status = encode_putfh(&xdr, args->fh); |
| 1889 | if(status) | 1888 | if(status) |
| 1890 | goto out; | 1889 | goto out; |
| 1891 | status = encode_setattr(&xdr, args, args->server); | 1890 | status = encode_setattr(&xdr, args, args->server); |
| 1892 | if(status) | 1891 | if(status) |
| 1893 | goto out; | 1892 | goto out; |
| 1894 | status = encode_getfattr(&xdr, args->bitmask); | 1893 | status = encode_getfattr(&xdr, args->bitmask); |
| 1895 | out: | 1894 | out: |
| 1896 | return status; | 1895 | return status; |
| 1897 | } | 1896 | } |
| 1898 | 1897 | ||
| 1899 | /* | 1898 | /* |
| @@ -3343,27 +3342,27 @@ static int decode_lookup(struct xdr_stream *xdr) | |||
| 3343 | /* This is too sick! */ | 3342 | /* This is too sick! */ |
| 3344 | static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize) | 3343 | static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize) |
| 3345 | { | 3344 | { |
| 3346 | __be32 *p; | 3345 | __be32 *p; |
| 3347 | uint32_t limit_type, nblocks, blocksize; | 3346 | uint32_t limit_type, nblocks, blocksize; |
| 3348 | 3347 | ||
| 3349 | READ_BUF(12); | 3348 | READ_BUF(12); |
| 3350 | READ32(limit_type); | 3349 | READ32(limit_type); |
| 3351 | switch (limit_type) { | 3350 | switch (limit_type) { |
| 3352 | case 1: | 3351 | case 1: |
| 3353 | READ64(*maxsize); | 3352 | READ64(*maxsize); |
| 3354 | break; | 3353 | break; |
| 3355 | case 2: | 3354 | case 2: |
| 3356 | READ32(nblocks); | 3355 | READ32(nblocks); |
| 3357 | READ32(blocksize); | 3356 | READ32(blocksize); |
| 3358 | *maxsize = (uint64_t)nblocks * (uint64_t)blocksize; | 3357 | *maxsize = (uint64_t)nblocks * (uint64_t)blocksize; |
| 3359 | } | 3358 | } |
| 3360 | return 0; | 3359 | return 0; |
| 3361 | } | 3360 | } |
| 3362 | 3361 | ||
| 3363 | static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) | 3362 | static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) |
| 3364 | { | 3363 | { |
| 3365 | __be32 *p; | 3364 | __be32 *p; |
| 3366 | uint32_t delegation_type; | 3365 | uint32_t delegation_type; |
| 3367 | 3366 | ||
| 3368 | READ_BUF(4); | 3367 | READ_BUF(4); |
| 3369 | READ32(delegation_type); | 3368 | READ32(delegation_type); |
| @@ -3374,13 +3373,14 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) | |||
| 3374 | READ_BUF(NFS4_STATEID_SIZE+4); | 3373 | READ_BUF(NFS4_STATEID_SIZE+4); |
| 3375 | COPYMEM(res->delegation.data, NFS4_STATEID_SIZE); | 3374 | COPYMEM(res->delegation.data, NFS4_STATEID_SIZE); |
| 3376 | READ32(res->do_recall); | 3375 | READ32(res->do_recall); |
| 3376 | |||
| 3377 | switch (delegation_type) { | 3377 | switch (delegation_type) { |
| 3378 | case NFS4_OPEN_DELEGATE_READ: | 3378 | case NFS4_OPEN_DELEGATE_READ: |
| 3379 | res->delegation_type = FMODE_READ; | 3379 | res->delegation_type = FMODE_READ; |
| 3380 | break; | 3380 | break; |
| 3381 | case NFS4_OPEN_DELEGATE_WRITE: | 3381 | case NFS4_OPEN_DELEGATE_WRITE: |
| 3382 | res->delegation_type = FMODE_WRITE|FMODE_READ; | 3382 | res->delegation_type = FMODE_WRITE|FMODE_READ; |
| 3383 | if (decode_space_limit(xdr, &res->maxsize) < 0) | 3383 | if (decode_space_limit(xdr, &res->maxsize) < 0) |
| 3384 | return -EIO; | 3384 | return -EIO; |
| 3385 | } | 3385 | } |
| 3386 | return decode_ace(xdr, NULL, res->server->nfs_client); | 3386 | return decode_ace(xdr, NULL, res->server->nfs_client); |
| @@ -3388,27 +3388,27 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) | |||
| 3388 | 3388 | ||
| 3389 | static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res) | 3389 | static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res) |
| 3390 | { | 3390 | { |
| 3391 | __be32 *p; | 3391 | __be32 *p; |
| 3392 | uint32_t savewords, bmlen, i; | 3392 | uint32_t savewords, bmlen, i; |
| 3393 | int status; | 3393 | int status; |
| 3394 | 3394 | ||
| 3395 | status = decode_op_hdr(xdr, OP_OPEN); | 3395 | status = decode_op_hdr(xdr, OP_OPEN); |
| 3396 | if (status != -EIO) | 3396 | if (status != -EIO) |
| 3397 | nfs_increment_open_seqid(status, res->seqid); | 3397 | nfs_increment_open_seqid(status, res->seqid); |
| 3398 | if (status) | 3398 | if (status) |
| 3399 | return status; | 3399 | return status; |
| 3400 | READ_BUF(NFS4_STATEID_SIZE); | 3400 | READ_BUF(NFS4_STATEID_SIZE); |
| 3401 | COPYMEM(res->stateid.data, NFS4_STATEID_SIZE); | 3401 | COPYMEM(res->stateid.data, NFS4_STATEID_SIZE); |
| 3402 | 3402 | ||
| 3403 | decode_change_info(xdr, &res->cinfo); | 3403 | decode_change_info(xdr, &res->cinfo); |
| 3404 | 3404 | ||
| 3405 | READ_BUF(8); | 3405 | READ_BUF(8); |
| 3406 | READ32(res->rflags); | 3406 | READ32(res->rflags); |
| 3407 | READ32(bmlen); | 3407 | READ32(bmlen); |
| 3408 | if (bmlen > 10) | 3408 | if (bmlen > 10) |
| 3409 | goto xdr_error; | 3409 | goto xdr_error; |
| 3410 | 3410 | ||
| 3411 | READ_BUF(bmlen << 2); | 3411 | READ_BUF(bmlen << 2); |
| 3412 | savewords = min_t(uint32_t, bmlen, NFS4_BITMAP_SIZE); | 3412 | savewords = min_t(uint32_t, bmlen, NFS4_BITMAP_SIZE); |
| 3413 | for (i = 0; i < savewords; ++i) | 3413 | for (i = 0; i < savewords; ++i) |
| 3414 | READ32(res->attrset[i]); | 3414 | READ32(res->attrset[i]); |
| @@ -3423,17 +3423,17 @@ xdr_error: | |||
| 3423 | 3423 | ||
| 3424 | static int decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmres *res) | 3424 | static int decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmres *res) |
| 3425 | { | 3425 | { |
| 3426 | __be32 *p; | 3426 | __be32 *p; |
| 3427 | int status; | 3427 | int status; |
| 3428 | 3428 | ||
| 3429 | status = decode_op_hdr(xdr, OP_OPEN_CONFIRM); | 3429 | status = decode_op_hdr(xdr, OP_OPEN_CONFIRM); |
| 3430 | if (status != -EIO) | 3430 | if (status != -EIO) |
| 3431 | nfs_increment_open_seqid(status, res->seqid); | 3431 | nfs_increment_open_seqid(status, res->seqid); |
| 3432 | if (status) | 3432 | if (status) |
| 3433 | return status; | 3433 | return status; |
| 3434 | READ_BUF(NFS4_STATEID_SIZE); | 3434 | READ_BUF(NFS4_STATEID_SIZE); |
| 3435 | COPYMEM(res->stateid.data, NFS4_STATEID_SIZE); | 3435 | COPYMEM(res->stateid.data, NFS4_STATEID_SIZE); |
| 3436 | return 0; | 3436 | return 0; |
| 3437 | } | 3437 | } |
| 3438 | 3438 | ||
| 3439 | static int decode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeres *res) | 3439 | static int decode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeres *res) |
| @@ -3794,23 +3794,23 @@ static int decode_delegreturn(struct xdr_stream *xdr) | |||
| 3794 | */ | 3794 | */ |
| 3795 | static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res) | 3795 | static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res) |
| 3796 | { | 3796 | { |
| 3797 | struct xdr_stream xdr; | 3797 | struct xdr_stream xdr; |
| 3798 | struct compound_hdr hdr; | 3798 | struct compound_hdr hdr; |
| 3799 | int status; | 3799 | int status; |
| 3800 | 3800 | ||
| 3801 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 3801 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); |
| 3802 | status = decode_compound_hdr(&xdr, &hdr); | 3802 | status = decode_compound_hdr(&xdr, &hdr); |
| 3803 | if (status) | 3803 | if (status) |
| 3804 | goto out; | 3804 | goto out; |
| 3805 | status = decode_putfh(&xdr); | 3805 | status = decode_putfh(&xdr); |
| 3806 | if (status) | 3806 | if (status) |
| 3807 | goto out; | 3807 | goto out; |
| 3808 | status = decode_open_downgrade(&xdr, res); | 3808 | status = decode_open_downgrade(&xdr, res); |
| 3809 | if (status != 0) | 3809 | if (status != 0) |
| 3810 | goto out; | 3810 | goto out; |
| 3811 | decode_getfattr(&xdr, res->fattr, res->server); | 3811 | decode_getfattr(&xdr, res->fattr, res->server); |
| 3812 | out: | 3812 | out: |
| 3813 | return status; | 3813 | return status; |
| 3814 | } | 3814 | } |
| 3815 | 3815 | ||
| 3816 | /* | 3816 | /* |
| @@ -4023,7 +4023,6 @@ static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_g | |||
| 4023 | status = decode_getfattr(&xdr, res->fattr, res->server); | 4023 | status = decode_getfattr(&xdr, res->fattr, res->server); |
| 4024 | out: | 4024 | out: |
| 4025 | return status; | 4025 | return status; |
| 4026 | |||
| 4027 | } | 4026 | } |
| 4028 | 4027 | ||
| 4029 | /* | 4028 | /* |
| @@ -4032,21 +4031,22 @@ out: | |||
| 4032 | static int | 4031 | static int |
| 4033 | nfs4_xdr_enc_setacl(struct rpc_rqst *req, __be32 *p, struct nfs_setaclargs *args) | 4032 | nfs4_xdr_enc_setacl(struct rpc_rqst *req, __be32 *p, struct nfs_setaclargs *args) |
| 4034 | { | 4033 | { |
| 4035 | struct xdr_stream xdr; | 4034 | struct xdr_stream xdr; |
| 4036 | struct compound_hdr hdr = { | 4035 | struct compound_hdr hdr = { |
| 4037 | .nops = 2, | 4036 | .nops = 2, |
| 4038 | }; | 4037 | }; |
| 4039 | int status; | 4038 | int status; |
| 4040 | 4039 | ||
| 4041 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); | 4040 | xdr_init_encode(&xdr, &req->rq_snd_buf, p); |
| 4042 | encode_compound_hdr(&xdr, &hdr); | 4041 | encode_compound_hdr(&xdr, &hdr); |
| 4043 | status = encode_putfh(&xdr, args->fh); | 4042 | status = encode_putfh(&xdr, args->fh); |
| 4044 | if (status) | 4043 | if (status) |
| 4045 | goto out; | 4044 | goto out; |
| 4046 | status = encode_setacl(&xdr, args); | 4045 | status = encode_setacl(&xdr, args); |
| 4047 | out: | 4046 | out: |
| 4048 | return status; | 4047 | return status; |
| 4049 | } | 4048 | } |
| 4049 | |||
| 4050 | /* | 4050 | /* |
| 4051 | * Decode SETACL response | 4051 | * Decode SETACL response |
| 4052 | */ | 4052 | */ |
| @@ -4097,18 +4097,18 @@ out: | |||
| 4097 | */ | 4097 | */ |
| 4098 | static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res) | 4098 | static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_closeres *res) |
| 4099 | { | 4099 | { |
| 4100 | struct xdr_stream xdr; | 4100 | struct xdr_stream xdr; |
| 4101 | struct compound_hdr hdr; | 4101 | struct compound_hdr hdr; |
| 4102 | int status; | 4102 | int status; |
| 4103 | 4103 | ||
| 4104 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 4104 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); |
| 4105 | status = decode_compound_hdr(&xdr, &hdr); | 4105 | status = decode_compound_hdr(&xdr, &hdr); |
| 4106 | if (status) | 4106 | if (status) |
| 4107 | goto out; | 4107 | goto out; |
| 4108 | status = decode_putfh(&xdr); | 4108 | status = decode_putfh(&xdr); |
| 4109 | if (status) | 4109 | if (status) |
| 4110 | goto out; | 4110 | goto out; |
| 4111 | status = decode_close(&xdr, res); | 4111 | status = decode_close(&xdr, res); |
| 4112 | if (status != 0) | 4112 | if (status != 0) |
| 4113 | goto out; | 4113 | goto out; |
| 4114 | /* | 4114 | /* |
| @@ -4119,7 +4119,7 @@ static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, __be32 *p, struct nfs_clos | |||
| 4119 | */ | 4119 | */ |
| 4120 | decode_getfattr(&xdr, res->fattr, res->server); | 4120 | decode_getfattr(&xdr, res->fattr, res->server); |
| 4121 | out: | 4121 | out: |
| 4122 | return status; | 4122 | return status; |
| 4123 | } | 4123 | } |
| 4124 | 4124 | ||
| 4125 | /* | 4125 | /* |
| @@ -4127,23 +4127,23 @@ out: | |||
| 4127 | */ | 4127 | */ |
| 4128 | static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res) | 4128 | static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res) |
| 4129 | { | 4129 | { |
| 4130 | struct xdr_stream xdr; | 4130 | struct xdr_stream xdr; |
| 4131 | struct compound_hdr hdr; | 4131 | struct compound_hdr hdr; |
| 4132 | int status; | 4132 | int status; |
| 4133 | 4133 | ||
| 4134 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 4134 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); |
| 4135 | status = decode_compound_hdr(&xdr, &hdr); | 4135 | status = decode_compound_hdr(&xdr, &hdr); |
| 4136 | if (status) | 4136 | if (status) |
| 4137 | goto out; | 4137 | goto out; |
| 4138 | status = decode_putfh(&xdr); | 4138 | status = decode_putfh(&xdr); |
| 4139 | if (status) | 4139 | if (status) |
| 4140 | goto out; | 4140 | goto out; |
| 4141 | status = decode_savefh(&xdr); | 4141 | status = decode_savefh(&xdr); |
| 4142 | if (status) | ||
| 4143 | goto out; | ||
| 4144 | status = decode_open(&xdr, res); | ||
| 4142 | if (status) | 4145 | if (status) |
| 4143 | goto out; | 4146 | goto out; |
| 4144 | status = decode_open(&xdr, res); | ||
| 4145 | if (status) | ||
| 4146 | goto out; | ||
| 4147 | if (decode_getfh(&xdr, &res->fh) != 0) | 4147 | if (decode_getfh(&xdr, &res->fh) != 0) |
| 4148 | goto out; | 4148 | goto out; |
| 4149 | if (decode_getfattr(&xdr, res->f_attr, res->server) != 0) | 4149 | if (decode_getfattr(&xdr, res->f_attr, res->server) != 0) |
| @@ -4152,7 +4152,7 @@ static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openr | |||
| 4152 | goto out; | 4152 | goto out; |
| 4153 | decode_getfattr(&xdr, res->dir_attr, res->server); | 4153 | decode_getfattr(&xdr, res->dir_attr, res->server); |
| 4154 | out: | 4154 | out: |
| 4155 | return status; | 4155 | return status; |
| 4156 | } | 4156 | } |
| 4157 | 4157 | ||
| 4158 | /* | 4158 | /* |
| @@ -4160,20 +4160,20 @@ out: | |||
| 4160 | */ | 4160 | */ |
| 4161 | static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, __be32 *p, struct nfs_open_confirmres *res) | 4161 | static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, __be32 *p, struct nfs_open_confirmres *res) |
| 4162 | { | 4162 | { |
| 4163 | struct xdr_stream xdr; | 4163 | struct xdr_stream xdr; |
| 4164 | struct compound_hdr hdr; | 4164 | struct compound_hdr hdr; |
| 4165 | int status; | 4165 | int status; |
| 4166 | 4166 | ||
| 4167 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 4167 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); |
| 4168 | status = decode_compound_hdr(&xdr, &hdr); | 4168 | status = decode_compound_hdr(&xdr, &hdr); |
| 4169 | if (status) | 4169 | if (status) |
| 4170 | goto out; | 4170 | goto out; |
| 4171 | status = decode_putfh(&xdr); | 4171 | status = decode_putfh(&xdr); |
| 4172 | if (status) | 4172 | if (status) |
| 4173 | goto out; | 4173 | goto out; |
| 4174 | status = decode_open_confirm(&xdr, res); | 4174 | status = decode_open_confirm(&xdr, res); |
| 4175 | out: | 4175 | out: |
| 4176 | return status; | 4176 | return status; |
| 4177 | } | 4177 | } |
| 4178 | 4178 | ||
| 4179 | /* | 4179 | /* |
| @@ -4181,23 +4181,23 @@ out: | |||
| 4181 | */ | 4181 | */ |
| 4182 | static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res) | 4182 | static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_openres *res) |
| 4183 | { | 4183 | { |
| 4184 | struct xdr_stream xdr; | 4184 | struct xdr_stream xdr; |
| 4185 | struct compound_hdr hdr; | 4185 | struct compound_hdr hdr; |
| 4186 | int status; | 4186 | int status; |
| 4187 | 4187 | ||
| 4188 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 4188 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); |
| 4189 | status = decode_compound_hdr(&xdr, &hdr); | 4189 | status = decode_compound_hdr(&xdr, &hdr); |
| 4190 | if (status) | 4190 | if (status) |
| 4191 | goto out; | 4191 | goto out; |
| 4192 | status = decode_putfh(&xdr); | 4192 | status = decode_putfh(&xdr); |
| 4193 | if (status) | 4193 | if (status) |
| 4194 | goto out; | 4194 | goto out; |
| 4195 | status = decode_open(&xdr, res); | 4195 | status = decode_open(&xdr, res); |
| 4196 | if (status) | 4196 | if (status) |
| 4197 | goto out; | 4197 | goto out; |
| 4198 | decode_getfattr(&xdr, res->f_attr, res->server); | 4198 | decode_getfattr(&xdr, res->f_attr, res->server); |
| 4199 | out: | 4199 | out: |
| 4200 | return status; | 4200 | return status; |
| 4201 | } | 4201 | } |
| 4202 | 4202 | ||
| 4203 | /* | 4203 | /* |
| @@ -4205,25 +4205,25 @@ out: | |||
| 4205 | */ | 4205 | */ |
| 4206 | static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_setattrres *res) | 4206 | static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, __be32 *p, struct nfs_setattrres *res) |
| 4207 | { | 4207 | { |
| 4208 | struct xdr_stream xdr; | 4208 | struct xdr_stream xdr; |
| 4209 | struct compound_hdr hdr; | 4209 | struct compound_hdr hdr; |
| 4210 | int status; | 4210 | int status; |
| 4211 | 4211 | ||
| 4212 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); | 4212 | xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); |
| 4213 | status = decode_compound_hdr(&xdr, &hdr); | 4213 | status = decode_compound_hdr(&xdr, &hdr); |
| 4214 | if (status) | 4214 | if (status) |
| 4215 | goto out; | 4215 | goto out; |
| 4216 | status = decode_putfh(&xdr); | 4216 | status = decode_putfh(&xdr); |
| 4217 | if (status) | 4217 | if (status) |
| 4218 | goto out; | 4218 | goto out; |
| 4219 | status = decode_setattr(&xdr, res); | 4219 | status = decode_setattr(&xdr, res); |
| 4220 | if (status) | 4220 | if (status) |
| 4221 | goto out; | 4221 | goto out; |
| 4222 | status = decode_getfattr(&xdr, res->fattr, res->server); | 4222 | status = decode_getfattr(&xdr, res->fattr, res->server); |
| 4223 | if (status == NFS4ERR_DELAY) | 4223 | if (status == NFS4ERR_DELAY) |
| 4224 | status = 0; | 4224 | status = 0; |
| 4225 | out: | 4225 | out: |
| 4226 | return status; | 4226 | return status; |
| 4227 | } | 4227 | } |
| 4228 | 4228 | ||
| 4229 | /* | 4229 | /* |
| @@ -4707,7 +4707,7 @@ nfs4_stat_to_errno(int stat) | |||
| 4707 | .p_replen = NFS4_##restype##_sz, \ | 4707 | .p_replen = NFS4_##restype##_sz, \ |
| 4708 | .p_statidx = NFSPROC4_CLNT_##proc, \ | 4708 | .p_statidx = NFSPROC4_CLNT_##proc, \ |
| 4709 | .p_name = #proc, \ | 4709 | .p_name = #proc, \ |
| 4710 | } | 4710 | } |
| 4711 | 4711 | ||
| 4712 | struct rpc_procinfo nfs4_procedures[] = { | 4712 | struct rpc_procinfo nfs4_procedures[] = { |
| 4713 | PROC(READ, enc_read, dec_read), | 4713 | PROC(READ, enc_read, dec_read), |
