From: Lennart Poettering Date: Fri, 28 Apr 2023 13:16:00 +0000 (+0200) Subject: copy: shortcut reflink_range() to reflink() in some cases X-Git-Tag: v254-rc1~598^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F27445%2Fhead;p=thirdparty%2Fsystemd.git copy: shortcut reflink_range() to reflink() in some cases --- diff --git a/src/shared/copy.c b/src/shared/copy.c index 90c6e2c0efd..14b9b61d8a2 100644 --- a/src/shared/copy.c +++ b/src/shared/copy.c @@ -1631,6 +1631,12 @@ 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;