Re: [PATCH 2/2] NFSv4: encode_attrs should not backfill the bitmap and attribute length

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Jul 23, 2013, at 5:19 PM, "Myklebust, Trond" <Trond.Myklebust@xxxxxxxxxx> wrote:

> On Tue, 2013-07-23 at 16:14 -0400, Chuck Lever wrote:
>> On Jul 23, 2013, at 1:00 PM, "Myklebust, Trond" <Trond.Myklebust@xxxxxxxxxx> wrote:
>> 
>>> On Tue, 2013-07-23 at 17:59 +0200, Andre Heider wrote:
>>>> Trond,
>>>> 
>>>> On Wed, Jul 17, 2013 at 11:59 PM, Trond Myklebust
>>>> <Trond.Myklebust@xxxxxxxxxx> wrote:
>>>>> The attribute length is already calculated in advance. There is no
>>>>> reason why we cannot calculate the bitmap in advance too so that
>>>>> we don't have to play pointer games.
>>>> 
>>>> I'm sorry to report that this patch seems to be more than just a cleanup.
>>>> 
>>>> I just tested 3.11-rc2 against my FreeBSD server, and with just patch
>>>> 1/2 (as in -rc2) I still get the failure upon `touch`. It fails with
>>>> or without Rick's server patch.
>>>> 
>>>> Applying this one on top of -rc2 fixes it.
>>> 
>>> How about the attached instead of the cleanup?
>> 
>> Even with this patch applied, cthon basic tests fail immediately for me.  The mkdir to create the test directory fails with EIO.
>> 
>> The wire trace shows that the CREATE operation is malformed: the client sends a length of 8 for the 4-octet mode attribute value at the end of the operation.
>> 
>> This causes the server to skip over the following GETFH operation -- it thinks the client has sent 3 operations, when the client told it to expect 4 in this compound.
>> 
>> Here:
>> 
>> 1064         *p++ = cpu_to_be32(bmval_len);
>> 1065         q = p;
>> 1066         /* Skip bitmap entries + attrlen */
>> 1067         p += bmval_len + 1;
>> 
>> You've skipped over the 4-octet attrlen field, but here:
>> 
>> 1125         *q++ = htonl(bmval0);
>> 1126         *q++ = htonl(bmval1);
>> 1127         if (bmval_len == 3)
>> 1128                 *q++ = htonl(bmval2);
>> 1129         len = (char *)p - (char *)q;
> 
> In the patch I sent out, the above should read (q+1)...

D'OH!

> 
>> 1130         *q = htonl(len);
>> 
>> have you failed to take the attrlen field into account when computing the length of the attribute values?
>> 

-- 
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux