diff options
author | J. Bruce Fields <bfields@redhat.com> | 2017-05-06 11:12:04 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2017-08-24 22:12:49 -0400 |
commit | bac966d6065207b6900a4c2a3e6e5f78cfee7b4d (patch) | |
tree | 21055a52f639cd01c94d699795b6dc4620df877f | |
parent | b7571e4cd39ae860379138b883bc5f57a8553184 (diff) |
nfsd4: individual encoders no longer see error cases
With a few exceptions, most individual encoders don't handle error
cases.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 309 |
1 files changed, 103 insertions, 206 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 08badcf64554..18b9c2fad29a 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -3105,14 +3105,12 @@ nfsd4_encode_access(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_ | |||
3105 | struct xdr_stream *xdr = &resp->xdr; | 3105 | struct xdr_stream *xdr = &resp->xdr; |
3106 | __be32 *p; | 3106 | __be32 *p; |
3107 | 3107 | ||
3108 | if (!nfserr) { | 3108 | p = xdr_reserve_space(xdr, 8); |
3109 | p = xdr_reserve_space(xdr, 8); | 3109 | if (!p) |
3110 | if (!p) | 3110 | return nfserr_resource; |
3111 | return nfserr_resource; | 3111 | *p++ = cpu_to_be32(access->ac_supported); |
3112 | *p++ = cpu_to_be32(access->ac_supported); | 3112 | *p++ = cpu_to_be32(access->ac_resp_access); |
3113 | *p++ = cpu_to_be32(access->ac_resp_access); | 3113 | return 0; |
3114 | } | ||
3115 | return nfserr; | ||
3116 | } | 3114 | } |
3117 | 3115 | ||
3118 | static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_bind_conn_to_session *bcts) | 3116 | static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_bind_conn_to_session *bcts) |
@@ -3120,17 +3118,15 @@ static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp, | |||
3120 | struct xdr_stream *xdr = &resp->xdr; | 3118 | struct xdr_stream *xdr = &resp->xdr; |
3121 | __be32 *p; | 3119 | __be32 *p; |
3122 | 3120 | ||
3123 | if (!nfserr) { | 3121 | p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 8); |
3124 | p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 8); | 3122 | if (!p) |
3125 | if (!p) | 3123 | return nfserr_resource; |
3126 | return nfserr_resource; | 3124 | p = xdr_encode_opaque_fixed(p, bcts->sessionid.data, |
3127 | p = xdr_encode_opaque_fixed(p, bcts->sessionid.data, | 3125 | NFS4_MAX_SESSIONID_LEN); |
3128 | NFS4_MAX_SESSIONID_LEN); | 3126 | *p++ = cpu_to_be32(bcts->dir); |
3129 | *p++ = cpu_to_be32(bcts->dir); | 3127 | /* Upshifting from TCP to RDMA is not supported */ |
3130 | /* Upshifting from TCP to RDMA is not supported */ | 3128 | *p++ = cpu_to_be32(0); |
3131 | *p++ = cpu_to_be32(0); | 3129 | return 0; |
3132 | } | ||
3133 | return nfserr; | ||
3134 | } | 3130 | } |
3135 | 3131 | ||
3136 | static __be32 | 3132 | static __be32 |
@@ -3138,10 +3134,7 @@ nfsd4_encode_close(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_c | |||
3138 | { | 3134 | { |
3139 | struct xdr_stream *xdr = &resp->xdr; | 3135 | struct xdr_stream *xdr = &resp->xdr; |
3140 | 3136 | ||
3141 | if (!nfserr) | 3137 | return nfsd4_encode_stateid(xdr, &close->cl_stateid); |
3142 | nfserr = nfsd4_encode_stateid(xdr, &close->cl_stateid); | ||
3143 | |||
3144 | return nfserr; | ||
3145 | } | 3138 | } |
3146 | 3139 | ||
3147 | 3140 | ||
@@ -3151,14 +3144,12 @@ nfsd4_encode_commit(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_ | |||
3151 | struct xdr_stream *xdr = &resp->xdr; | 3144 | struct xdr_stream *xdr = &resp->xdr; |
3152 | __be32 *p; | 3145 | __be32 *p; |
3153 | 3146 | ||
3154 | if (!nfserr) { | 3147 | p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE); |
3155 | p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE); | 3148 | if (!p) |
3156 | if (!p) | 3149 | return nfserr_resource; |
3157 | return nfserr_resource; | 3150 | p = xdr_encode_opaque_fixed(p, commit->co_verf.data, |
3158 | p = xdr_encode_opaque_fixed(p, commit->co_verf.data, | ||
3159 | NFS4_VERIFIER_SIZE); | 3151 | NFS4_VERIFIER_SIZE); |
3160 | } | 3152 | return 0; |
3161 | return nfserr; | ||
3162 | } | 3153 | } |
3163 | 3154 | ||
3164 | static __be32 | 3155 | static __be32 |
@@ -3167,15 +3158,13 @@ nfsd4_encode_create(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_ | |||
3167 | struct xdr_stream *xdr = &resp->xdr; | 3158 | struct xdr_stream *xdr = &resp->xdr; |
3168 | __be32 *p; | 3159 | __be32 *p; |
3169 | 3160 | ||
3170 | if (!nfserr) { | 3161 | p = xdr_reserve_space(xdr, 20); |
3171 | p = xdr_reserve_space(xdr, 20); | 3162 | if (!p) |
3172 | if (!p) | 3163 | return nfserr_resource; |
3173 | return nfserr_resource; | 3164 | encode_cinfo(p, &create->cr_cinfo); |
3174 | encode_cinfo(p, &create->cr_cinfo); | 3165 | nfserr = nfsd4_encode_bitmap(xdr, create->cr_bmval[0], |
3175 | nfserr = nfsd4_encode_bitmap(xdr, create->cr_bmval[0], | 3166 | create->cr_bmval[1], create->cr_bmval[2]); |
3176 | create->cr_bmval[1], create->cr_bmval[2]); | 3167 | return 0; |
3177 | } | ||
3178 | return nfserr; | ||
3179 | } | 3168 | } |
3180 | 3169 | ||
3181 | static __be32 | 3170 | static __be32 |
@@ -3184,13 +3173,8 @@ nfsd4_encode_getattr(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4 | |||
3184 | struct svc_fh *fhp = getattr->ga_fhp; | 3173 | struct svc_fh *fhp = getattr->ga_fhp; |
3185 | struct xdr_stream *xdr = &resp->xdr; | 3174 | struct xdr_stream *xdr = &resp->xdr; |
3186 | 3175 | ||
3187 | if (nfserr) | 3176 | return nfsd4_encode_fattr(xdr, fhp, fhp->fh_export, fhp->fh_dentry, |
3188 | return nfserr; | 3177 | getattr->ga_bmval, resp->rqstp, 0); |
3189 | |||
3190 | nfserr = nfsd4_encode_fattr(xdr, fhp, fhp->fh_export, fhp->fh_dentry, | ||
3191 | getattr->ga_bmval, | ||
3192 | resp->rqstp, 0); | ||
3193 | return nfserr; | ||
3194 | } | 3178 | } |
3195 | 3179 | ||
3196 | static __be32 | 3180 | static __be32 |
@@ -3201,14 +3185,12 @@ nfsd4_encode_getfh(struct nfsd4_compoundres *resp, __be32 nfserr, struct svc_fh | |||
3201 | unsigned int len; | 3185 | unsigned int len; |
3202 | __be32 *p; | 3186 | __be32 *p; |
3203 | 3187 | ||
3204 | if (!nfserr) { | 3188 | len = fhp->fh_handle.fh_size; |
3205 | len = fhp->fh_handle.fh_size; | 3189 | p = xdr_reserve_space(xdr, len + 4); |
3206 | p = xdr_reserve_space(xdr, len + 4); | 3190 | if (!p) |
3207 | if (!p) | 3191 | return nfserr_resource; |
3208 | return nfserr_resource; | 3192 | p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base, len); |
3209 | p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base, len); | 3193 | return 0; |
3210 | } | ||
3211 | return nfserr; | ||
3212 | } | 3194 | } |
3213 | 3195 | ||
3214 | /* | 3196 | /* |
@@ -3278,10 +3260,7 @@ nfsd4_encode_locku(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_l | |||
3278 | { | 3260 | { |
3279 | struct xdr_stream *xdr = &resp->xdr; | 3261 | struct xdr_stream *xdr = &resp->xdr; |
3280 | 3262 | ||
3281 | if (!nfserr) | 3263 | return nfsd4_encode_stateid(xdr, &locku->lu_stateid); |
3282 | nfserr = nfsd4_encode_stateid(xdr, &locku->lu_stateid); | ||
3283 | |||
3284 | return nfserr; | ||
3285 | } | 3264 | } |
3286 | 3265 | ||
3287 | 3266 | ||
@@ -3291,13 +3270,11 @@ nfsd4_encode_link(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_li | |||
3291 | struct xdr_stream *xdr = &resp->xdr; | 3270 | struct xdr_stream *xdr = &resp->xdr; |
3292 | __be32 *p; | 3271 | __be32 *p; |
3293 | 3272 | ||
3294 | if (!nfserr) { | 3273 | p = xdr_reserve_space(xdr, 20); |
3295 | p = xdr_reserve_space(xdr, 20); | 3274 | if (!p) |
3296 | if (!p) | 3275 | return nfserr_resource; |
3297 | return nfserr_resource; | 3276 | p = encode_cinfo(p, &link->li_cinfo); |
3298 | p = encode_cinfo(p, &link->li_cinfo); | 3277 | return 0; |
3299 | } | ||
3300 | return nfserr; | ||
3301 | } | 3278 | } |
3302 | 3279 | ||
3303 | 3280 | ||
@@ -3307,12 +3284,9 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_op | |||
3307 | struct xdr_stream *xdr = &resp->xdr; | 3284 | struct xdr_stream *xdr = &resp->xdr; |
3308 | __be32 *p; | 3285 | __be32 *p; |
3309 | 3286 | ||
3310 | if (nfserr) | ||
3311 | goto out; | ||
3312 | |||
3313 | nfserr = nfsd4_encode_stateid(xdr, &open->op_stateid); | 3287 | nfserr = nfsd4_encode_stateid(xdr, &open->op_stateid); |
3314 | if (nfserr) | 3288 | if (nfserr) |
3315 | goto out; | 3289 | return nfserr; |
3316 | p = xdr_reserve_space(xdr, 24); | 3290 | p = xdr_reserve_space(xdr, 24); |
3317 | if (!p) | 3291 | if (!p) |
3318 | return nfserr_resource; | 3292 | return nfserr_resource; |
@@ -3322,7 +3296,7 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_op | |||
3322 | nfserr = nfsd4_encode_bitmap(xdr, open->op_bmval[0], open->op_bmval[1], | 3296 | nfserr = nfsd4_encode_bitmap(xdr, open->op_bmval[0], open->op_bmval[1], |
3323 | open->op_bmval[2]); | 3297 | open->op_bmval[2]); |
3324 | if (nfserr) | 3298 | if (nfserr) |
3325 | goto out; | 3299 | return nfserr; |
3326 | 3300 | ||
3327 | p = xdr_reserve_space(xdr, 4); | 3301 | p = xdr_reserve_space(xdr, 4); |
3328 | if (!p) | 3302 | if (!p) |
@@ -3395,8 +3369,7 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_op | |||
3395 | BUG(); | 3369 | BUG(); |
3396 | } | 3370 | } |
3397 | /* XXX save filehandle here */ | 3371 | /* XXX save filehandle here */ |
3398 | out: | 3372 | return 0; |
3399 | return nfserr; | ||
3400 | } | 3373 | } |
3401 | 3374 | ||
3402 | static __be32 | 3375 | static __be32 |
@@ -3404,10 +3377,7 @@ nfsd4_encode_open_confirm(struct nfsd4_compoundres *resp, __be32 nfserr, struct | |||
3404 | { | 3377 | { |
3405 | struct xdr_stream *xdr = &resp->xdr; | 3378 | struct xdr_stream *xdr = &resp->xdr; |
3406 | 3379 | ||
3407 | if (!nfserr) | 3380 | return nfsd4_encode_stateid(xdr, &oc->oc_resp_stateid); |
3408 | nfserr = nfsd4_encode_stateid(xdr, &oc->oc_resp_stateid); | ||
3409 | |||
3410 | return nfserr; | ||
3411 | } | 3381 | } |
3412 | 3382 | ||
3413 | static __be32 | 3383 | static __be32 |
@@ -3415,10 +3385,7 @@ nfsd4_encode_open_downgrade(struct nfsd4_compoundres *resp, __be32 nfserr, struc | |||
3415 | { | 3385 | { |
3416 | struct xdr_stream *xdr = &resp->xdr; | 3386 | struct xdr_stream *xdr = &resp->xdr; |
3417 | 3387 | ||
3418 | if (!nfserr) | 3388 | return nfsd4_encode_stateid(xdr, &od->od_stateid); |
3419 | nfserr = nfsd4_encode_stateid(xdr, &od->od_stateid); | ||
3420 | |||
3421 | return nfserr; | ||
3422 | } | 3389 | } |
3423 | 3390 | ||
3424 | static __be32 nfsd4_encode_splice_read( | 3391 | static __be32 nfsd4_encode_splice_read( |
@@ -3555,20 +3522,15 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
3555 | struct raparms *ra = NULL; | 3522 | struct raparms *ra = NULL; |
3556 | __be32 *p; | 3523 | __be32 *p; |
3557 | 3524 | ||
3558 | if (nfserr) | ||
3559 | goto out; | ||
3560 | |||
3561 | p = xdr_reserve_space(xdr, 8); /* eof flag and byte count */ | 3525 | p = xdr_reserve_space(xdr, 8); /* eof flag and byte count */ |
3562 | if (!p) { | 3526 | if (!p) { |
3563 | WARN_ON_ONCE(test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)); | 3527 | WARN_ON_ONCE(test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)); |
3564 | nfserr = nfserr_resource; | 3528 | return nfserr_resource; |
3565 | goto out; | ||
3566 | } | 3529 | } |
3567 | if (resp->xdr.buf->page_len && | 3530 | if (resp->xdr.buf->page_len && |
3568 | test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) { | 3531 | test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) { |
3569 | WARN_ON_ONCE(1); | 3532 | WARN_ON_ONCE(1); |
3570 | nfserr = nfserr_resource; | 3533 | return nfserr_resource; |
3571 | goto out; | ||
3572 | } | 3534 | } |
3573 | xdr_commit_encode(xdr); | 3535 | xdr_commit_encode(xdr); |
3574 | 3536 | ||
@@ -3592,7 +3554,6 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
3592 | if (nfserr) | 3554 | if (nfserr) |
3593 | xdr_truncate_encode(xdr, starting_len); | 3555 | xdr_truncate_encode(xdr, starting_len); |
3594 | 3556 | ||
3595 | out: | ||
3596 | return nfserr; | 3557 | return nfserr; |
3597 | } | 3558 | } |
3598 | 3559 | ||
@@ -3606,9 +3567,6 @@ nfsd4_encode_readlink(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd | |||
3606 | int length_offset = xdr->buf->len; | 3567 | int length_offset = xdr->buf->len; |
3607 | __be32 *p; | 3568 | __be32 *p; |
3608 | 3569 | ||
3609 | if (nfserr) | ||
3610 | return nfserr; | ||
3611 | |||
3612 | p = xdr_reserve_space(xdr, 4); | 3570 | p = xdr_reserve_space(xdr, 4); |
3613 | if (!p) | 3571 | if (!p) |
3614 | return nfserr_resource; | 3572 | return nfserr_resource; |
@@ -3652,9 +3610,6 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4 | |||
3652 | int starting_len = xdr->buf->len; | 3610 | int starting_len = xdr->buf->len; |
3653 | __be32 *p; | 3611 | __be32 *p; |
3654 | 3612 | ||
3655 | if (nfserr) | ||
3656 | return nfserr; | ||
3657 | |||
3658 | p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE); | 3613 | p = xdr_reserve_space(xdr, NFS4_VERIFIER_SIZE); |
3659 | if (!p) | 3614 | if (!p) |
3660 | return nfserr_resource; | 3615 | return nfserr_resource; |
@@ -3740,13 +3695,11 @@ nfsd4_encode_remove(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_ | |||
3740 | struct xdr_stream *xdr = &resp->xdr; | 3695 | struct xdr_stream *xdr = &resp->xdr; |
3741 | __be32 *p; | 3696 | __be32 *p; |
3742 | 3697 | ||
3743 | if (!nfserr) { | 3698 | p = xdr_reserve_space(xdr, 20); |
3744 | p = xdr_reserve_space(xdr, 20); | 3699 | if (!p) |
3745 | if (!p) | 3700 | return nfserr_resource; |
3746 | return nfserr_resource; | 3701 | p = encode_cinfo(p, &remove->rm_cinfo); |
3747 | p = encode_cinfo(p, &remove->rm_cinfo); | 3702 | return 0; |
3748 | } | ||
3749 | return nfserr; | ||
3750 | } | 3703 | } |
3751 | 3704 | ||
3752 | static __be32 | 3705 | static __be32 |
@@ -3755,19 +3708,16 @@ nfsd4_encode_rename(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_ | |||
3755 | struct xdr_stream *xdr = &resp->xdr; | 3708 | struct xdr_stream *xdr = &resp->xdr; |
3756 | __be32 *p; | 3709 | __be32 *p; |
3757 | 3710 | ||
3758 | if (!nfserr) { | 3711 | p = xdr_reserve_space(xdr, 40); |
3759 | p = xdr_reserve_space(xdr, 40); | 3712 | if (!p) |
3760 | if (!p) | 3713 | return nfserr_resource; |
3761 | return nfserr_resource; | 3714 | p = encode_cinfo(p, &rename->rn_sinfo); |
3762 | p = encode_cinfo(p, &rename->rn_sinfo); | 3715 | p = encode_cinfo(p, &rename->rn_tinfo); |
3763 | p = encode_cinfo(p, &rename->rn_tinfo); | 3716 | return 0; |
3764 | } | ||
3765 | return nfserr; | ||
3766 | } | 3717 | } |
3767 | 3718 | ||
3768 | static __be32 | 3719 | static __be32 |
3769 | nfsd4_do_encode_secinfo(struct xdr_stream *xdr, | 3720 | nfsd4_do_encode_secinfo(struct xdr_stream *xdr, struct svc_export *exp) |
3770 | __be32 nfserr, struct svc_export *exp) | ||
3771 | { | 3721 | { |
3772 | u32 i, nflavs, supported; | 3722 | u32 i, nflavs, supported; |
3773 | struct exp_flavor_info *flavs; | 3723 | struct exp_flavor_info *flavs; |
@@ -3775,9 +3725,6 @@ nfsd4_do_encode_secinfo(struct xdr_stream *xdr, | |||
3775 | __be32 *p, *flavorsp; | 3725 | __be32 *p, *flavorsp; |
3776 | static bool report = true; | 3726 | static bool report = true; |
3777 | 3727 | ||
3778 | if (nfserr) | ||
3779 | goto out; | ||
3780 | nfserr = nfserr_resource; | ||
3781 | if (exp->ex_nflavors) { | 3728 | if (exp->ex_nflavors) { |
3782 | flavs = exp->ex_flavors; | 3729 | flavs = exp->ex_flavors; |
3783 | nflavs = exp->ex_nflavors; | 3730 | nflavs = exp->ex_nflavors; |
@@ -3801,7 +3748,7 @@ nfsd4_do_encode_secinfo(struct xdr_stream *xdr, | |||
3801 | supported = 0; | 3748 | supported = 0; |
3802 | p = xdr_reserve_space(xdr, 4); | 3749 | p = xdr_reserve_space(xdr, 4); |
3803 | if (!p) | 3750 | if (!p) |
3804 | goto out; | 3751 | return nfserr_resource; |
3805 | flavorsp = p++; /* to be backfilled later */ | 3752 | flavorsp = p++; /* to be backfilled later */ |
3806 | 3753 | ||
3807 | for (i = 0; i < nflavs; i++) { | 3754 | for (i = 0; i < nflavs; i++) { |
@@ -3813,7 +3760,7 @@ nfsd4_do_encode_secinfo(struct xdr_stream *xdr, | |||
3813 | p = xdr_reserve_space(xdr, 4 + 4 + | 3760 | p = xdr_reserve_space(xdr, 4 + 4 + |
3814 | XDR_LEN(info.oid.len) + 4 + 4); | 3761 | XDR_LEN(info.oid.len) + 4 + 4); |
3815 | if (!p) | 3762 | if (!p) |
3816 | goto out; | 3763 | return nfserr_resource; |
3817 | *p++ = cpu_to_be32(RPC_AUTH_GSS); | 3764 | *p++ = cpu_to_be32(RPC_AUTH_GSS); |
3818 | p = xdr_encode_opaque(p, info.oid.data, info.oid.len); | 3765 | p = xdr_encode_opaque(p, info.oid.data, info.oid.len); |
3819 | *p++ = cpu_to_be32(info.qop); | 3766 | *p++ = cpu_to_be32(info.qop); |
@@ -3822,7 +3769,7 @@ nfsd4_do_encode_secinfo(struct xdr_stream *xdr, | |||
3822 | supported++; | 3769 | supported++; |
3823 | p = xdr_reserve_space(xdr, 4); | 3770 | p = xdr_reserve_space(xdr, 4); |
3824 | if (!p) | 3771 | if (!p) |
3825 | goto out; | 3772 | return nfserr_resource; |
3826 | *p++ = cpu_to_be32(pf); | 3773 | *p++ = cpu_to_be32(pf); |
3827 | } else { | 3774 | } else { |
3828 | if (report) | 3775 | if (report) |
@@ -3834,9 +3781,7 @@ nfsd4_do_encode_secinfo(struct xdr_stream *xdr, | |||
3834 | if (nflavs != supported) | 3781 | if (nflavs != supported) |
3835 | report = false; | 3782 | report = false; |
3836 | *flavorsp = htonl(supported); | 3783 | *flavorsp = htonl(supported); |
3837 | nfserr = 0; | 3784 | return 0; |
3838 | out: | ||
3839 | return nfserr; | ||
3840 | } | 3785 | } |
3841 | 3786 | ||
3842 | static __be32 | 3787 | static __be32 |
@@ -3845,7 +3790,7 @@ nfsd4_encode_secinfo(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
3845 | { | 3790 | { |
3846 | struct xdr_stream *xdr = &resp->xdr; | 3791 | struct xdr_stream *xdr = &resp->xdr; |
3847 | 3792 | ||
3848 | return nfsd4_do_encode_secinfo(xdr, nfserr, secinfo->si_exp); | 3793 | return nfsd4_do_encode_secinfo(xdr, secinfo->si_exp); |
3849 | } | 3794 | } |
3850 | 3795 | ||
3851 | static __be32 | 3796 | static __be32 |
@@ -3854,7 +3799,7 @@ nfsd4_encode_secinfo_no_name(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
3854 | { | 3799 | { |
3855 | struct xdr_stream *xdr = &resp->xdr; | 3800 | struct xdr_stream *xdr = &resp->xdr; |
3856 | 3801 | ||
3857 | return nfsd4_do_encode_secinfo(xdr, nfserr, secinfo->sin_exp); | 3802 | return nfsd4_do_encode_secinfo(xdr, secinfo->sin_exp); |
3858 | } | 3803 | } |
3859 | 3804 | ||
3860 | /* | 3805 | /* |
@@ -3915,16 +3860,14 @@ nfsd4_encode_write(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_w | |||
3915 | struct xdr_stream *xdr = &resp->xdr; | 3860 | struct xdr_stream *xdr = &resp->xdr; |
3916 | __be32 *p; | 3861 | __be32 *p; |
3917 | 3862 | ||
3918 | if (!nfserr) { | 3863 | p = xdr_reserve_space(xdr, 16); |
3919 | p = xdr_reserve_space(xdr, 16); | 3864 | if (!p) |
3920 | if (!p) | 3865 | return nfserr_resource; |
3921 | return nfserr_resource; | 3866 | *p++ = cpu_to_be32(write->wr_bytes_written); |
3922 | *p++ = cpu_to_be32(write->wr_bytes_written); | 3867 | *p++ = cpu_to_be32(write->wr_how_written); |
3923 | *p++ = cpu_to_be32(write->wr_how_written); | 3868 | p = xdr_encode_opaque_fixed(p, write->wr_verifier.data, |
3924 | p = xdr_encode_opaque_fixed(p, write->wr_verifier.data, | 3869 | NFS4_VERIFIER_SIZE); |
3925 | NFS4_VERIFIER_SIZE); | 3870 | return 0; |
3926 | } | ||
3927 | return nfserr; | ||
3928 | } | 3871 | } |
3929 | 3872 | ||
3930 | static __be32 | 3873 | static __be32 |
@@ -3937,12 +3880,8 @@ nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
3937 | char *server_scope; | 3880 | char *server_scope; |
3938 | int major_id_sz; | 3881 | int major_id_sz; |
3939 | int server_scope_sz; | 3882 | int server_scope_sz; |
3940 | int status = 0; | ||
3941 | uint64_t minor_id = 0; | 3883 | uint64_t minor_id = 0; |
3942 | 3884 | ||
3943 | if (nfserr) | ||
3944 | return nfserr; | ||
3945 | |||
3946 | major_id = utsname()->nodename; | 3885 | major_id = utsname()->nodename; |
3947 | major_id_sz = strlen(major_id); | 3886 | major_id_sz = strlen(major_id); |
3948 | server_scope = utsname()->nodename; | 3887 | server_scope = utsname()->nodename; |
@@ -3967,19 +3906,19 @@ nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
3967 | break; | 3906 | break; |
3968 | case SP4_MACH_CRED: | 3907 | case SP4_MACH_CRED: |
3969 | /* spo_must_enforce bitmap: */ | 3908 | /* spo_must_enforce bitmap: */ |
3970 | status = nfsd4_encode_bitmap(xdr, | 3909 | nfserr = nfsd4_encode_bitmap(xdr, |
3971 | exid->spo_must_enforce[0], | 3910 | exid->spo_must_enforce[0], |
3972 | exid->spo_must_enforce[1], | 3911 | exid->spo_must_enforce[1], |
3973 | exid->spo_must_enforce[2]); | 3912 | exid->spo_must_enforce[2]); |
3974 | if (status) | 3913 | if (nfserr) |
3975 | goto out; | 3914 | return nfserr; |
3976 | /* spo_must_allow bitmap: */ | 3915 | /* spo_must_allow bitmap: */ |
3977 | status = nfsd4_encode_bitmap(xdr, | 3916 | nfserr = nfsd4_encode_bitmap(xdr, |
3978 | exid->spo_must_allow[0], | 3917 | exid->spo_must_allow[0], |
3979 | exid->spo_must_allow[1], | 3918 | exid->spo_must_allow[1], |
3980 | exid->spo_must_allow[2]); | 3919 | exid->spo_must_allow[2]); |
3981 | if (status) | 3920 | if (nfserr) |
3982 | goto out; | 3921 | return nfserr; |
3983 | break; | 3922 | break; |
3984 | default: | 3923 | default: |
3985 | WARN_ON_ONCE(1); | 3924 | WARN_ON_ONCE(1); |
@@ -4006,8 +3945,6 @@ nfsd4_encode_exchange_id(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4006 | /* Implementation id */ | 3945 | /* Implementation id */ |
4007 | *p++ = cpu_to_be32(0); /* zero length nfs_impl_id4 array */ | 3946 | *p++ = cpu_to_be32(0); /* zero length nfs_impl_id4 array */ |
4008 | return 0; | 3947 | return 0; |
4009 | out: | ||
4010 | return status; | ||
4011 | } | 3948 | } |
4012 | 3949 | ||
4013 | static __be32 | 3950 | static __be32 |
@@ -4017,9 +3954,6 @@ nfsd4_encode_create_session(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4017 | struct xdr_stream *xdr = &resp->xdr; | 3954 | struct xdr_stream *xdr = &resp->xdr; |
4018 | __be32 *p; | 3955 | __be32 *p; |
4019 | 3956 | ||
4020 | if (nfserr) | ||
4021 | return nfserr; | ||
4022 | |||
4023 | p = xdr_reserve_space(xdr, 24); | 3957 | p = xdr_reserve_space(xdr, 24); |
4024 | if (!p) | 3958 | if (!p) |
4025 | return nfserr_resource; | 3959 | return nfserr_resource; |
@@ -4073,9 +4007,6 @@ nfsd4_encode_sequence(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4073 | struct xdr_stream *xdr = &resp->xdr; | 4007 | struct xdr_stream *xdr = &resp->xdr; |
4074 | __be32 *p; | 4008 | __be32 *p; |
4075 | 4009 | ||
4076 | if (nfserr) | ||
4077 | return nfserr; | ||
4078 | |||
4079 | p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 20); | 4010 | p = xdr_reserve_space(xdr, NFS4_MAX_SESSIONID_LEN + 20); |
4080 | if (!p) | 4011 | if (!p) |
4081 | return nfserr_resource; | 4012 | return nfserr_resource; |
@@ -4100,9 +4031,6 @@ nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4100 | struct nfsd4_test_stateid_id *stateid, *next; | 4031 | struct nfsd4_test_stateid_id *stateid, *next; |
4101 | __be32 *p; | 4032 | __be32 *p; |
4102 | 4033 | ||
4103 | if (nfserr) | ||
4104 | return nfserr; | ||
4105 | |||
4106 | p = xdr_reserve_space(xdr, 4 + (4 * test_stateid->ts_num_ids)); | 4034 | p = xdr_reserve_space(xdr, 4 + (4 * test_stateid->ts_num_ids)); |
4107 | if (!p) | 4035 | if (!p) |
4108 | return nfserr_resource; | 4036 | return nfserr_resource; |
@@ -4112,7 +4040,7 @@ nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4112 | *p++ = stateid->ts_id_status; | 4040 | *p++ = stateid->ts_id_status; |
4113 | } | 4041 | } |
4114 | 4042 | ||
4115 | return nfserr; | 4043 | return 0; |
4116 | } | 4044 | } |
4117 | 4045 | ||
4118 | #ifdef CONFIG_NFSD_PNFS | 4046 | #ifdef CONFIG_NFSD_PNFS |
@@ -4125,14 +4053,9 @@ nfsd4_encode_getdeviceinfo(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4125 | u32 starting_len = xdr->buf->len, needed_len; | 4053 | u32 starting_len = xdr->buf->len, needed_len; |
4126 | __be32 *p; | 4054 | __be32 *p; |
4127 | 4055 | ||
4128 | dprintk("%s: err %d\n", __func__, be32_to_cpu(nfserr)); | ||
4129 | if (nfserr) | ||
4130 | goto out; | ||
4131 | |||
4132 | nfserr = nfserr_resource; | ||
4133 | p = xdr_reserve_space(xdr, 4); | 4056 | p = xdr_reserve_space(xdr, 4); |
4134 | if (!p) | 4057 | if (!p) |
4135 | goto out; | 4058 | return nfserr_resource; |
4136 | 4059 | ||
4137 | *p++ = cpu_to_be32(gdev->gd_layout_type); | 4060 | *p++ = cpu_to_be32(gdev->gd_layout_type); |
4138 | 4061 | ||
@@ -4148,41 +4071,33 @@ nfsd4_encode_getdeviceinfo(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4148 | */ | 4071 | */ |
4149 | if (xdr->buf->len + 4 > gdev->gd_maxcount) | 4072 | if (xdr->buf->len + 4 > gdev->gd_maxcount) |
4150 | goto toosmall; | 4073 | goto toosmall; |
4151 | goto out; | 4074 | return nfserr; |
4152 | } | 4075 | } |
4153 | } | 4076 | } |
4154 | 4077 | ||
4155 | nfserr = nfserr_resource; | ||
4156 | if (gdev->gd_notify_types) { | 4078 | if (gdev->gd_notify_types) { |
4157 | p = xdr_reserve_space(xdr, 4 + 4); | 4079 | p = xdr_reserve_space(xdr, 4 + 4); |
4158 | if (!p) | 4080 | if (!p) |
4159 | goto out; | 4081 | return nfserr_resource; |
4160 | *p++ = cpu_to_be32(1); /* bitmap length */ | 4082 | *p++ = cpu_to_be32(1); /* bitmap length */ |
4161 | *p++ = cpu_to_be32(gdev->gd_notify_types); | 4083 | *p++ = cpu_to_be32(gdev->gd_notify_types); |
4162 | } else { | 4084 | } else { |
4163 | p = xdr_reserve_space(xdr, 4); | 4085 | p = xdr_reserve_space(xdr, 4); |
4164 | if (!p) | 4086 | if (!p) |
4165 | goto out; | 4087 | return nfserr_resource; |
4166 | *p++ = 0; | 4088 | *p++ = 0; |
4167 | } | 4089 | } |
4168 | 4090 | ||
4169 | nfserr = 0; | 4091 | return 0; |
4170 | out: | ||
4171 | dprintk("%s: done: %d\n", __func__, be32_to_cpu(nfserr)); | ||
4172 | return nfserr; | ||
4173 | |||
4174 | toosmall: | 4092 | toosmall: |
4175 | dprintk("%s: maxcount too small\n", __func__); | 4093 | dprintk("%s: maxcount too small\n", __func__); |
4176 | needed_len = xdr->buf->len + 4 /* notifications */; | 4094 | needed_len = xdr->buf->len + 4 /* notifications */; |
4177 | xdr_truncate_encode(xdr, starting_len); | 4095 | xdr_truncate_encode(xdr, starting_len); |
4178 | p = xdr_reserve_space(xdr, 4); | 4096 | p = xdr_reserve_space(xdr, 4); |
4179 | if (!p) { | 4097 | if (!p) |
4180 | nfserr = nfserr_resource; | 4098 | return nfserr_resource; |
4181 | } else { | 4099 | *p++ = cpu_to_be32(needed_len); |
4182 | *p++ = cpu_to_be32(needed_len); | 4100 | return nfserr_toosmall; |
4183 | nfserr = nfserr_toosmall; | ||
4184 | } | ||
4185 | goto out; | ||
4186 | } | 4101 | } |
4187 | 4102 | ||
4188 | static __be32 | 4103 | static __be32 |
@@ -4193,14 +4108,9 @@ nfsd4_encode_layoutget(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4193 | const struct nfsd4_layout_ops *ops; | 4108 | const struct nfsd4_layout_ops *ops; |
4194 | __be32 *p; | 4109 | __be32 *p; |
4195 | 4110 | ||
4196 | dprintk("%s: err %d\n", __func__, nfserr); | ||
4197 | if (nfserr) | ||
4198 | goto out; | ||
4199 | |||
4200 | nfserr = nfserr_resource; | ||
4201 | p = xdr_reserve_space(xdr, 36 + sizeof(stateid_opaque_t)); | 4111 | p = xdr_reserve_space(xdr, 36 + sizeof(stateid_opaque_t)); |
4202 | if (!p) | 4112 | if (!p) |
4203 | goto out; | 4113 | return nfserr_resource; |
4204 | 4114 | ||
4205 | *p++ = cpu_to_be32(1); /* we always set return-on-close */ | 4115 | *p++ = cpu_to_be32(1); /* we always set return-on-close */ |
4206 | *p++ = cpu_to_be32(lgp->lg_sid.si_generation); | 4116 | *p++ = cpu_to_be32(lgp->lg_sid.si_generation); |
@@ -4214,9 +4124,7 @@ nfsd4_encode_layoutget(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4214 | *p++ = cpu_to_be32(lgp->lg_layout_type); | 4124 | *p++ = cpu_to_be32(lgp->lg_layout_type); |
4215 | 4125 | ||
4216 | ops = nfsd4_layout_ops[lgp->lg_layout_type]; | 4126 | ops = nfsd4_layout_ops[lgp->lg_layout_type]; |
4217 | nfserr = ops->encode_layoutget(xdr, lgp); | 4127 | return ops->encode_layoutget(xdr, lgp); |
4218 | out: | ||
4219 | return nfserr; | ||
4220 | } | 4128 | } |
4221 | 4129 | ||
4222 | static __be32 | 4130 | static __be32 |
@@ -4226,9 +4134,6 @@ nfsd4_encode_layoutcommit(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4226 | struct xdr_stream *xdr = &resp->xdr; | 4134 | struct xdr_stream *xdr = &resp->xdr; |
4227 | __be32 *p; | 4135 | __be32 *p; |
4228 | 4136 | ||
4229 | if (nfserr) | ||
4230 | return nfserr; | ||
4231 | |||
4232 | p = xdr_reserve_space(xdr, 4); | 4137 | p = xdr_reserve_space(xdr, 4); |
4233 | if (!p) | 4138 | if (!p) |
4234 | return nfserr_resource; | 4139 | return nfserr_resource; |
@@ -4240,7 +4145,7 @@ nfsd4_encode_layoutcommit(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4240 | p = xdr_encode_hyper(p, lcp->lc_newsize); | 4145 | p = xdr_encode_hyper(p, lcp->lc_newsize); |
4241 | } | 4146 | } |
4242 | 4147 | ||
4243 | return nfs_ok; | 4148 | return 0; |
4244 | } | 4149 | } |
4245 | 4150 | ||
4246 | static __be32 | 4151 | static __be32 |
@@ -4250,16 +4155,13 @@ nfsd4_encode_layoutreturn(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4250 | struct xdr_stream *xdr = &resp->xdr; | 4155 | struct xdr_stream *xdr = &resp->xdr; |
4251 | __be32 *p; | 4156 | __be32 *p; |
4252 | 4157 | ||
4253 | if (nfserr) | ||
4254 | return nfserr; | ||
4255 | |||
4256 | p = xdr_reserve_space(xdr, 4); | 4158 | p = xdr_reserve_space(xdr, 4); |
4257 | if (!p) | 4159 | if (!p) |
4258 | return nfserr_resource; | 4160 | return nfserr_resource; |
4259 | *p++ = cpu_to_be32(lrp->lrs_present); | 4161 | *p++ = cpu_to_be32(lrp->lrs_present); |
4260 | if (lrp->lrs_present) | 4162 | if (lrp->lrs_present) |
4261 | return nfsd4_encode_stateid(xdr, &lrp->lr_sid); | 4163 | return nfsd4_encode_stateid(xdr, &lrp->lr_sid); |
4262 | return nfs_ok; | 4164 | return 0; |
4263 | } | 4165 | } |
4264 | #endif /* CONFIG_NFSD_PNFS */ | 4166 | #endif /* CONFIG_NFSD_PNFS */ |
4265 | 4167 | ||
@@ -4286,16 +4188,14 @@ nfsd4_encode_copy(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4286 | { | 4188 | { |
4287 | __be32 *p; | 4189 | __be32 *p; |
4288 | 4190 | ||
4289 | if (!nfserr) { | 4191 | nfserr = nfsd42_encode_write_res(resp, ©->cp_res); |
4290 | nfserr = nfsd42_encode_write_res(resp, ©->cp_res); | 4192 | if (nfserr) |
4291 | if (nfserr) | 4193 | return nfserr; |
4292 | return nfserr; | ||
4293 | 4194 | ||
4294 | p = xdr_reserve_space(&resp->xdr, 4 + 4); | 4195 | p = xdr_reserve_space(&resp->xdr, 4 + 4); |
4295 | *p++ = cpu_to_be32(copy->cp_consecutive); | 4196 | *p++ = cpu_to_be32(copy->cp_consecutive); |
4296 | *p++ = cpu_to_be32(copy->cp_synchronous); | 4197 | *p++ = cpu_to_be32(copy->cp_synchronous); |
4297 | } | 4198 | return 0; |
4298 | return nfserr; | ||
4299 | } | 4199 | } |
4300 | 4200 | ||
4301 | static __be32 | 4201 | static __be32 |
@@ -4304,14 +4204,11 @@ nfsd4_encode_seek(struct nfsd4_compoundres *resp, __be32 nfserr, | |||
4304 | { | 4204 | { |
4305 | __be32 *p; | 4205 | __be32 *p; |
4306 | 4206 | ||
4307 | if (nfserr) | ||
4308 | return nfserr; | ||
4309 | |||
4310 | p = xdr_reserve_space(&resp->xdr, 4 + 8); | 4207 | p = xdr_reserve_space(&resp->xdr, 4 + 8); |
4311 | *p++ = cpu_to_be32(seek->seek_eof); | 4208 | *p++ = cpu_to_be32(seek->seek_eof); |
4312 | p = xdr_encode_hyper(p, seek->seek_pos); | 4209 | p = xdr_encode_hyper(p, seek->seek_pos); |
4313 | 4210 | ||
4314 | return nfserr; | 4211 | return 0; |
4315 | } | 4212 | } |
4316 | 4213 | ||
4317 | static __be32 | 4214 | static __be32 |