Re: [PATCH V2] libxfs: use FALLOC_FL_ZERO_RANGE in libxfs_device_zero

Eric Sandeen
2020-02-14T01:43:43Z

On 2/13/20 7:34 PM, Dave Chinner wrote:
> On Thu, Feb 13, 2020 at 07:05:50PM -0600, Eric Sandeen wrote:

...

>> /*
>> * Check whether we have to define FS_IOC_FS[GS]ETXATTR ourselves. These
>> * are a copy of the definitions moved to linux/uapi/fs.h in the 4.5 kernel,
>> diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c
>> index 0d9d7202..2f6a3eb3 100644
>> --- a/libxfs/rdwr.c
>> +++ b/libxfs/rdwr.c
>> @@ -60,9 +60,19 @@ int
>> libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len)
>> {
>> xfs_off_t start_offset, end_offset, offset;
>> - ssize_t zsize, bytes;
>> + ssize_t zsize, bytes, len_bytes;
>
> len_bytes should be size_t, right?

They probably all should be, TBH...

>> char *z;
>> - int fd;
>> + int error, fd;
>> +
>> + fd = libxfs_device_to_fd(btp->dev);
>> + start_offset = LIBXFS_BBTOOFF64(start);
>> + end_offset = LIBXFS_BBTOOFF64(start + len) - start_offset;
>> +
>> + /* try to use special zeroing methods, fall back to writes if needed */
>> + len_bytes = LIBXFS_BBTOOFF64(len);
>> + error = platform_zero_range(fd, start_offset, len_bytes);
>
> This is a bit ... convoluted, and doesn't end_offset = len_bytes?
> i.e.
>
> start_offset = start << BBSHIFT
> len_bytes = len << BBSHIFT
> end_offset = (start + len) << BBSHIFT - start_offset
> = (start << BBSHIFT) + (len << BBSHIFT) - start_offset
> = start_offset + len_bytes - start_offset
> = len_bytes

oh, yikes. Good catch. Before, it was used as

end_offset = LIBXFS_BBTOOFF64(start + len) - start_offset;
for (offset = 0; offset < end_offset; ) {
bytes = min((ssize_t)(end_offset - offset), zsize);
if ((bytes = write(fd, z, bytes)) < 0) {

"end_offset" was not the ending offset of the whole range... that's what I get
for inferring too much from a variable name w/o looking at what it actually /does/

I'll sort that out, thanks.

-Eric

> Cheers,
>
> Dave.
>