From nobody Tue Nov 28 17:33:23 2023 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 4SfqLD24DHz52GxR; Tue, 28 Nov 2023 17:33:24 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SfqLD1N0bz4FNZ; Tue, 28 Nov 2023 17:33:24 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701192804; 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=rznUSIjOSpA5XXA3MsPlKSEA5B4uJu0/od+w2f/tzrU=; b=EfCUKzMxi7CUmzefbLXuteEjHY+2v3TDo1TtYE+22f/PFdTj067+JVdBu9+CEhL/K2H0DU Pt60y+oxGYhh96vIS67atMqESVFqcWcmX0MyIYgPz6nuY01EmthnbigEn1eJMS8ngfRJJy YHZrO1EWExpPw840bUS5ea0LRI+4fnS38uMSb5he6igXrgddPZN9lO7Mwq6kD6Wo3SnlHu OVzkBNBYN2gOIQg7wZT6qZlFvCTZv+Q/2LTtInDrUY8+UsLObTLVsGkY3j2BH48TujP5hR NULTvqvY1WdelvAuOYmqnYoRvZgmDPe+EOXrD9qMRoQ+e42nkR0AZaFelOvnEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1701192804; 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=rznUSIjOSpA5XXA3MsPlKSEA5B4uJu0/od+w2f/tzrU=; b=SqhjfhpVEdOhqnu7bDHSPqQ7p8cmDejrPumoKOC66qBIgzY0iKq4gYaoxaJMgRdF9MHVb/ KxCqIxQFE4irwgu1S6CvCz5/W9yaSKd19iQVEX+GJExsGHn/lT5lxZwuwR+8p4ZQy01kmS JQaPnkNQPlqS054VbqCDTw+2oe01KdSo5ZdaDJR97Ws4JKPl+bj+mAit9IQl+MBKjgSoSg uJpBhqns3YmknYwrU4qToFn2ZUZe7Mnef6kLkdPmhIdGmFBBshC7W5ZQ1c5lvJxZT+9m6D 29nqYO2HFu4JQcOq6cRtuxdNArjlkVbQt7b2a0Ch2Lq+OsN+7EZ+FUiSs8nylA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1701192804; a=rsa-sha256; cv=none; b=DK/S3T6VYW6lWtYZEbjpWlnI7HinxsnyXNLdCZIRH+JOQG8OIaPsZA9vLO3HySqog2m7yC na8lvXBUVCDP0cIXotffLDUsdy1ZQcep9d1SbwR15eAttjpcs/xQVoRVqqyMdhyuLk+D04 vLlXnmLhKurhCWez9azHpAMIbn8Zm2rpYYAtslciMUbrHyx+/LPMXbzNpYWgWXZ2ppIcfx sqdsLYXKkRYx4DEzhnxsf2OKl01Dev+Eny3EHsp6g4t/QKJK1S9hXydSZRME+zjPVgWbOF m05y2NHvYp1bTUeyGl11Qv1CZaY2uqaEWTGuidwY3GmNH0T2Nv6dbtepyTWYdA== 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 4SfqLD033VzWrH; Tue, 28 Nov 2023 17:33:24 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3ASHXNG5028888; Tue, 28 Nov 2023 17:33:23 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3ASHXNm1028885; Tue, 28 Nov 2023 17:33:23 GMT (envelope-from git) Date: Tue, 28 Nov 2023 17:33:23 GMT Message-Id: <202311281733.3ASHXNm1028885@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: a9bc8637690c - main - vn_copy_file_range(): find write vnodes on which to call the VOP 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: a9bc8637690ce29496650a41d3c25e225ed22e3d Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=a9bc8637690ce29496650a41d3c25e225ed22e3d commit a9bc8637690ce29496650a41d3c25e225ed22e3d Author: Konstantin Belousov AuthorDate: 2023-11-18 08:57:44 +0000 Commit: Konstantin Belousov CommitDate: 2023-11-28 17:32:53 +0000 vn_copy_file_range(): find write vnodes on which to call the VOP Reviewed by: markj, Olivier Certner Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D42603 --- sys/kern/vfs_vnops.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index e90330b08cbc..29114f795f5e 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -3070,10 +3070,12 @@ vn_copy_file_range(struct vnode *invp, off_t *inoffp, struct vnode *outvp, struct ucred *outcred, struct thread *fsize_td) { struct mount *inmp, *outmp; + struct vnode *invpl, *outvpl; int error; size_t len; uint64_t uval; + invpl = outvpl = NULL; len = *lenp; *lenp = 0; /* For error returns. */ error = 0; @@ -3099,17 +3101,22 @@ vn_copy_file_range(struct vnode *invp, off_t *inoffp, struct vnode *outvp, if (len == 0) goto out; - inmp = invp->v_mount; - outmp = outvp->v_mount; - if (inmp == NULL || outmp == NULL) { - error = EBADF; + error = VOP_GETLOWVNODE(invp, &invpl, FREAD); + if (error != 0) goto out; - } + error = VOP_GETLOWVNODE(outvp, &outvpl, FWRITE); + if (error != 0) + goto out1; + + inmp = invpl->v_mount; + outmp = outvpl->v_mount; + if (inmp == NULL || outmp == NULL) + goto out2; for (;;) { error = vfs_busy(inmp, 0); if (error != 0) - goto out; + goto out2; if (inmp == outmp) break; error = vfs_busy(outmp, MBF_NOWAIT); @@ -3120,7 +3127,7 @@ vn_copy_file_range(struct vnode *invp, off_t *inoffp, struct vnode *outvp, vfs_unbusy(outmp); continue; } - goto out; + goto out2; } break; } @@ -3131,16 +3138,21 @@ vn_copy_file_range(struct vnode *invp, off_t *inoffp, struct vnode *outvp, * which can handle copies across multiple file system types. */ *lenp = len; - if (inmp == outmp || strcmp(inmp->mnt_vfc->vfc_name, - outmp->mnt_vfc->vfc_name) == 0) - error = VOP_COPY_FILE_RANGE(invp, inoffp, outvp, outoffp, + if (inmp == outmp || inmp->mnt_vfc == outmp->mnt_vfc) + error = VOP_COPY_FILE_RANGE(invpl, inoffp, outvpl, outoffp, lenp, flags, incred, outcred, fsize_td); else - error = vn_generic_copy_file_range(invp, inoffp, outvp, + error = vn_generic_copy_file_range(invpl, inoffp, outvpl, outoffp, lenp, flags, incred, outcred, fsize_td); vfs_unbusy(outmp); if (inmp != outmp) vfs_unbusy(inmp); +out2: + if (outvpl != NULL) + vrele(outvpl); +out1: + if (invpl != NULL) + vrele(invpl); out: return (error); }