]> www.infradead.org Git - users/hch/xfstests-dev.git/commitdiff
add a new rw_hint helper
authorChristoph Hellwig <hch@lst.de>
Fri, 22 Nov 2024 07:13:20 +0000 (08:13 +0100)
committerChristoph Hellwig <hch@lst.de>
Thu, 30 Jan 2025 05:52:05 +0000 (06:52 +0100)
Add a tool to set the life time hint via fcntl.

Signed-off-by: Christoph Hellwig <hch@lst.de>
.gitignore
src/Makefile
src/rw_hint.c [new file with mode: 0644]

index efd477738e1e5eb53339ab5dcb3ae0133bb1a4aa..f4545d1b7156c1e18107d3ae25d445fa3540652a 100644 (file)
@@ -210,6 +210,7 @@ tags
 /src/perf/*.pyc
 /src/fiemap-fault
 /src/min_dio_alignment
+/src/rw_hint
 
 # Symlinked files
 /tests/generic/035.out
index 1417c383863e30b52ffc55f78f74e17937a5514c..969a7b4bd205355f19b10a4fb262f6f2e09325fa 100644 (file)
@@ -34,7 +34,8 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \
        attr_replace_test swapon mkswap t_attr_corruption t_open_tmpfiles \
        fscrypt-crypt-util bulkstat_null_ocount splice-test chprojid_fail \
        detached_mounts_propagation ext4_resize t_readdir_3 splice2pipe \
-       uuid_ioctl t_snapshot_deleted_subvolume fiemap-fault min_dio_alignment
+       uuid_ioctl t_snapshot_deleted_subvolume fiemap-fault min_dio_alignment \
+       rw_hint
 
 EXTRA_EXECS = dmerror fill2attr fill2fs fill2fs_check scaleread.sh \
              btrfs_crc32c_forged_name.py popdir.pl popattr.py \
diff --git a/src/rw_hint.c b/src/rw_hint.c
new file mode 100644 (file)
index 0000000..d4290e4
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2024 Christoph Hellwig
+ */
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+
+int main(int argc, char **argv)
+{
+       uint64_t hint = -1;
+       int fd;
+
+       if (argc < 3) {
+               fprintf(stderr,
+"usage: %s file not_set|none|short|medium|long|extreme\n",
+                       argv[0]);
+               return 1;
+       }
+
+       if (!strcmp(argv[2], "not_set"))
+               hint = RWH_WRITE_LIFE_NOT_SET;
+       else if (!strcmp(argv[2], "none"))
+               hint = RWH_WRITE_LIFE_NONE;
+       else if (!strcmp(argv[2], "short"))
+               hint = RWH_WRITE_LIFE_SHORT;
+       else if (!strcmp(argv[2], "medium"))
+               hint = RWH_WRITE_LIFE_MEDIUM;
+       else if (!strcmp(argv[2], "long"))
+               hint = RWH_WRITE_LIFE_LONG;
+       else if (!strcmp(argv[2], "extreme"))
+               hint = RWH_WRITE_LIFE_EXTREME;
+
+       if (hint == -1) {
+               fprintf(stderr, "invalid hint %s\n", argv[2]);
+               return 1;
+       }
+
+       fd = open(argv[1], O_WRONLY);
+       if (fd < 0) {
+               perror("open");
+               return 1;
+       }
+       if (fcntl(fd, F_SET_RW_HINT, &hint))
+               perror("fcntl");
+       return 0;
+}