summaryrefslogtreecommitdiffstats
path: root/src/shared/copy.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-04-28 15:10:24 +0200
committerLennart Poettering <lennart@poettering.net>2023-04-28 15:10:24 +0200
commit427ad121c21479d1725ddaac1439c99d01e98ba1 (patch)
treee075ae976b4ba3a390fcb9daccae6a608f3b4559 /src/shared/copy.c
parentMerge pull request #27440 from yuwata/reflink-follow-ups (diff)
downloadsystemd-427ad121c21479d1725ddaac1439c99d01e98ba1.tar.xz
systemd-427ad121c21479d1725ddaac1439c99d01e98ba1.zip
copy: don't call clone ioctls twice
The btrfs name and the generic name have the same values, hence there's no point in bothering with the former.
Diffstat (limited to '')
-rw-r--r--src/shared/copy.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/src/shared/copy.c b/src/shared/copy.c
index 6a5a52309a..90c6e2c0ef 100644
--- a/src/shared/copy.c
+++ b/src/shared/copy.c
@@ -1610,13 +1610,11 @@ int reflink(int infd, int outfd) {
if (r < 0)
return r;
- /* FICLONE was introduced in Linux 4.5, so let's fall back to BTRFS_IOC_CLONE if it's not supported. */
+ /* FICLONE was introduced in Linux 4.5 but it uses the same number as BTRFS_IOC_CLONE introduced earlier */
- r = ioctl(outfd, FICLONE, infd);
- if (r < 0 && ERRNO_IS_NOT_SUPPORTED(errno))
- r = ioctl(outfd, BTRFS_IOC_CLONE, infd);
+ assert_cc(FICLONE == BTRFS_IOC_CLONE);
- return RET_NERRNO(r);
+ return RET_NERRNO(ioctl(outfd, FICLONE, infd));
}
assert_cc(sizeof(struct file_clone_range) == sizeof(struct btrfs_ioctl_clone_range_args));
@@ -1637,9 +1635,7 @@ int reflink_range(int infd, uint64_t in_offset, int outfd, uint64_t out_offset,
if (r < 0)
return r;
- r = ioctl(outfd, FICLONERANGE, &args);
- if (r < 0 && ERRNO_IS_NOT_SUPPORTED(errno))
- r = ioctl(outfd, BTRFS_IOC_CLONE_RANGE, &args);
+ assert_cc(FICLONERANGE == BTRFS_IOC_CLONE_RANGE);
- return RET_NERRNO(r);
+ return RET_NERRNO(ioctl(outfd, FICLONERANGE, &args));
}