From 4724d7b07553ad27429bb2d61de1c5e8d4d7613d Mon Sep 17 00:00:00 2001 From: David Sterba Date: Thu, 27 Mar 2014 16:19:37 +0100 Subject: btrfs-progs: make device discard process interruptible The ioctl for the whole range is not interruptible, which can be annoying when the discard is not wanted but user forgets to use the -K option. Signed-off-by: David Sterba Signed-off-by: Chris Mason --- utils.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'utils.c') diff --git a/utils.c b/utils.c index 013d74f9..3e9c527a 100644 --- a/utils.c +++ b/utils.c @@ -52,8 +52,10 @@ #define BLKDISCARD _IO(0x12,119) #endif -static int -discard_blocks(int fd, u64 start, u64 len) +/* + * Discard the given range in one go + */ +static int discard_range(int fd, u64 start, u64 len) { u64 range[2] = { start, len }; @@ -62,6 +64,26 @@ discard_blocks(int fd, u64 start, u64 len) return 0; } +/* + * Discard blocks in the given range in 1G chunks, the process is interruptible + */ +static int discard_blocks(int fd, u64 start, u64 len) +{ + while (len > 0) { + /* 1G granularity */ + u64 chunk_size = min_t(u64, len, 1*1024*1024*1024); + int ret; + + ret = discard_range(fd, start, chunk_size); + if (ret) + return ret; + len -= chunk_size; + start += chunk_size; + } + + return 0; +} + static u64 reference_root_table[] = { [1] = BTRFS_ROOT_TREE_OBJECTID, [2] = BTRFS_EXTENT_TREE_OBJECTID, -- cgit v1.2.3