1
0
mirror of https://github.com/systemd/systemd.git synced 2025-02-13 01:57:42 +03:00

Merge pull request #27445 from poettering/reflink-fix

remove duplication reflink ioctl invocation
This commit is contained in:
Mike Yuan 2023-04-29 01:33:21 +08:00 committed by GitHub
commit 0102857b52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View 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));
@ -1633,13 +1631,17 @@ int reflink_range(int infd, uint64_t in_offset, int outfd, uint64_t out_offset,
assert(infd >= 0);
assert(outfd >= 0);
/* Inside the kernel, FICLONE is identical to FICLONERANGE with offsets and size set to zero, let's
* simplify things and use the simple ioctl in that case. Also, do the same if the size is
* UINT64_MAX, which is how we usually encode "everything". */
if (in_offset == 0 && out_offset == 0 && IN_SET(sz, 0, UINT64_MAX))
return reflink(infd, outfd);
r = fd_verify_regular(outfd);
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));
}