[PATCH 0/2 v4] nfs: return nfs4 compound header status on op header decoding error
Benny Halevy
bhalevy at panasas.com
Wed Jul 16 04:21:03 EDT 2008
On Jul. 16, 2008, 0:57 +0300, Trond Myklebust <trond.myklebust at fys.uio.no> wrote:
> On Thu, 2008-07-03 at 20:49 +0300, Benny Halevy wrote:
>> Trond, following our conversation during the Connectathon
>> I reduced this patch as much as possible and restricted the
>> use of the compound header status to cases where op_hdr
>> decoding hit an error.
>>
>> This is needed for nfs41 for graceful fallback when trying
>> to mount a 4.0 server with 4.1. In this case the server
>> returns no ops and the hdr status is set to
>> NFS4ERR_MINOR_VERS_MISMATCH.
>>
>> Please consider these patches:
>>
>> [PATCH 1/2] nfs: return nfs4 compound header status on op header decoding error
>
> No, this patch doesn't look right either. If we overrun the end of the
> reply buffer, then xdr_inline_decode() will return a NULL pointer, so
> you should never hit the your (opnum != expected) case.
In patch 1, this is supposed to be handled like this:
decode_compound_hdr:
+ xdr->status = hdr->status;
decode_op_hdr:
+ p = xdr_inline_decode(xdr, 8);
+ if (unlikely(!p)) {
...
+ goto err;
+ }
+err:
+ if (xdr->status != NFS_OK)
+ return nfs4_stat_to_errno(xdr->status);
>
> So given that your concern is primarily the case where nops==0, why
> don't you just add that particular case to decode_compound_hdr?
>
> IOW: something like
>
>
> @@static int decode_compound_hdr(
> p += XDR_QUADLEN(hdr->taglen);
> READ32(hdr->nops);
> + if (hdr->nops < 1)
> + return nfs4_stat_to_errno(hdr->status);
> return 0;
> }
>
This certainly provides a shortcut for the nops==0 case.
However, it doesn't solve the OP_ILLEGAL case all other
cases where xdr_inline_decode failed or opnum != expected,
we can easily handle the OP_ILLEGAL case explicitly in
decode_op_hdr. Are you ok with the approach of
carrying the hdr.status in xdr->status for decode_op_hdr
use, or do you rather prefer to leave things as they are
for the invalid cases and explicitly handle only the
nops==0 and OP_ILLEGAL cases?
Benny
More information about the NFSv4
mailing list