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,