diff options
author | Chao Yu <chao@kernel.org> | 2023-06-01 18:30:54 +0800 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2023-06-07 09:57:30 -0700 |
commit | 7933e522c9df1d0bc5a7da8431554c749c0eea52 (patch) | |
tree | becd913028a567307e6ae09780cf82c4ce94f6d0 | |
parent | 2f0705a02b7d7302f4e22a1a2b6ebf5e79d24019 (diff) | |
download | f2fs-tools-7933e522c9df1d0bc5a7da8431554c749c0eea52.tar.gz |
f2fs_io: support gc_range command
This patch supports a new sub-command 'gc_range' in f2fs_io to trigger
gc to move blocks in specified range via F2FS_IOC_GARBAGE_COLLECT_RANGE
ioctl.
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | man/f2fs_io.8 | 3 | ||||
-rw-r--r-- | tools/f2fs_io/f2fs_io.c | 35 |
2 files changed, 38 insertions, 0 deletions
diff --git a/man/f2fs_io.8 b/man/f2fs_io.8 index b25f807..c5eadde 100644 --- a/man/f2fs_io.8 +++ b/man/f2fs_io.8 @@ -144,6 +144,9 @@ Trigger precache extents .TP \fBmove_range\fR \fI[src_path] [dst_path] [src_start] [dst_start] [length]\fR Move a range of data blocks from source file to destination file +.TP +\fBgc_range\fR \fI[sync_mode] [start in 4kb] [length in 4kb] [file]\fR +Trigger gc to move data blocks from specified address range .SH AUTHOR This version of .B f2fs_io diff --git a/tools/f2fs_io/f2fs_io.c b/tools/f2fs_io/f2fs_io.c index 17de931..1774eca 100644 --- a/tools/f2fs_io/f2fs_io.c +++ b/tools/f2fs_io/f2fs_io.c @@ -1392,6 +1392,40 @@ static void do_move_range(int argc, char **argv, const struct cmd_desc *cmd) exit(0); } +#define gc_range_desc "trigger filesystem gc_range" +#define gc_range_help "f2fs_io gc_range [sync_mode] [start] [length] [file_path]\n\n"\ +" sync_mode : 0: asynchronous, 1: synchronous\n" \ +" start : start offset of defragment region, unit: 4kb\n" \ +" length : bytes number of defragment region, unit: 4kb\n" \ + +static void do_gc_range(int argc, char **argv, const struct cmd_desc *cmd) +{ + struct f2fs_gc_range range; + int ret, fd; + + if (argc != 5) { + fputs("Excess arguments\n\n", stderr); + fputs(cmd->cmd_help, stderr); + exit(1); + } + + range.sync = atoi(argv[1]); + range.start = (u64)atoi(argv[2]); + range.len = (u64)atoi(argv[3]); + + fd = xopen(argv[4], O_RDWR, 0); + + ret = ioctl(fd, F2FS_IOC_GARBAGE_COLLECT_RANGE, &range); + if (ret < 0) { + die_errno("F2FS_IOC_GARBAGE_COLLECT_RANGE failed"); + } + + printf("trigger %s gc_range [%lu, %lu] ret=%d\n", + range.sync ? "synchronous" : "asynchronous", + range.start, range.len, ret); + exit(0); +} + #define CMD_HIDDEN 0x0001 #define CMD(name) { #name, do_##name, name##_desc, name##_help, 0 } #define _CMD(name) { #name, do_##name, NULL, NULL, CMD_HIDDEN } @@ -1427,6 +1461,7 @@ const struct cmd_desc cmd_list[] = { CMD(checkpoint), CMD(precache_extents), CMD(move_range), + CMD(gc_range), { NULL, NULL, NULL, NULL, 0 } }; |