On 11/28/19 12:21 AM, Pavel Reichl wrote: > Some users are not happy about the BLKDISCARD taking too long and at the same > time not being informed about that - so they think that the command actually > hung. > > This commit changes code so that progress reporting is possible and also typing > the ^C will cancel the ongoing BLKDISCARD. Ok I'm going to nitpick this just a little bit more... > Signed-off-by: Pavel Reichl <preichl@xxxxxxxxxx> > --- > mkfs/xfs_mkfs.c | 50 ++++++++++++++++++++++++++++++++++++------------- > 1 file changed, 37 insertions(+), 13 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 18338a61..0defadb2 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1240,17 +1240,40 @@ done: > } > > static void > -discard_blocks(dev_t dev, uint64_t nsectors) > +discard_blocks(dev_t dev, uint64_t nsectors, int quiet) > { > - int fd; > + int fd; > + uint64_t offset = 0; > + /* Discard the device 2G at a time */ > + const uint64_t step = 2ULL << 30; > + const uint64_t count = BBTOB(nsectors); > > - /* > - * We intentionally ignore errors from the discard ioctl. It is > - * not necessary for the mkfs functionality but just an optimization. > - */ > fd = libxfs_device_to_fd(dev); > - if (fd > 0) > - platform_discard_blocks(fd, 0, nsectors << 9); > + if (fd <= 0) > + return; > + if (!quiet) { > + printf("Discarding blocks...\n"); > + printf("...\n"); > + } Let's change this output so that it prints only a single line, i.e. + if (!quiet) { + printf("Discarding blocks... "); ... + if (!quiet) + printf("Done.\n"); Then in xfstests there's only one line to filter. I think there was a suggestion to test isatty() to see if we're on a terminal, but I have some concern that a hung script will lead to confusion as well if there's no status message. We can add terminal testing in a later patch if that really seems like the right way to go. If you're ok with the above, I can make the change on commit to save another patch round trip, and Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > + > + /* The block discarding happens in smaller batches so it can be > + * interrupted prematurely > + */ > + while (offset < count) { > + uint64_t tmp_step = min(step, count - offset); > + > + /* > + * We intentionally ignore errors from the discard ioctl. It is > + * not necessary for the mkfs functionality but just an > + * optimization. However we should stop on error. > + */ > + if (platform_discard_blocks(fd, offset, tmp_step)) > + return; > + > + offset += tmp_step; > + } > + if (!quiet) > + printf("Done.\n"); > } > > static __attribute__((noreturn)) void > @@ -2507,18 +2530,19 @@ open_devices( > > static void > discard_devices( > - struct libxfs_xinit *xi) > + struct libxfs_xinit *xi, > + int quiet) > { > /* > * This function has to be called after libxfs has been initialized. > */ > > if (!xi->disfile) > - discard_blocks(xi->ddev, xi->dsize); > + discard_blocks(xi->ddev, xi->dsize, quiet); > if (xi->rtdev && !xi->risfile) > - discard_blocks(xi->rtdev, xi->rtsize); > + discard_blocks(xi->rtdev, xi->rtsize, quiet); > if (xi->logdev && xi->logdev != xi->ddev && !xi->lisfile) > - discard_blocks(xi->logdev, xi->logBBsize); > + discard_blocks(xi->logdev, xi->logBBsize, quiet); > } > > static void > @@ -3749,7 +3773,7 @@ main( > * All values have been validated, discard the old device layout. > */ > if (discard && !dry_run) > - discard_devices(&xi); > + discard_devices(&xi, quiet); > > /* > * we need the libxfs buffer cache from here on in. >