From nobody Thu Nov 17 01:38:45 2022 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 4NCMyG05Fgz4hjLw; Thu, 17 Nov 2022 01:38:46 +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 4NCMyF6l03z3F64; Thu, 17 Nov 2022 01:38:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1668649125; 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=46Ojfl4v5AhIB1o+csIaABvWx1A7LK1L7udyHAVhn5U=; b=dpZstb19L038pLoCLDwhDylvfyO9zKrtfD12UxOTPJnykksXKl9yPrKmL/K9oKEpJwT2ye qbH6ywve/HP6ZutPGobTOd5Z5FRkbz3K0lvLEEp4hLcccZ4Lc1sbsF7ZT92EFRzb2+T/pK /X1zgLEryReN1Jaal44hgKXiNZIxQuoA8skBBKXGbR911P1EiGNCE6baIc5Ec/l9cT5+WN Fu3DK7CZPJAehJEI+jLXcipK0dtLJHR2NEJELobIA78QqFebv4yIhEWddzkDrCh1/y+wYZ XFEXR/WV2CauGgWYVxneJ15nKDycDNCD9uoinvbyOiFDeEoV3dMMr9YsBvGlRQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1668649125; 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=46Ojfl4v5AhIB1o+csIaABvWx1A7LK1L7udyHAVhn5U=; b=VQ4wyj1XL7dV9DCiLfokYxhIZQFtHopfmRhow9K1BwUKYPmNbNCcs8GJs+egb7TJuGoZg4 VRP7IKsrJ8NnAkdz4grrCV5Iy3YD5P/AK+W1kEryvfIEaBpHKYCrDyytXkvXBcTCVjstft wKk5L/FbZdZ7RUsCXfiBVaTCw2mYfvKulHuq42liFuoIdPso7gedx8LCK+5bglIgY24JyA GglMH76BtB7mU2ZBId/GkfEiwZUlQcVlHXfbVg6scMXkt9JVwplzlZpJstoXbWw79kYoDn sR7GwxTlDgg+4tcDmaP0UVwGi40YG+q24g5XujQTc6w8aO38JUHXyZ+q/X6V1A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1668649125; a=rsa-sha256; cv=none; b=kNBBwt9P7XRU/RgJ7sGKJeh8EBcT9A30/a5LAHJQxCXuieJt9Kx0FqG/v9NAm+ZV70zs8g TuF7rQp7mouqnFZVUIadGUnzEx47NBsDPFa9VBcZxhH05iRTYUOkKDhmWDkYSNbHYdXM9p yHE6cUtlch5k5WfaJnFRQYjlh0frUGPFhL7hOJBU4g32W2BDrmdOnXXpP1uT4eyFbHLVc0 Y2N2eRIWfGcYgk7t9cQgUcrJqITk/UYBrNfDgi3XoamLPsDUUDfc5pIM5o8E2KcX+16eYb YDCiwUvn5a87/iY3GTKMuxZrmQCm32oQPub9lIHzKT/yixs9pDtUGnjUo+kHPA== 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 4NCMyF5nwgzPBs; Thu, 17 Nov 2022 01:38:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2AH1cj3f048717; Thu, 17 Nov 2022 01:38:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2AH1cj6o048716; Thu, 17 Nov 2022 01:38:45 GMT (envelope-from git) Date: Thu, 17 Nov 2022 01:38:45 GMT Message-Id: <202211170138.2AH1cj6o048716@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: 4ee16246f978 - main - vfs_vnops.c: Fix blksize for ZFS 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: rmacklem X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4ee16246f97825e893e0a4a4499d1bbe5bc07b6a Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by rmacklem: URL: https://cgit.FreeBSD.org/src/commit/?id=4ee16246f97825e893e0a4a4499d1bbe5bc07b6a commit 4ee16246f97825e893e0a4a4499d1bbe5bc07b6a Author: Rick Macklem AuthorDate: 2022-11-17 01:37:22 +0000 Commit: Rick Macklem CommitDate: 2022-11-17 01:37:22 +0000 vfs_vnops.c: Fix blksize for ZFS Since ZFS reports _PC_MIN_HOLE_SIZE as 512 (although it appears that an unwritten region must be at least f_iosize to remain unallocated), vn_generic_copy_file_range() uses 4096 for the copy blksize for ZFS, reulting in slow copies. For most other file systems, _PC_MIN_HOLE_SIZE and f_iosize are the same value, so this patch modifies the code to use f_iosize for most cases. It also documents in comments why the blksize is being set a certain way, so that the code does not appear to be doing "magic math". Reported by: allanjude Reviewed by: allanjude, asomers MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D37076 --- sys/kern/vfs_vnops.c | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 8eaf23d91d4d..4d8963100a43 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -3266,7 +3266,7 @@ vn_generic_copy_file_range(struct vnode *invp, off_t *inoffp, int error, interrupted; bool cantseek, readzeros, eof, lastblock, holetoeof; ssize_t aresid, r = 0; - size_t copylen, len, rem, savlen; + size_t copylen, len, savlen; char *dat; long holein, holeout; struct timespec curts, endts; @@ -3338,31 +3338,38 @@ vn_generic_copy_file_range(struct vnode *invp, off_t *inoffp, if (error != 0) goto out; - /* - * Set the blksize to the larger of the hole sizes for invp and outvp. - * If hole sizes aren't available, set the blksize to the larger - * f_iosize of invp and outvp. - * This code expects the hole sizes and f_iosizes to be powers of 2. - * This value is clipped at 4Kbytes and 1Mbyte. - */ - blksize = MAX(holein, holeout); - - /* Clip len to end at an exact multiple of hole size. */ - if (blksize > 1) { - rem = *inoffp % blksize; - if (rem > 0) - rem = blksize - rem; - if (len > rem && len - rem > blksize) - len = savlen = rounddown(len - rem, blksize) + rem; - } - - if (blksize <= 1) + if (holein == 0 && holeout > 0) { + /* + * For this special case, the input data will be scanned + * for blocks of all 0 bytes. For these blocks, the + * write can be skipped for the output file to create + * an unallocated region. + * Therefore, use the appropriate size for the output file. + */ + blksize = holeout; + if (blksize <= 512) { + /* + * Use f_iosize, since ZFS reports a _PC_MIN_HOLE_SIZE + * of 512, although it actually only creates + * unallocated regions for blocks >= f_iosize. + */ + blksize = outvp->v_mount->mnt_stat.f_iosize; + } + } else { + /* + * Use the larger of the two f_iosize values. If they are + * not the same size, one will normally be an exact multiple of + * the other, since they are both likely to be a power of 2. + */ blksize = MAX(invp->v_mount->mnt_stat.f_iosize, outvp->v_mount->mnt_stat.f_iosize); + } + + /* Clip to sane limits. */ if (blksize < 4096) blksize = 4096; - else if (blksize > 1024 * 1024) - blksize = 1024 * 1024; + else if (blksize > maxphys) + blksize = maxphys; dat = malloc(blksize, M_TEMP, M_WAITOK); /*