You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.6 KiB
89 lines
2.6 KiB
From 7e8a6edb4d1ba0079152eb477abbbc1dfb1ebb7e Mon Sep 17 00:00:00 2001 |
|
From: Pavel Reichl <preichl@redhat.com> |
|
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 <preichl@redhat.com> |
|
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> |
|
Reviewed-by: Dave Chinner <dchinner@redhat.com> |
|
Signed-off-by: Eric Sandeen <sandeen@sandeen.net> |
|
--- |
|
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)
|
|
|