aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Vyshetsky <vkon@google.com>2024-02-15 18:04:44 -0800
committerJaegeuk Kim <jaegeuk@kernel.org>2024-02-21 09:41:52 -0800
commitb6fad4e648914edf9e1c2f611a9ca43570951ef3 (patch)
tree173e4d0c50b3d82c38c2e73861380e5c4fd6ffbd
parent575e8e05d32c0b772b0758e4058d2941fdea1fd2 (diff)
downloadf2fs-tools-b6fad4e648914edf9e1c2f611a9ca43570951ef3.tar.gz
f2fs_io: add write_advice command
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 <vkon@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--tools/f2fs_io/f2fs_io.c114
-rw-r--r--tools/f2fs_io/f2fs_io.h4
2 files changed, 90 insertions, 28 deletions
diff --git a/tools/f2fs_io/f2fs_io.c b/tools/f2fs_io/f2fs_io.c
index 1df9034..7059cbf 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 b4aa9cf..d2641cb 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