chiark / gitweb /
machined/machinectl: add logic to show list of available images
[elogind.git] / src / shared / btrfs-util.c
index 492d7fc777cefcb2de2b9b8033e7b9ef6451fb1a..d685b3ecbd23b12f9341974d0a8c6348bdfd7036 100644 (file)
@@ -84,18 +84,18 @@ int btrfs_is_snapshot(int fd) {
         struct stat st;
         struct statfs sfs;
 
-        if (fstatfs(fd, &sfs) < 0)
+        /* On btrfs subvolumes always have the inode 256 */
+
+        if (fstat(fd, &st) < 0)
                 return -errno;
 
-        if (!F_TYPE_EQUAL(sfs.f_type, BTRFS_SUPER_MAGIC))
+        if (!S_ISDIR(st.st_mode) || st.st_ino != 256)
                 return 0;
 
-        if (fstat(fd, &st) < 0)
+        if (fstatfs(fd, &sfs) < 0)
                 return -errno;
 
-        /* On btrfs subvolumes always have the inode 256 */
-
-        return S_ISDIR(st.st_mode) && st.st_ino == 256;
+        return F_TYPE_EQUAL(sfs.f_type, BTRFS_SUPER_MAGIC);
 }
 
 int btrfs_subvol_snapshot(const char *old_path, const char *new_path, bool read_only, bool fallback_copy) {
@@ -232,6 +232,15 @@ int btrfs_subvol_read_only(const char *path, bool b) {
         return 0;
 }
 
+int btrfs_subvol_is_read_only_fd(int fd) {
+        uint64_t flags;
+
+        if (ioctl(fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags) < 0)
+                return -errno;
+
+        return !!(flags & BTRFS_SUBVOL_RDONLY);
+}
+
 int btrfs_reflink(int infd, int outfd) {
         int r;