#include <errno.h>
#include <fcntl.h>
#include <linux/btrfs.h>
+#include <linux/fs.h>
#include <linux/magic.h>
#include <sys/ioctl.h>
#include <sys/resource.h>
#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"
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;
+}
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/<fd> path needs */
#define PROC_FD_PATH_MAX \
#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"
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,
if (copy < 0)
return copy;
- r = loop_get_diskseq(copy, &diskseq);
+ r = fd_get_diskseq(copy, &diskseq);
if (r < 0 && r != -EOPNOTSUPP)
return r;
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;