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 <dsterba@suse.cz> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
a062ffd74d
commit
4724d7b075
26
utils.c
26
utils.c
|
@ -52,8 +52,10 @@
|
||||||
#define BLKDISCARD _IO(0x12,119)
|
#define BLKDISCARD _IO(0x12,119)
|
||||||
#endif
|
#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 };
|
u64 range[2] = { start, len };
|
||||||
|
|
||||||
|
@ -62,6 +64,26 @@ discard_blocks(int fd, u64 start, u64 len)
|
||||||
return 0;
|
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[] = {
|
static u64 reference_root_table[] = {
|
||||||
[1] = BTRFS_ROOT_TREE_OBJECTID,
|
[1] = BTRFS_ROOT_TREE_OBJECTID,
|
||||||
[2] = BTRFS_EXTENT_TREE_OBJECTID,
|
[2] = BTRFS_EXTENT_TREE_OBJECTID,
|
||||||
|
|
Loading…
Reference in New Issue