diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index c02b52992b..6c1de92a26 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,7 @@ #include "io-util.h" #include "macro.h" #include "missing_fcntl.h" +#include "missing_fs.h" #include "missing_syscall.h" #include "parse-util.h" #include "path-util.h" @@ -788,3 +790,24 @@ int btrfs_defrag_fd(int fd) { return RET_NERRNO(ioctl(fd, BTRFS_IOC_DEFRAG, NULL)); } + +int fd_get_diskseq(int fd, uint64_t *ret) { + uint64_t diskseq; + + assert(fd >= 0); + assert(ret); + + if (ioctl(fd, BLKGETDISKSEQ, &diskseq) < 0) { + /* Note that the kernel is weird: non-existing ioctls currently return EINVAL + * rather than ENOTTY on loopback block devices. They should fix that in the kernel, + * but in the meantime we accept both here. */ + if (!ERRNO_IS_NOT_SUPPORTED(errno) && errno != EINVAL) + return -errno; + + return -EOPNOTSUPP; + } + + *ret = diskseq; + + return 0; +} diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h index f5cfcb4ede..808cac4d5d 100644 --- a/src/basic/fd-util.h +++ b/src/basic/fd-util.h @@ -109,6 +109,7 @@ static inline int make_null_stdio(void) { int fd_reopen(int fd, int flags); int read_nr_open(void); int btrfs_defrag_fd(int fd); +int fd_get_diskseq(int fd, uint64_t *ret); /* The maximum length a buffer for a /proc/self/fd/ path needs */ #define PROC_FD_PATH_MAX \ diff --git a/src/shared/loop-util.c b/src/shared/loop-util.c index 8736c930ad..6356ff44d8 100644 --- a/src/shared/loop-util.c +++ b/src/shared/loop-util.c @@ -23,7 +23,6 @@ #include "fd-util.h" #include "fileio.h" #include "loop-util.h" -#include "missing_fs.h" #include "missing_loop.h" #include "parse-util.h" #include "random-util.h" @@ -129,27 +128,6 @@ static int device_has_block_children(sd_device *d) { return 0; } -static int loop_get_diskseq(int fd, uint64_t *ret_diskseq) { - uint64_t diskseq; - - assert(fd >= 0); - assert(ret_diskseq); - - if (ioctl(fd, BLKGETDISKSEQ, &diskseq) < 0) { - /* Note that the kernel is weird: non-existing ioctls currently return EINVAL - * rather than ENOTTY on loopback block devices. They should fix that in the kernel, - * but in the meantime we accept both here. */ - if (!ERRNO_IS_NOT_SUPPORTED(errno) && errno != EINVAL) - return -errno; - - return -EOPNOTSUPP; - } - - *ret_diskseq = diskseq; - - return 0; -} - static int loop_configure( int fd, int nr, @@ -454,7 +432,7 @@ static int loop_device_make_internal( if (copy < 0) return copy; - r = loop_get_diskseq(copy, &diskseq); + r = fd_get_diskseq(copy, &diskseq); if (r < 0 && r != -EOPNOTSUPP) return r; @@ -593,7 +571,7 @@ static int loop_device_make_internal( assert(S_ISBLK(st.st_mode)); uint64_t diskseq = 0; - r = loop_get_diskseq(loop_with_fd, &diskseq); + r = fd_get_diskseq(loop_with_fd, &diskseq); if (r < 0 && r != -EOPNOTSUPP) return r;