On 2/22/20 1:24 AM, Darrick J. Wong wrote: > On Fri, Feb 21, 2020 at 09:22:12PM -0600, Eric Sandeen wrote: >> I had a request from someone who cared about mkfs speed(!) >> over a slower network block device to look into using faster >> zeroing methods, particularly for the log, during mkfs. >> >> Using FALLOC_FL_ZERO_RANGE is faster in this case than writing >> a bunch of zeros across a wire. >> >> Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> >> --- >> >> V2: Clean up all the nasty stuff I'd flung out there as a wild first >> cut, thanks Dave. >> >> V3: make len_bytes a size_t; leave "end_offset" where it is for the loop >> use. It's a bit odd but ... just don't mess with it for now, one patch >> one change. >> >> diff --git a/include/builddefs.in b/include/builddefs.in >> index 4700b527..1dd27f76 100644 >> --- a/include/builddefs.in >> +++ b/include/builddefs.in >> @@ -144,6 +144,9 @@ endif >> ifeq ($(HAVE_GETFSMAP),yes) >> PCFLAGS+= -DHAVE_GETFSMAP >> endif >> +ifeq ($(HAVE_FALLOCATE),yes) >> +PCFLAGS += -DHAVE_FALLOCATE >> +endif >> >> LIBICU_LIBS = @libicu_LIBS@ >> LIBICU_CFLAGS = @libicu_CFLAGS@ >> diff --git a/include/linux.h b/include/linux.h >> index 8f3c32b0..8d5c4584 100644 >> --- a/include/linux.h >> +++ b/include/linux.h >> @@ -20,6 +20,10 @@ >> #include <stdio.h> >> #include <asm/types.h> >> #include <mntent.h> >> +#include <fcntl.h> >> +#if defined(HAVE_FALLOCATE) >> +#include <linux/falloc.h> >> +#endif >> #ifdef OVERRIDE_SYSTEM_FSXATTR >> # define fsxattr sys_fsxattr >> #endif >> @@ -164,6 +168,24 @@ static inline void platform_mntent_close(struct mntent_cursor * cursor) >> endmntent(cursor->mtabp); >> } >> >> +#if defined(FALLOC_FL_ZERO_RANGE) >> +static inline int >> +platform_zero_range( >> + int fd, >> + xfs_off_t start, >> + size_t len) > > Seems fine to me, though it's unfortunate to cap this at u32. Hm well I suppose could/should expand it. This starts out via libxfs_device_zero as a uint "len" in sectors so it could/should be a bit bigger. >> +{ >> + int ret; >> + >> + ret = fallocate(fd, FALLOC_FL_ZERO_RANGE, start, len); >> + if (!ret) >> + return 0; >> + return -errno; >> +} >> +#else >> +#define platform_zero_range(fd, s, l) (-EOPNOTSUP) > > EOPNOTSUPP (two P's) Weird not sure how I picked that, though they are equivalent today. *sigh* V4 I guess.