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 | } | 33 | |
