]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
blockdev-util: move O_PATH fd conversion into btrfs_get_block_device_fd() to shorten...
authorLennart Poettering <lennart@poettering.net>
Tue, 29 Nov 2022 14:31:31 +0000 (15:31 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 29 Nov 2022 14:34:27 +0000 (15:34 +0100)
And let's use a simple call to the new fd_reopen_condition() helper
there.

src/shared/blockdev-util.c
src/shared/btrfs-util.c

index 72fad160edf39d6c9655135451d3eae49c785a63..eb9f54306f60fd63370a617d337239112999b9f5 100644 (file)
@@ -43,23 +43,7 @@ static int fd_get_devnum(int fd, BlockDeviceLookupFlag flags, dev_t *ret) {
                 /* If major(st.st_dev) is zero, this might mean we are backed by btrfs, which needs special
                  * handing, to get the backing device node. */
 
-                r = fcntl(fd, F_GETFL);
-                if (r < 0)
-                        return -errno;
-
-                if (FLAGS_SET(r, O_PATH)) {
-                        _cleanup_close_ int regfd = -1;
-
-                        /* The fstat() above we can execute on an O_PATH fd. But the btrfs ioctl we cannot.
-                         * Hence acquire a "real" fd first, without the O_PATH flag. */
-
-                        regfd = fd_reopen(fd, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
-                        if (regfd < 0)
-                                return regfd;
-
-                        r = btrfs_get_block_device_fd(regfd, &devnum);
-                } else
-                        r = btrfs_get_block_device_fd(fd, &devnum);
+                r = btrfs_get_block_device_fd(fd, &devnum);
                 if (r == -ENOTTY) /* not btrfs */
                         return -ENOTBLK;
                 if (r < 0)
@@ -288,21 +272,7 @@ int get_block_device_fd(int fd, dev_t *ret) {
                 return 1;
         }
 
-        r = fcntl(fd, F_GETFL);
-        if (r < 0)
-                return -errno;
-        if (FLAGS_SET(r, O_PATH) && (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode))) {
-                _cleanup_close_ int real_fd = -1;
-
-                /* The fstat() above we can execute on an O_PATH fd. But the btrfs ioctl we cannot. Hence
-                 * acquire a "real" fd first, without the O_PATH flag. */
-
-                real_fd = fd_reopen(fd, O_RDONLY|O_CLOEXEC);
-                if (real_fd < 0)
-                        return real_fd;
-                r = btrfs_get_block_device_fd(real_fd, ret);
-        } else
-                r = btrfs_get_block_device_fd(fd, ret);
+        r = btrfs_get_block_device_fd(fd, ret);
         if (r > 0)
                 return 1;
         if (r != -ENOTTY) /* not btrfs */
index 41e01e0b10de259c19599aaf8cc4c69bd23a1afd..affe06ec8006353e8e962e095d2da97de10276be 100644 (file)
@@ -247,12 +247,17 @@ int btrfs_clone_range(int infd, uint64_t in_offset, int outfd, uint64_t out_offs
 
 int btrfs_get_block_device_fd(int fd, dev_t *dev) {
         struct btrfs_ioctl_fs_info_args fsi = {};
+        _cleanup_close_ int regfd = -1;
         uint64_t id;
         int r;
 
         assert(fd >= 0);
         assert(dev);
 
+        fd = fd_reopen_condition(fd, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY, O_PATH, &regfd);
+        if (fd < 0)
+                return fd;
+
         r = fd_is_fs_type(fd, BTRFS_SUPER_MAGIC);
         if (r < 0)
                 return r;