]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
btrfs-util: define helper that creates a btrfs subvol if we can, and a directory...
authorLennart Poettering <lennart@poettering.net>
Thu, 9 Apr 2020 09:56:23 +0000 (11:56 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 9 Apr 2020 10:12:52 +0000 (12:12 +0200)
src/basic/btrfs-util.c
src/basic/btrfs-util.h

index 18a7217757936f3b4bce9893d9b878254f30fc10..68367dfbd6e0d4e0ce6e43526593124fd9d820c8 100644 (file)
@@ -160,6 +160,31 @@ int btrfs_subvol_make(const char *path) {
         return btrfs_subvol_make_fd(fd, subvolume);
 }
 
+int btrfs_subvol_make_fallback(const char *path, mode_t mode) {
+        mode_t old, combined;
+        int r;
+
+        assert(path);
+
+        /* Let's work like mkdir(), i.e. take the specified mode, and mask it with the current umask. */
+        old = umask(~mode);
+        combined = old | ~mode;
+        if (combined != ~mode)
+                umask(combined);
+        r = btrfs_subvol_make(path);
+        umask(old);
+
+        if (r >= 0)
+                return 1; /* subvol worked */
+        if (r != -ENOTTY)
+                return r;
+
+        if (mkdir(path, mode) < 0)
+                return -errno;
+
+        return 0; /* plain directory */
+}
+
 int btrfs_subvol_set_read_only_fd(int fd, bool b) {
         uint64_t flags, nflags;
         struct stat st;
index b15667bf2f8336246fef994b29611019d3fc81d5..c1bbb42ca1bdb98765d7321cb0bdac797d8ad76a 100644 (file)
@@ -66,6 +66,8 @@ int btrfs_quota_scan_ongoing(int fd);
 int btrfs_subvol_make(const char *path);
 int btrfs_subvol_make_fd(int fd, const char *subvolume);
 
+int btrfs_subvol_make_fallback(const char *path, mode_t);
+
 int btrfs_subvol_snapshot_fd_full(int old_fd, const char *new_path, BtrfsSnapshotFlags flags, copy_progress_path_t progress_path, copy_progress_bytes_t progress_bytes, void *userdata);
 static inline int btrfs_subvol_snapshot_fd(int old_fd, const char *new_path, BtrfsSnapshotFlags flags) {
         return btrfs_subvol_snapshot_fd_full(old_fd, new_path, flags, NULL, NULL, NULL);