Re: NFSv4 i_blocks=0 immediately after creating a file (Was: inode_add/set_bytes and i_blocks, dangerous for small files?)

Andreas Dilger
2019-02-03T23:30:40Z

[-- Attachment #1: Type: text/plain, Size: 1989 bytes --]

On Feb 1, 2019, at 7:28 AM, Dominique Martinet <asmadeus@codewreck.org> wrote:
>
> Following up on this for NFS as I made a sneaky bug report hard to
> notice, this might be worth having a look:
>
> Dominique Martinet wrote on Fri, Jan 25, 2019:
>> [...] There is a small, few seconds window
>> where I can reproduce a similar issue on nfs:
>> $ echo foo > bar; stat -c %b bar; sleep 3; stat -c %b bar
>> 0
>> 8
>> with a 4.14.87 knfsd and 4.19.15-300.fc29 client, nfs 4.2, both x86_64,
>> no export option or explicit client option.
>
> In other words, the file's i_blocks isn't updated for a short while on
> nfs v4 which might lead to data loss (see previous email for example
> e.g. tar), just create a file and immediately stat to notice.
>
>
> nfs v3 doesn't exhibit the problem.
>
> I also wasn't able to reproduce on the 4.14.87 machine as a and nfs v4
> client so it's likely a semi-recent regression, I could probably bissect
> it if really required but I'm sure someone here has some dedicated
> hardware for this better than my laptop :)
>
> Feel free to ask if you cannot reproduce and I'll try updating to master
> on both client and server just in case.

The "i_blocks == 0" causes problems with some software that thinks the file
has no data and treats it as sparse. We work around this in ext4 and Lustre
by always reporting i_blocks > 0 for files that have data in them (e.g.
unwritten dirty pages or inline data), see comments nin ext4_file_getattr():

/*
* If there is inline data in the inode, the inode will normally not
* have data blocks allocated (it may have an external xattr block).
* Report at least one sector for such files, so tools like tar, rsync,
* others don't incorrectly think the file is completely sparse.
*/
if (unlikely(ext4_has_inline_data(inode)))
stat->blocks += (stat->size + 511) >> 9;

Cheers, Andreas

[-- Attachment #2: Message signed with OpenPGP --]
[-- Type: application/pgp-signature, Size: 873 bytes --]