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. >