aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2017-05-06 11:12:04 -0400
committerJ. Bruce Fields <bfields@redhat.com>2017-08-24 22:12:49 -0400
commitbac966d6065207b6900a4c2a3e6e5f78cfee7b4d (patch)
tree21055a52f639cd01c94d699795b6dc4620df877f
parentb7571e4cd39ae860379138b883bc5f57a8553184 (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.c309
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
3118static __be32 nfsd4_encode_bind_conn_to_session(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4_bind_conn_to_session *bcts) 3116static __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
3136static __be32 3132static __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
3164static __be32 3155static __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
3181static __be32 3170static __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
3196static __be32 3180static __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 */
3398out: 3372 return 0;
3399 return nfserr;
3400} 3373}
3401 3374
3402static __be32 3375static __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
3413static __be32 3383static __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
3424static __be32 nfsd4_encode_splice_read( 3391static __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
3595out:
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
3752static __be32 3705static __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
3768static __be32 3719static __be32
3769nfsd4_do_encode_secinfo(struct xdr_stream *xdr, 3720nfsd4_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;
3838out:
3839 return nfserr;
3840} 3785}
3841 3786
3842static __be32 3787static __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
3851static __be32 3796static __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
3930static __be32 3873static __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;
4009out:
4010 return status;
4011} 3948}
4012 3949
4013static __be32 3950static __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;
4170out:
4171 dprintk("%s: done: %d\n", __func__, be32_to_cpu(nfserr));
4172 return nfserr;
4173
4174toosmall: 4092toosmall:
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
4188static __be32 4103static __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);
4218out:
4219 return nfserr;
4220} 4128}
4221 4129
4222static __be32 4130static __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
4246static __be32 4151static __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, &copy->cp_res);
4290 nfserr = nfsd42_encode_write_res(resp, &copy->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
4301static __be32 4201static __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
4317static __be32 4214static __be32