]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fs-util: Add XO_NOCOW flag
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 23 Jul 2024 19:37:11 +0000 (21:37 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 24 Jul 2024 16:58:41 +0000 (18:58 +0200)
Let's add a flag for xopenat() that immediately makes a file NOCOW
after opening it if it's supported.

src/basic/fs-util.c
src/basic/fs-util.h

index 426cb5d6f676941ac883f4448539bff81f6c07e2..a6b53e7067c4e2ac7f4f175829d28fe47fef5ac5 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "alloc-util.h"
 #include "btrfs.h"
+#include "chattr-util.h"
 #include "dirent-util.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -1217,6 +1218,12 @@ int xopenat_full(int dir_fd, const char *path, int open_flags, XOpenFlags xopen_
                         goto error;
         }
 
+        if (FLAGS_SET(xopen_flags, XO_NOCOW)) {
+                r = chattr_fd(fd, FS_NOCOW_FL, FS_NOCOW_FL, NULL);
+                if (r < 0 && !ERRNO_IS_NOT_SUPPORTED(r))
+                        goto error;
+        }
+
         return TAKE_FD(fd);
 
 error:
index b050438cd7aa59cb9965f2dbaeb37ca3f9d28359..2ec4b196f87c1facf89899ad962aefe8ce17090f 100644 (file)
@@ -131,6 +131,7 @@ int parse_cifs_service(const char *s, char **ret_host, char **ret_service, char
 typedef enum XOpenFlags {
         XO_LABEL     = 1 << 0,
         XO_SUBVOLUME = 1 << 1,
+        XO_NOCOW     = 1 << 2,
 } XOpenFlags;
 
 int open_mkdir_at_full(int dirfd, const char *path, int flags, XOpenFlags xopen_flags, mode_t mode);