From 1b05ac946a6c7922365de7e0033cc82a75b5c361 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Tue, 23 Jul 2024 21:37:11 +0200 Subject: [PATCH] fs-util: Add XO_NOCOW flag 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 | 7 +++++++ src/basic/fs-util.h | 1 + 2 files changed, 8 insertions(+) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 426cb5d6f67..a6b53e7067c 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -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: diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index b050438cd7a..2ec4b196f87 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -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); -- 2.47.3