From nobody Fri Aug 8 00:55:34 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4bylvC03d3z63lXv; Fri, 08 Aug 2025 00:55:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bylvB6fXHz3fGN; Fri, 08 Aug 2025 00:55:34 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754614534; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=vnDfVm1OlOuiESaAqAh3HSnBwe6mhglN8Y160gDBmko=; b=a2UK4gA2X7rPqa2r3rma/qwqbRqGEvq+STMrxK/yocdxbGODeAY86+tLaxsdWJ1sV3WTa+ 17scroxQky75dChcwkO4a3kMNorELYdxscYJYwO+CSgR95yzLHMTTQAYbFJpmsgqgVN2m5 bqhu4sw1igb89jYtdLDmHJ/KS+dN7Hn/ad16HLfShXgLptZwN5e0G1yZh5FJvPIN7QK382 6Kf4jmNUM/muGtUm77d6ZUOkh9AQpX1r7w6l/CptsSq6QmxdD8oYnKG0QVnry9Yyr/wBXQ 9t+GBj1wxPq5VauVBZShhPE0s4tVlGN6G49BgILOOZQ0W9hU8KcpY2tkPzULTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754614534; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=vnDfVm1OlOuiESaAqAh3HSnBwe6mhglN8Y160gDBmko=; b=wHrq3IaVSK22Y2Wfzc6sSHew8yqfTBAF476lrUVYJNtX/9PxyTqGi/LQB0r5eO1kVkyi9N 12/DbamLGcYvf9SmJ4dK9Bfy4VBEqV/KOqHzLSPtFlV4ZvnKsG0taZnSaLQHk0oZCN3gs/ GYxG5du5h0jyFsHcsgPTWKHboUncRZVcxfaDinJayOpddHCGw9+S09h4H6KlyHA391vGyc X0FmIOgbP5wfDeU8aCXSVXJKY18YOwrQq6NPuhEYbolYgXCq6h2i3FZBja0z54LTNP5sZO 65aZxAW9/jY4SLnInJuNvilkrYeLplJajjnnKmWA3LTSFlQWmzHlo0cnVRCASA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754614534; a=rsa-sha256; cv=none; b=RuLlsQuxdyeE/DYC6BMsnIftJW/dwuZn2e0cas2Ebss6LO9FNMIWk5FJSz2ut50lQXw6PM RqnbJdTF0+vF+lDSCDobOlvfGJPAfZ67uOJwLz6pEhPnwCujujHxPiYXW7ko8Tl/3ol+kN Kqsb0fxnbot//p2OWxjl3R4BzOdDBmyTdD1bBov8QU98DxnrWCjRNRvg5tkaM6Kd4wZvRf t0ALWuAw46hk0eT6x3b8JlSt+1VV8oLJMj0wPk9p4tpwHl1zkOpRnte/xLStusMk7WLchy TfVy2nrSzZA8VVHIekayZ/jHs5SZHgJBLi5JlL20vEuYzhP5vEO/ZUu9MbteSw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bylvB5zWQz5p; Fri, 08 Aug 2025 00:55:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5780tY7n010163; Fri, 8 Aug 2025 00:55:34 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5780tYVq010160; Fri, 8 Aug 2025 00:55:34 GMT (envelope-from git) Date: Fri, 8 Aug 2025 00:55:34 GMT Message-Id: <202508080055.5780tYVq010160@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Rick Macklem Subject: git: 37b2cb5ecb0f - main - vfs: Add support for file cloning to VOP_COPY_FILE_RANGE List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rmacklem X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 37b2cb5ecb0fb1b1f5a98ff4c08b61b8c05ec1d7 Auto-Submitted: auto-generated The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=37b2cb5ecb0fb1b1f5a98ff4c08b61b8c05ec1d7 commit 37b2cb5ecb0fb1b1f5a98ff4c08b61b8c05ec1d7 Author: Rick Macklem AuthorDate: 2025-08-08 00:52:23 +0000 Commit: Rick Macklem CommitDate: 2025-08-08 00:52:23 +0000 vfs: Add support for file cloning to VOP_COPY_FILE_RANGE NFSv4 has a separate CLONE operation from COPY with a couple of semantics differences. Unlike COPY, CLONE must complete the "copy on write" and cannot return partially copied. It also is required to use offsets (and the length if not to EOF) that are aligned to a buffer boundary. Since VOP_COPY_FILE_RANGE() can already do "copy on write" for file systems that support it, such as ZFS with block cloning enabled, all this patch does is add a flag called COPY_FILE_RANGE_CLONE so that it will conform to the rule that it must do a "copy on write" to completion. The patch also adds a new pathconf(2) name _PC_CLONE_BLKSIZE, which acquires the blocksize requirement for cloning and returns 0 for file systems that do not support the "copy on write" feature. (This is needed for the NFSv4.2 clone_blksize attribute.) This patch will allow the implementation of CLONE for NFSv4.2. Reviewed by: asomers Differential Revision: https://reviews.freebsd.org/D51808 --- sys/fs/fuse/fuse_vnops.c | 3 +++ sys/kern/vfs_default.c | 1 + sys/kern/vfs_syscalls.c | 2 +- sys/kern/vfs_vnops.c | 5 +++++ sys/sys/unistd.h | 1 + sys/sys/vnode.h | 17 +++++++++++++---- 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/sys/fs/fuse/fuse_vnops.c b/sys/fs/fuse/fuse_vnops.c index b90ce60ec664..b782146b7278 100644 --- a/sys/fs/fuse/fuse_vnops.c +++ b/sys/fs/fuse/fuse_vnops.c @@ -877,6 +877,9 @@ fuse_vnop_copy_file_range(struct vop_copy_file_range_args *ap) pid_t pid; int err; + if ((ap->a_flags & COPY_FILE_RANGE_CLONE) != 0) + return (EXTERROR(ENOSYS, "Cannot clone")); + if (mp == NULL || mp != vnode_mount(outvp)) return (EXTERROR(ENOSYS, "Mount points do not match")); diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index fd6202a1424c..85f67731e1cc 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -457,6 +457,7 @@ vop_stdpathconf(struct vop_pathconf_args *ap) case _PC_NAMEDATTR_ENABLED: case _PC_HAS_NAMEDATTR: case _PC_HAS_HIDDENSYSTEM: + case _PC_CLONE_BLKSIZE: *ap->a_retval = 0; return (0); default: diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 9704e9c160a8..c64618036733 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -5058,7 +5058,7 @@ kern_copy_file_range(struct thread *td, int infd, off_t *inoffp, int outfd, error = 0; retlen = 0; - if (flags != 0) { + if ((flags & ~COPY_FILE_RANGE_USERFLAGS) != 0) { error = EINVAL; goto out; } diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 6451c9e07a60..93f87ddae4de 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -3443,6 +3443,11 @@ vn_generic_copy_file_range(struct vnode *invp, off_t *inoffp, interrupted = 0; dat = NULL; + if ((flags & COPY_FILE_RANGE_CLONE) != 0) { + error = ENOSYS; + goto out; + } + error = vn_lock(invp, LK_SHARED); if (error != 0) goto out; diff --git a/sys/sys/unistd.h b/sys/sys/unistd.h index 85ed93fd359d..7ab2f021e408 100644 --- a/sys/sys/unistd.h +++ b/sys/sys/unistd.h @@ -159,6 +159,7 @@ #define _PC_XATTR_ENABLED _PC_NAMEDATTR_ENABLED /* Solaris Compatible */ #define _PC_XATTR_EXISTS _PC_HAS_NAMEDATTR /* Solaris Compatible */ #define _PC_HAS_HIDDENSYSTEM 68 +#define _PC_CLONE_BLKSIZE 69 #endif /* From OpenSolaris, used by SEEK_DATA/SEEK_HOLE. */ diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 074769d55c2d..8080e9edd8c3 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -397,8 +397,21 @@ struct vattr { */ #define VLKTIMEOUT (hz / 20 + 1) +/* copy_file_range flags */ +#define COPY_FILE_RANGE_KFLAGS 0xff000000 + +/* + * copy_file_range flags visible to user space. + * Allocate high bits first, to try and avoid conflicting with Linux. + */ +#define COPY_FILE_RANGE_CLONE 0x00800000 /* Require cloning. */ +#define COPY_FILE_RANGE_USERFLAGS (COPY_FILE_RANGE_CLONE) + #ifdef _KERNEL +/* copy_file_range flags only usable in the kernel */ +#define COPY_FILE_RANGE_TIMEO1SEC 0x01000000 /* Return after 1sec. */ + #ifdef MALLOC_DECLARE MALLOC_DECLARE(M_VNODE); #endif @@ -621,10 +634,6 @@ typedef void vop_getpages_iodone_t(void *, vm_page_t *, int, int); #define VN_OPEN_INVFS 0x00000008 #define VN_OPEN_WANTIOCTLCAPS 0x00000010 -/* copy_file_range kernel flags */ -#define COPY_FILE_RANGE_KFLAGS 0xff000000 -#define COPY_FILE_RANGE_TIMEO1SEC 0x01000000 /* Return after 1sec. */ - /* * Public vnode manipulation functions. */