Message ID | 20191127212152.69780-1-preichl@redhat.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v2,1/1] mkfs: Break block discard into chunks of 2 GB | expand |
Oh, I forgot to add '\n' to one of the printf statements. I'll send fixed patch immediately. On Wed, Nov 27, 2019 at 10:23 PM Pavel Reichl <preichl@redhat.com> 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. > > Signed-off-by: Pavel Reichl <preichl@redhat.com> > --- > 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..7fa4af0e 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..."); > + printf("..."); > + } > + > + /* 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. > -- > 2.23.0 >
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 18338a61..7fa4af0e 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..."); + printf("..."); + } + + /* 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.
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. Signed-off-by: Pavel Reichl <preichl@redhat.com> --- mkfs/xfs_mkfs.c | 50 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-)