]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
copy: don't call clone ioctls twice
authorLennart Poettering <lennart@poettering.net>
Fri, 28 Apr 2023 13:10:24 +0000 (15:10 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 28 Apr 2023 13:10:24 +0000 (15:10 +0200)
The btrfs name and the generic name have the same values, hence there's
no point in bothering with the former.

src/shared/copy.c

index 6a5a52309aa16e9a759aa8d89309b4ade9b1782b..90c6e2c0efd8f957f9aae0070817826dff1e732e 100644 (file)
@@ -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));
 }