From: Lennart Poettering Date: Tue, 29 Nov 2022 14:31:31 +0000 (+0100) Subject: blockdev-util: move O_PATH fd conversion into btrfs_get_block_device_fd() to shorten... X-Git-Tag: v253-rc1~419^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=698bc1861e8ed830517136177c2ddd5100de1994;p=thirdparty%2Fsystemd.git blockdev-util: move O_PATH fd conversion into btrfs_get_block_device_fd() to shorten things And let's use a simple call to the new fd_reopen_condition() helper there. --- diff --git a/src/shared/blockdev-util.c b/src/shared/blockdev-util.c index 72fad160edf..eb9f54306f6 100644 --- a/src/shared/blockdev-util.c +++ b/src/shared/blockdev-util.c @@ -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 */ diff --git a/src/shared/btrfs-util.c b/src/shared/btrfs-util.c index 41e01e0b10d..affe06ec800 100644 --- a/src/shared/btrfs-util.c +++ b/src/shared/btrfs-util.c @@ -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, ®fd); + if (fd < 0) + return fd; + r = fd_is_fs_type(fd, BTRFS_SUPER_MAGIC); if (r < 0) return r;