diff options
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 115 |
1 files changed, 86 insertions, 29 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index f35a94a04026..956629b9cdc9 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -44,13 +44,14 @@ | |||
44 | #include <linux/namei.h> | 44 | #include <linux/namei.h> |
45 | #include <linux/statfs.h> | 45 | #include <linux/statfs.h> |
46 | #include <linux/utsname.h> | 46 | #include <linux/utsname.h> |
47 | #include <linux/nfsd_idmap.h> | ||
48 | #include <linux/nfs4_acl.h> | ||
49 | #include <linux/sunrpc/svcauth_gss.h> | 47 | #include <linux/sunrpc/svcauth_gss.h> |
50 | 48 | ||
49 | #include "idmap.h" | ||
50 | #include "acl.h" | ||
51 | #include "xdr4.h" | 51 | #include "xdr4.h" |
52 | #include "vfs.h" | 52 | #include "vfs.h" |
53 | 53 | ||
54 | |||
54 | #define NFSDDBG_FACILITY NFSDDBG_XDR | 55 | #define NFSDDBG_FACILITY NFSDDBG_XDR |
55 | 56 | ||
56 | /* | 57 | /* |
@@ -288,17 +289,17 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, | |||
288 | len += XDR_QUADLEN(dummy32) << 2; | 289 | len += XDR_QUADLEN(dummy32) << 2; |
289 | READMEM(buf, dummy32); | 290 | READMEM(buf, dummy32); |
290 | ace->whotype = nfs4_acl_get_whotype(buf, dummy32); | 291 | ace->whotype = nfs4_acl_get_whotype(buf, dummy32); |
291 | host_err = 0; | 292 | status = nfs_ok; |
292 | if (ace->whotype != NFS4_ACL_WHO_NAMED) | 293 | if (ace->whotype != NFS4_ACL_WHO_NAMED) |
293 | ace->who = 0; | 294 | ace->who = 0; |
294 | else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP) | 295 | else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP) |
295 | host_err = nfsd_map_name_to_gid(argp->rqstp, | 296 | status = nfsd_map_name_to_gid(argp->rqstp, |
296 | buf, dummy32, &ace->who); | 297 | buf, dummy32, &ace->who); |
297 | else | 298 | else |
298 | host_err = nfsd_map_name_to_uid(argp->rqstp, | 299 | status = nfsd_map_name_to_uid(argp->rqstp, |
299 | buf, dummy32, &ace->who); | 300 | buf, dummy32, &ace->who); |
300 | if (host_err) | 301 | if (status) |
301 | goto out_nfserr; | 302 | return status; |
302 | } | 303 | } |
303 | } else | 304 | } else |
304 | *acl = NULL; | 305 | *acl = NULL; |
@@ -420,6 +421,21 @@ nfsd4_decode_access(struct nfsd4_compoundargs *argp, struct nfsd4_access *access | |||
420 | DECODE_TAIL; | 421 | DECODE_TAIL; |
421 | } | 422 | } |
422 | 423 | ||
424 | static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts) | ||
425 | { | ||
426 | DECODE_HEAD; | ||
427 | u32 dummy; | ||
428 | |||
429 | READ_BUF(NFS4_MAX_SESSIONID_LEN + 8); | ||
430 | COPYMEM(bcts->sessionid.data, NFS4_MAX_SESSIONID_LEN); | ||
431 | READ32(bcts->dir); | ||
432 | /* XXX: Perhaps Tom Tucker could help us figure out how we | ||
433 | * should be using ctsa_use_conn_in_rdma_mode: */ | ||
434 | READ32(dummy); | ||
435 | |||
436 | DECODE_TAIL; | ||
437 | } | ||
438 | |||
423 | static __be32 | 439 | static __be32 |
424 | nfsd4_decode_close(struct nfsd4_compoundargs *argp, struct nfsd4_close *close) | 440 | nfsd4_decode_close(struct nfsd4_compoundargs *argp, struct nfsd4_close *close) |
425 | { | 441 | { |
@@ -847,6 +863,17 @@ nfsd4_decode_secinfo(struct nfsd4_compoundargs *argp, | |||
847 | } | 863 | } |
848 | 864 | ||
849 | static __be32 | 865 | static __be32 |
866 | nfsd4_decode_secinfo_no_name(struct nfsd4_compoundargs *argp, | ||
867 | struct nfsd4_secinfo_no_name *sin) | ||
868 | { | ||
869 | DECODE_HEAD; | ||
870 | |||
871 | READ_BUF(4); | ||
872 | READ32(sin->sin_style); | ||
873 | DECODE_TAIL; | ||
874 | } | ||
875 | |||
876 | static __be32 | ||
850 | nfsd4_decode_setattr(struct nfsd4_compoundargs *argp, struct nfsd4_setattr *setattr) | 877 | nfsd4_decode_setattr(struct nfsd4_compoundargs *argp, struct nfsd4_setattr *setattr) |
851 | { | 878 | { |
852 | __be32 status; | 879 | __be32 status; |
@@ -1005,7 +1032,7 @@ static __be32 | |||
1005 | nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp, | 1032 | nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp, |
1006 | struct nfsd4_exchange_id *exid) | 1033 | struct nfsd4_exchange_id *exid) |
1007 | { | 1034 | { |
1008 | int dummy; | 1035 | int dummy, tmp; |
1009 | DECODE_HEAD; | 1036 | DECODE_HEAD; |
1010 | 1037 | ||
1011 | READ_BUF(NFS4_VERIFIER_SIZE); | 1038 | READ_BUF(NFS4_VERIFIER_SIZE); |
@@ -1053,15 +1080,23 @@ nfsd4_decode_exchange_id(struct nfsd4_compoundargs *argp, | |||
1053 | 1080 | ||
1054 | /* ssp_hash_algs<> */ | 1081 | /* ssp_hash_algs<> */ |
1055 | READ_BUF(4); | 1082 | READ_BUF(4); |
1056 | READ32(dummy); | 1083 | READ32(tmp); |
1057 | READ_BUF(dummy); | 1084 | while (tmp--) { |
1058 | p += XDR_QUADLEN(dummy); | 1085 | READ_BUF(4); |
1086 | READ32(dummy); | ||
1087 | READ_BUF(dummy); | ||
1088 | p += XDR_QUADLEN(dummy); | ||
1089 | } | ||
1059 | 1090 | ||
1060 | /* ssp_encr_algs<> */ | 1091 | /* ssp_encr_algs<> */ |
1061 | READ_BUF(4); | 1092 | READ_BUF(4); |
1062 | READ32(dummy); | 1093 | READ32(tmp); |
1063 | READ_BUF(dummy); | 1094 | while (tmp--) { |
1064 | p += XDR_QUADLEN(dummy); | 1095 | READ_BUF(4); |
1096 | READ32(dummy); | ||
1097 | READ_BUF(dummy); | ||
1098 | p += XDR_QUADLEN(dummy); | ||
1099 | } | ||
1065 | 1100 | ||
1066 | /* ssp_window and ssp_num_gss_handles */ | 1101 | /* ssp_window and ssp_num_gss_handles */ |
1067 | READ_BUF(8); | 1102 | READ_BUF(8); |
@@ -1339,7 +1374,7 @@ static nfsd4_dec nfsd41_dec_ops[] = { | |||
1339 | 1374 | ||
1340 | /* new operations for NFSv4.1 */ | 1375 | /* new operations for NFSv4.1 */ |
1341 | [OP_BACKCHANNEL_CTL] = (nfsd4_dec)nfsd4_decode_notsupp, | 1376 | [OP_BACKCHANNEL_CTL] = (nfsd4_dec)nfsd4_decode_notsupp, |
1342 | [OP_BIND_CONN_TO_SESSION]= (nfsd4_dec)nfsd4_decode_notsupp, | 1377 | [OP_BIND_CONN_TO_SESSION]= (nfsd4_dec)nfsd4_decode_bind_conn_to_session, |
1343 | [OP_EXCHANGE_ID] = (nfsd4_dec)nfsd4_decode_exchange_id, | 1378 | [OP_EXCHANGE_ID] = (nfsd4_dec)nfsd4_decode_exchange_id, |
1344 | [OP_CREATE_SESSION] = (nfsd4_dec)nfsd4_decode_create_session, | 1379 | [OP_CREATE_SESSION] = (nfsd4_dec)nfsd4_decode_create_session, |
1345 | [OP_DESTROY_SESSION] = (nfsd4_dec)nfsd4_decode_destroy_session, | 1380 | [OP_DESTROY_SESSION] = (nfsd4_dec)nfsd4_decode_destroy_session, |
@@ -1350,7 +1385,7 @@ static nfsd4_dec nfsd41_dec_ops[] = { | |||
1350 | [OP_LAYOUTCOMMIT] = (nfsd4_dec)nfsd4_decode_notsupp, | 1385 | [OP_LAYOUTCOMMIT] = (nfsd4_dec)nfsd4_decode_notsupp, |
1351 | [OP_LAYOUTGET] = (nfsd4_dec)nfsd4_decode_notsupp, | 1386 | [OP_LAYOUTGET] = (nfsd4_dec)nfsd4_decode_notsupp, |
1352 | [OP_LAYOUTRETURN] = (nfsd4_dec)nfsd4_decode_notsupp, | 1387 | [OP_LAYOUTRETURN] = (nfsd4_dec)nfsd4_decode_notsupp, |
1353 | [OP_SECINFO_NO_NAME] = (nfsd4_dec)nfsd4_decode_notsupp, | 1388 | [OP_SECINFO_NO_NAME] = (nfsd4_dec)nfsd4_decode_secinfo_no_name, |
1354 | [OP_SEQUENCE] = (nfsd4_dec)nfsd4_decode_sequence, | 1389 | [OP_SEQUENCE] = (nfsd4_dec)nfsd4_decode_sequence, |
1355 | [OP_SET_SSV] = (nfsd4_dec)nfsd4_decode_notsupp, | 1390 | [OP_SET_SSV] = (nfsd4_dec)nfsd4_decode_notsupp, |
1356 | [OP_TEST_STATEID] = (nfsd4_dec)nfsd4_decode_notsupp, | 1391 | [OP_TEST_STATEID] = (nfsd4_dec)nfsd4_decode_notsupp, |
@@ -2309,8 +2344,6 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen, | |||
2309 | case nfserr_resource: | 2344 | case nfserr_resource: |
2310 | nfserr = nfserr_toosmall; | 2345 | nfserr = nfserr_toosmall; |
2311 | goto fail; | 2346 | goto fail; |
2312 | case nfserr_dropit: | ||
2313 | goto fail; | ||
2314 | case nfserr_noent: | 2347 | case nfserr_noent: |
2315 | goto skip_entry; | 2348 | goto skip_entry; |
2316 | default: | 2349 | default: |
@@ -2365,6 +2398,21 @@ nfsd4_encode_access(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_ | |||
2365 | return nfserr; | 2398 | return nfserr; |
2366 | } | 2399 | } |
2367 | 2400 | ||
2401 | static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_bind_conn_to_session *bcts) | ||
2402 | { | ||
2403 | __be32 *p; | ||
2404 | |||
2405 | if (!nfserr) { | ||
2406 | RESERVE_SPACE(NFS4_MAX_SESSIONID_LEN + 8); | ||
2407 | WRITEMEM(bcts->sessionid.data, NFS4_MAX_SESSIONID_LEN); | ||
2408 | WRITE32(bcts->dir); | ||
2409 | /* XXX: ? */ | ||
2410 | WRITE32(0); | ||
2411 | ADJUST_ARGS(); | ||
2412 | } | ||
2413 | return nfserr; | ||
2414 | } | ||
2415 | |||
2368 | static __be32 | 2416 | static __be32 |
2369 | nfsd4_encode_close(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_close *close) | 2417 | nfsd4_encode_close(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_close *close) |
2370 | { | 2418 | { |
@@ -2826,11 +2874,10 @@ nfsd4_encode_rename(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_ | |||
2826 | } | 2874 | } |
2827 | 2875 | ||
2828 | static __be32 | 2876 | static __be32 |
2829 | nfsd4_encode_secinfo(struct nfsd4_compoundres *resp, __be32 nfserr, | 2877 | nfsd4_do_encode_secinfo(struct nfsd4_compoundres *resp, |
2830 | struct nfsd4_secinfo *secinfo) | 2878 | __be32 nfserr,struct svc_export *exp) |
2831 | { | 2879 | { |
2832 | int i = 0; | 2880 | int i = 0; |
2833 | struct svc_export *exp = secinfo->si_exp; | ||
2834 | u32 nflavs; | 2881 | u32 nflavs; |
2835 | struct exp_flavor_info *flavs; | 2882 | struct exp_flavor_info *flavs; |
2836 | struct exp_flavor_info def_flavs[2]; | 2883 | struct exp_flavor_info def_flavs[2]; |
@@ -2892,6 +2939,20 @@ out: | |||
2892 | return nfserr; | 2939 | return nfserr; |
2893 | } | 2940 | } |
2894 | 2941 | ||
2942 | static __be32 | ||
2943 | nfsd4_encode_secinfo(struct nfsd4_compoundres *resp, __be32 nfserr, | ||
2944 | struct nfsd4_secinfo *secinfo) | ||
2945 | { | ||
2946 | return nfsd4_do_encode_secinfo(resp, nfserr, secinfo->si_exp); | ||
2947 | } | ||
2948 | |||
2949 | static __be32 | ||
2950 | nfsd4_encode_secinfo_no_name(struct nfsd4_compoundres *resp, __be32 nfserr, | ||
2951 | struct nfsd4_secinfo_no_name *secinfo) | ||
2952 | { | ||
2953 | return nfsd4_do_encode_secinfo(resp, nfserr, secinfo->sin_exp); | ||
2954 | } | ||
2955 | |||
2895 | /* | 2956 | /* |
2896 | * The SETATTR encode routine is special -- it always encodes a bitmap, | 2957 | * The SETATTR encode routine is special -- it always encodes a bitmap, |
2897 | * regardless of the error status. | 2958 | * regardless of the error status. |
@@ -3076,13 +3137,9 @@ nfsd4_encode_sequence(struct nfsd4_compoundres *resp, int nfserr, | |||
3076 | WRITE32(seq->seqid); | 3137 | WRITE32(seq->seqid); |
3077 | WRITE32(seq->slotid); | 3138 | WRITE32(seq->slotid); |
3078 | WRITE32(seq->maxslots); | 3139 | WRITE32(seq->maxslots); |
3079 | /* | 3140 | /* For now: target_maxslots = maxslots */ |
3080 | * FIXME: for now: | ||
3081 | * target_maxslots = maxslots | ||
3082 | * status_flags = 0 | ||
3083 | */ | ||
3084 | WRITE32(seq->maxslots); | 3141 | WRITE32(seq->maxslots); |
3085 | WRITE32(0); | 3142 | WRITE32(seq->status_flags); |
3086 | 3143 | ||
3087 | ADJUST_ARGS(); | 3144 | ADJUST_ARGS(); |
3088 | resp->cstate.datap = p; /* DRC cache data pointer */ | 3145 | resp->cstate.datap = p; /* DRC cache data pointer */ |
@@ -3143,7 +3200,7 @@ static nfsd4_enc nfsd4_enc_ops[] = { | |||
3143 | 3200 | ||
3144 | /* NFSv4.1 operations */ | 3201 | /* NFSv4.1 operations */ |
3145 | [OP_BACKCHANNEL_CTL] = (nfsd4_enc)nfsd4_encode_noop, | 3202 | [OP_BACKCHANNEL_CTL] = (nfsd4_enc)nfsd4_encode_noop, |
3146 | [OP_BIND_CONN_TO_SESSION] = (nfsd4_enc)nfsd4_encode_noop, | 3203 | [OP_BIND_CONN_TO_SESSION] = (nfsd4_enc)nfsd4_encode_bind_conn_to_session, |
3147 | [OP_EXCHANGE_ID] = (nfsd4_enc)nfsd4_encode_exchange_id, | 3204 | [OP_EXCHANGE_ID] = (nfsd4_enc)nfsd4_encode_exchange_id, |
3148 | [OP_CREATE_SESSION] = (nfsd4_enc)nfsd4_encode_create_session, | 3205 | [OP_CREATE_SESSION] = (nfsd4_enc)nfsd4_encode_create_session, |
3149 | [OP_DESTROY_SESSION] = (nfsd4_enc)nfsd4_encode_destroy_session, | 3206 | [OP_DESTROY_SESSION] = (nfsd4_enc)nfsd4_encode_destroy_session, |
@@ -3154,7 +3211,7 @@ static nfsd4_enc nfsd4_enc_ops[] = { | |||
3154 | [OP_LAYOUTCOMMIT] = (nfsd4_enc)nfsd4_encode_noop, | 3211 | [OP_LAYOUTCOMMIT] = (nfsd4_enc)nfsd4_encode_noop, |
3155 | [OP_LAYOUTGET] = (nfsd4_enc)nfsd4_encode_noop, | 3212 | [OP_LAYOUTGET] = (nfsd4_enc)nfsd4_encode_noop, |
3156 | [OP_LAYOUTRETURN] = (nfsd4_enc)nfsd4_encode_noop, | 3213 | [OP_LAYOUTRETURN] = (nfsd4_enc)nfsd4_encode_noop, |
3157 | [OP_SECINFO_NO_NAME] = (nfsd4_enc)nfsd4_encode_noop, | 3214 | [OP_SECINFO_NO_NAME] = (nfsd4_enc)nfsd4_encode_secinfo_no_name, |
3158 | [OP_SEQUENCE] = (nfsd4_enc)nfsd4_encode_sequence, | 3215 | [OP_SEQUENCE] = (nfsd4_enc)nfsd4_encode_sequence, |
3159 | [OP_SET_SSV] = (nfsd4_enc)nfsd4_encode_noop, | 3216 | [OP_SET_SSV] = (nfsd4_enc)nfsd4_encode_noop, |
3160 | [OP_TEST_STATEID] = (nfsd4_enc)nfsd4_encode_noop, | 3217 | [OP_TEST_STATEID] = (nfsd4_enc)nfsd4_encode_noop, |