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

Reply via email to