Re: [PATCH 1/5] NFSv4/pnfs: Ensure we don't miss a file extension

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

 



On Wed, Aug 19, 2015 at 10:50 AM, Peng Tao <bergwolf@xxxxxxxxxxxxxxx> wrote:
> Hi Trond,
>
> Can we please add following patch to stable as well? It not only fixes
> pnfs write, but also fixes in band writes when delegations are
> enabled. Without it, I can always get fstest read_write/mctime.t
> failure with in band IO.
ah, nvm, speaking too soon. I can still reproduce fstest
read_write/mctime.t failure on delegation+inband IO with your testing
branch...

Looking into it...

sorry for the noise.

>
> Thanks,
> Tao
>
> On Thu, Jul 23, 2015 at 11:48 AM, Trond Myklebust
> <trond.myklebust@xxxxxxxxxxxxxxx> wrote:
>> pNFS writes don't return attributes, however that doesn't mean that we
>> should ignore the fact that they may be extending the file. This patch
>> ensures that if a write is seen to extend the file, then we always set
>> an attribute barrier, and update the cached file size.
>>
>> Signed-off-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx>
>> ---
>>  fs/nfs/write.c | 15 +++++++++------
>>  1 file changed, 9 insertions(+), 6 deletions(-)
>>
>> diff --git a/fs/nfs/write.c b/fs/nfs/write.c
>> index 359e9ad596c9..0e6a2b8786b4 100644
>> --- a/fs/nfs/write.c
>> +++ b/fs/nfs/write.c
>> @@ -1378,24 +1378,27 @@ static void nfs_writeback_check_extend(struct nfs_pgio_header *hdr,
>>  {
>>         struct nfs_pgio_args *argp = &hdr->args;
>>         struct nfs_pgio_res *resp = &hdr->res;
>> +       u64 size = argp->offset + resp->count;
>>
>>         if (!(fattr->valid & NFS_ATTR_FATTR_SIZE))
>> +               fattr->size = size;
>> +       if (nfs_size_to_loff_t(fattr->size) < i_size_read(hdr->inode)) {
>> +               fattr->valid &= ~NFS_ATTR_FATTR_SIZE;
>>                 return;
>> -       if (argp->offset + resp->count != fattr->size)
>> -               return;
>> -       if (nfs_size_to_loff_t(fattr->size) < i_size_read(hdr->inode))
>> +       }
>> +       if (size != fattr->size)
>>                 return;
>>         /* Set attribute barrier */
>>         nfs_fattr_set_barrier(fattr);
>> +       /* ...and update size */
>> +       fattr->valid |= NFS_ATTR_FATTR_SIZE;
>>  }
>>
>>  void nfs_writeback_update_inode(struct nfs_pgio_header *hdr)
>>  {
>> -       struct nfs_fattr *fattr = hdr->res.fattr;
>> +       struct nfs_fattr *fattr = &hdr->fattr;
>>         struct inode *inode = hdr->inode;
>>
>> -       if (fattr == NULL)
>> -               return;
>>         spin_lock(&inode->i_lock);
>>         nfs_writeback_check_extend(hdr, fattr);
>>         nfs_post_op_update_inode_force_wcc_locked(inode, fattr);
>> --
>> 2.4.3
>>
--
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