From 7e8a6edb4d1ba0079152eb477abbbc1dfb1ebb7e Mon Sep 17 00:00:00 2001 From: Pavel Reichl Date: Fri, 13 Dec 2019 16:21:26 -0500 Subject: [PATCH] mkfs: Break block discard into chunks of 2 GB 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 Reviewed-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Eric Sandeen --- mkfs/xfs_mkfs.c | 50 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) Index: xfsprogs-4.5.0/mkfs/xfs_mkfs.c =================================================================== --- xfsprogs-4.5.0.orig/mkfs/xfs_mkfs.c +++ xfsprogs-4.5.0/mkfs/xfs_mkfs.c @@ -875,17 +875,41 @@ 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..."); + fflush(stdout); + } + + /* 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"); + } int @@ -2140,11 +2164,11 @@ _("warning: sparse inodes not supported } if (discard && !Nflag) { - discard_blocks(xi.ddev, xi.dsize); + discard_blocks(xi.ddev, xi.dsize, qflag); if (xi.rtdev) - discard_blocks(xi.rtdev, xi.rtsize); + discard_blocks(xi.rtdev, xi.rtsize, qflag); if (xi.logdev && xi.logdev != xi.ddev) - discard_blocks(xi.logdev, xi.logBBsize); + discard_blocks(xi.logdev, xi.logBBsize, qflag); } if (!liflag && !ldflag)