X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fbtrfs-util.c;h=b34ac8b15a80260c13cef09701bf1673d79d84df;hb=07a0d22f9ec5a0cac2385b73dc08b12a811cead8;hp=254483c31a3ce5649fc0d722456c448a5461d450;hpb=1c7dd82563ff2e71a067aea20d2acb2d0553644b;p=elogind.git diff --git a/src/shared/btrfs-util.c b/src/shared/btrfs-util.c index 254483c31..b34ac8b15 100644 --- a/src/shared/btrfs-util.c +++ b/src/shared/btrfs-util.c @@ -228,14 +228,18 @@ int btrfs_subvol_remove(const char *path) { return 0; } -int btrfs_subvol_set_read_only(const char *path, bool b) { - _cleanup_close_ int fd = -1; +int btrfs_subvol_set_read_only_fd(int fd, bool b) { uint64_t flags, nflags; + struct stat st; - fd = open(path, O_RDONLY|O_NOCTTY|O_CLOEXEC); - if (fd < 0) + assert(fd >= 0); + + if (fstat(fd, &st) < 0) return -errno; + if (!S_ISDIR(st.st_mode) || st.st_ino != 256) + return -EINVAL; + if (ioctl(fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags) < 0) return -errno; @@ -253,6 +257,16 @@ int btrfs_subvol_set_read_only(const char *path, bool b) { return 0; } +int btrfs_subvol_set_read_only(const char *path, bool b) { + _cleanup_close_ int fd = -1; + + fd = open(path, O_RDONLY|O_NOCTTY|O_CLOEXEC|O_DIRECTORY); + if (fd < 0) + return -errno; + + return btrfs_subvol_set_read_only_fd(fd, b); +} + int btrfs_subvol_get_read_only_fd(int fd) { uint64_t flags;