From: Konstantin Vyshetsky <v...@google.com> Add a write_advice command with same behavior as existing write command with the exception that data should be treated as hot or cold.
Signed-off-by: Konstantin Vyshetsky <v...@google.com> Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> --- tools/f2fs_io/f2fs_io.c | 114 ++++++++++++++++++++++++++++++---------- tools/f2fs_io/f2fs_io.h | 4 ++ 2 files changed, 90 insertions(+), 28 deletions(-) diff --git a/tools/f2fs_io/f2fs_io.c b/tools/f2fs_io/f2fs_io.c index 1df9034acdd9..7059cbfab40d 100644 --- a/tools/f2fs_io/f2fs_io.c +++ b/tools/f2fs_io/f2fs_io.c @@ -597,26 +597,8 @@ static void do_erase(int argc, char **argv, const struct cmd_desc *cmd) exit(0); } -#define write_desc "write data into file" -#define write_help \ -"f2fs_io write [chunk_size in 4kb] [offset in chunk_size] [count] [pattern] [IO] [file_path] {delay}\n\n" \ -"Write given patten data in file_path\n" \ -"pattern can be\n" \ -" zero : zeros\n" \ -" inc_num : incrementing numbers\n" \ -" rand : random numbers\n" \ -"IO can be\n" \ -" buffered : buffered IO\n" \ -" dio : O_DIRECT\n" \ -" dsync : O_DIRECT | O_DSYNC\n" \ -" osync : O_SYNC\n" \ -" atomic_commit : atomic write & commit\n" \ -" atomic_abort : atomic write & abort\n" \ -" atomic_rcommit: atomic replace & commit\n" \ -" atomic_rabort : atomic replace & abort\n" \ -"{delay} is in ms unit and optional only for atomic operations\n" - -static void do_write(int argc, char **argv, const struct cmd_desc *cmd) +static void do_write_with_advice(int argc, char **argv, + const struct cmd_desc *cmd, bool with_advice) { u64 buf_size = 0, inc_num = 0, written = 0; u64 offset; @@ -630,12 +612,6 @@ static void do_write(int argc, char **argv, const struct cmd_desc *cmd) srand(time(0)); - if (argc < 7 || argc > 8) { - fputs("Excess arguments\n\n", stderr); - fputs(cmd->cmd_help, stderr); - exit(1); - } - bs = atoi(argv[1]); if (bs > 1024) die("Too big chunk size - limit: 4MB"); @@ -672,7 +648,28 @@ static void do_write(int argc, char **argv, const struct cmd_desc *cmd) die("Wrong IO type"); } - fd = xopen(argv[6], O_CREAT | O_WRONLY | flags, 0755); + if (!with_advice) { + fd = xopen(argv[6], O_CREAT | O_WRONLY | flags, 0755); + } else { + unsigned char advice; + int ret; + + if (!strcmp(argv[6], "hot")) + advice = FADVISE_HOT_BIT; + else if (!strcmp(argv[6], "cold")) + advice = FADVISE_COLD_BIT; + else + die("Wrong Advise type"); + + fd = xopen(argv[7], O_CREAT | O_WRONLY | flags, 0755); + + ret = fsetxattr(fd, F2FS_SYSTEM_ADVISE_NAME, + (char *)&advice, 1, XATTR_CREATE); + if (ret) { + fputs("fsetxattr advice failed\n", stderr); + exit(1); + } + } if (atomic_commit || atomic_abort) { int ret; @@ -739,6 +736,67 @@ static void do_write(int argc, char **argv, const struct cmd_desc *cmd) exit(0); } +#define write_desc "write data into file" +#define write_help \ +"f2fs_io write [chunk_size in 4kb] [offset in chunk_size] [count] [pattern] [IO] [file_path] {delay}\n\n" \ +"Write given patten data in file_path\n" \ +"pattern can be\n" \ +" zero : zeros\n" \ +" inc_num : incrementing numbers\n" \ +" rand : random numbers\n" \ +"IO can be\n" \ +" buffered : buffered IO\n" \ +" dio : O_DIRECT\n" \ +" dsync : O_DIRECT | O_DSYNC\n" \ +" osync : O_SYNC\n" \ +" atomic_commit : atomic write & commit\n" \ +" atomic_abort : atomic write & abort\n" \ +" atomic_rcommit: atomic replace & commit\n" \ +" atomic_rabort : atomic replace & abort\n" \ +"{delay} is in ms unit and optional only for atomic operations\n" + +static void do_write(int argc, char **argv, const struct cmd_desc *cmd) +{ + if (argc < 7 || argc > 8) { + fputs("Excess arguments\n\n", stderr); + fputs(cmd->cmd_help, stderr); + exit(1); + } + do_write_with_advice(argc, argv, cmd, false); +} + +#define write_advice_desc "write data into file with a hint" +#define write_advice_help \ +"f2fs_io write_advice [chunk_size in 4kb] [offset in chunk_size] [count] [pattern] [IO] [advise] [file_path] {delay}\n\n" \ +"Write given patten data in file_path\n" \ +"pattern can be\n" \ +" zero : zeros\n" \ +" inc_num : incrementing numbers\n" \ +" rand : random numbers\n" \ +"IO can be\n" \ +" buffered : buffered IO\n" \ +" dio : O_DIRECT\n" \ +" dsync : O_DIRECT | O_DSYNC\n" \ +" osync : O_SYNC\n" \ +" atomic_commit : atomic write & commit\n" \ +" atomic_abort : atomic write & abort\n" \ +" atomic_rcommit: atomic replace & commit\n" \ +" atomic_rabort : atomic replace & abort\n" \ +"advise can be\n" \ +" cold : indicate a cold file\n" \ +" hot : indicate a hot file\n" \ +"{delay} is in ms unit and optional only for atomic operations\n" + +static void do_write_advice(int argc, char **argv, const struct cmd_desc *cmd) +{ + if (argc < 8 || argc > 9) { + fputs("Excess arguments\n\n", stderr); + fputs(cmd->cmd_help, stderr); + exit(1); + } + do_write_with_advice(argc, argv, cmd, true); +} + #define read_desc "read data from file" #define read_help \ "f2fs_io read [chunk_size in 4kb] [offset in chunk_size] [count] [IO] [print_nbytes] [file_path]\n\n" \ @@ -1588,7 +1646,6 @@ static void do_listxattr(int argc, char **argv, const struct cmd_desc *cmd) #define setxattr_desc "setxattr" #define setxattr_help "f2fs_io setxattr [name] [value] [file_path]\n\n" -#define F2FS_SYSTEM_ADVISE_NAME "system.advise" static void do_setxattr(int argc, char **argv, const struct cmd_desc *cmd) { @@ -1704,6 +1761,7 @@ const struct cmd_desc cmd_list[] = { CMD(fallocate), CMD(erase), CMD(write), + CMD(write_advice), CMD(read), CMD(randread), CMD(fiemap), diff --git a/tools/f2fs_io/f2fs_io.h b/tools/f2fs_io/f2fs_io.h index b4aa9cfeac02..d2641cbb6970 100644 --- a/tools/f2fs_io/f2fs_io.h +++ b/tools/f2fs_io/f2fs_io.h @@ -167,6 +167,10 @@ struct fscrypt_get_policy_ex_arg { #define F2FS_IOC_FSGETXATTR FS_IOC_FSGETXATTR #define F2FS_IOC_FSSETXATTR FS_IOC_FSSETXATTR +#define F2FS_SYSTEM_ADVISE_NAME "system.advise" +#define FADVISE_COLD_BIT 0x01 +#define FADVISE_HOT_BIT 0x20 + #ifndef FS_IMMUTABLE_FL #define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */ #endif -- 2.44.0.rc0.258.g7320e95886-goog _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel