public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: sys-fs/zfs-kmod/files/, sys-fs/zfs-kmod/
Date: Fri, 22 Apr 2022 01:54:59 +0000 (UTC)	[thread overview]
Message-ID: <1650592493.3ac287680dc6014cf993afe44d99db03d0afa5ab.sam@gentoo> (raw)

commit:     3ac287680dc6014cf993afe44d99db03d0afa5ab
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Fri Apr 22 01:51:45 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Fri Apr 22 01:54:53 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=3ac28768

sys-fs/zfs-kmod: backport upstream ZERO_RANGE fix

Bug: https://github.com/openzfs/zfs/issues/13329
Signed-off-by: Sam James <sam <AT> gentoo.org>

 sys-fs/zfs-kmod/files/2.1.4-ZERO_RANGE.patch | 304 +++++++++++++++++++++++++++
 sys-fs/zfs-kmod/zfs-kmod-2.1.4-r1.ebuild     | 209 ++++++++++++++++++
 2 files changed, 513 insertions(+)

diff --git a/sys-fs/zfs-kmod/files/2.1.4-ZERO_RANGE.patch b/sys-fs/zfs-kmod/files/2.1.4-ZERO_RANGE.patch
new file mode 100644
index 000000000000..338b14208dab
--- /dev/null
+++ b/sys-fs/zfs-kmod/files/2.1.4-ZERO_RANGE.patch
@@ -0,0 +1,304 @@
+https://github.com/openzfs/zfs/commit/c220771a47e4206fb43e6849957657c9504b1b14
+https://github.com/openzfs/zfs/issues/13329
+
+From c220771a47e4206fb43e6849957657c9504b1b14 Mon Sep 17 00:00:00 2001
+From: Rich Ercolani <214141+rincebrain@users.noreply.github.com>
+Date: Wed, 20 Apr 2022 19:07:03 -0400
+Subject: [PATCH] Corrected oversight in ZERO_RANGE behavior
+
+It turns out, no, in fact, ZERO_RANGE and PUNCH_HOLE do
+have differing semantics in some ways - in particular,
+one requires KEEP_SIZE, and the other does not.
+
+Also added a zero-range test to catch this, corrected a flaw
+that made the punch-hole test succeed vacuously, and a typo
+in file_write.
+
+Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
+Signed-off-by: Rich Ercolani <rincebrain@gmail.com>
+Closes #13329
+Closes #13338
+--- a/module/os/linux/zfs/zpl_file.c
++++ b/module/os/linux/zfs/zpl_file.c
+@@ -781,11 +781,13 @@ zpl_fallocate_common(struct inode *ip, int mode, loff_t offset, loff_t len)
+ 	if (mode & (test_mode)) {
+ 		flock64_t bf;
+ 
+-		if (offset > olen)
+-			goto out_unmark;
++		if (mode & FALLOC_FL_KEEP_SIZE) {
++			if (offset > olen)
++				goto out_unmark;
+ 
+-		if (offset + len > olen)
+-			len = olen - offset;
++			if (offset + len > olen)
++				len = olen - offset;
++		}
+ 		bf.l_type = F_WRLCK;
+ 		bf.l_whence = SEEK_SET;
+ 		bf.l_start = offset;
+--- a/tests/runfiles/linux.run
++++ b/tests/runfiles/linux.run
+@@ -94,7 +94,7 @@ tests = ['events_001_pos', 'events_002_pos', 'zed_rc_filter', 'zed_fd_spill']
+ tags = ['functional', 'events']
+ 
+ [tests/functional/fallocate:Linux]
+-tests = ['fallocate_prealloc']
++tests = ['fallocate_prealloc', 'fallocate_zero-range']
+ tags = ['functional', 'fallocate']
+ 
+ [tests/functional/fault:Linux]
+--- a/tests/zfs-tests/cmd/file_write/file_write.c
++++ b/tests/zfs-tests/cmd/file_write/file_write.c
+@@ -251,7 +251,7 @@ usage(char *prog)
+ 	    "\t[-s offset] [-c write_count] [-d data]\n\n"
+ 	    "Where [data] equal to zero causes chars "
+ 	    "0->%d to be repeated throughout, or [data]\n"
+-	    "equal to 'R' for psudorandom data.\n",
++	    "equal to 'R' for pseudorandom data.\n",
+ 	    prog, DATA_RANGE);
+ 
+ 	exit(1);
+--- a/tests/zfs-tests/include/libtest.shlib
++++ b/tests/zfs-tests/include/libtest.shlib
+@@ -4236,6 +4236,22 @@ function punch_hole # offset length file
+ 	esac
+ }
+ 
++function zero_range # offset length file
++{
++	typeset offset=$1
++	typeset length=$2
++	typeset file=$3
++
++	case "$UNAME" in
++	Linux)
++		fallocate --zero-range --offset $offset --length $length "$file"
++		;;
++	*)
++		false
++		;;
++	esac
++}
++
+ #
+ # Wait for the specified arcstat to reach non-zero quiescence.
+ # If echo is 1 echo the value after reaching quiescence, otherwise
+--- a/tests/zfs-tests/tests/functional/fallocate/Makefile.am
++++ b/tests/zfs-tests/tests/functional/fallocate/Makefile.am
+@@ -3,4 +3,5 @@ dist_pkgdata_SCRIPTS = \
+ 	setup.ksh \
+ 	cleanup.ksh \
+ 	fallocate_prealloc.ksh \
+-	fallocate_punch-hole.ksh
++	fallocate_punch-hole.ksh \
++	fallocate_zero-range.ksh
+--- a/tests/zfs-tests/tests/functional/fallocate/fallocate_punch-hole.ksh
++++ b/tests/zfs-tests/tests/functional/fallocate/fallocate_punch-hole.ksh
+@@ -60,13 +60,17 @@ function cleanup
+ 	[[ -e $TESTDIR ]] && log_must rm -f $FILE
+ }
+ 
+-function check_disk_size
++function check_reported_size
+ {
+ 	typeset expected_size=$1
+ 
+-	disk_size=$(du $TESTDIR/file | awk '{print $1}')
+-	if [ $disk_size -ne $expected_size ]; then
+-		log_fail "Incorrect size: $disk_size != $expected_size"
++	if ! [ -e "${FILE}" ]; then
++		log_fail "$FILE does not exist"
++	fi
++		
++	reported_size=$(du "${FILE}" | awk '{print $1}')
++	if [ "$reported_size" != "$expected_size" ]; then
++		log_fail "Incorrect reported size: $reported_size != $expected_size"
+ 	fi
+ }
+ 
+@@ -74,9 +78,9 @@ function check_apparent_size
+ {
+ 	typeset expected_size=$1
+ 
+-	apparent_size=$(stat_size)
+-	if [ $apparent_size -ne $expected_size ]; then
+-		log_fail "Incorrect size: $apparent_size != $expected_size"
++	apparent_size=$(stat_size "${FILE}")
++	if [ "$apparent_size" != "$expected_size" ]; then
++		log_fail "Incorrect apparent size: $apparent_size != $expected_size"
+ 	fi
+ }
+ 
+@@ -86,25 +90,30 @@ log_onexit cleanup
+ 
+ # Create a dense file and check it is the correct size.
+ log_must file_write -o create -f $FILE -b $BLKSZ -c 8
+-log_must check_disk_size  $((131072 * 8))
++sync_pool $TESTPOOL
++log_must check_reported_size 1027
+ 
+ # Punch a hole for the first full block.
+ log_must punch_hole 0 $BLKSZ $FILE
+-log_must check_disk_size  $((131072 * 7))
++sync_pool $TESTPOOL
++log_must check_reported_size 899
+ 
+ # Partially punch a hole in the second block.
+ log_must punch_hole $BLKSZ $((BLKSZ / 2)) $FILE
+-log_must check_disk_size  $((131072 * 7))
++sync_pool $TESTPOOL
++log_must check_reported_size 899
+ 
+-# Punch a hole which overlaps the third and forth block.
++# Punch a hole which overlaps the third and fourth block.
+ log_must punch_hole $(((BLKSZ * 2) + (BLKSZ / 2))) $((BLKSZ)) $FILE
+-log_must check_disk_size  $((131072 * 7))
++sync_pool $TESTPOOL
++log_must check_reported_size 899
+ 
+ # Punch a hole from the fifth block past the end of file.  The apparent
+ # file size should not change since --keep-size is implied.
+ apparent_size=$(stat_size $FILE)
+ log_must punch_hole $((BLKSZ * 4)) $((BLKSZ * 10)) $FILE
+-log_must check_disk_size  $((131072 * 4))
++sync_pool $TESTPOOL
++log_must check_reported_size 387
+ log_must check_apparent_size $apparent_size
+ 
+ log_pass "Ensure holes can be punched in files making them sparse"
+--- /dev/null
++++ b/tests/zfs-tests/tests/functional/fallocate/fallocate_zero-range.ksh
+@@ -0,0 +1,119 @@
++#!/bin/ksh -p
++#
++# CDDL HEADER START
++#
++# The contents of this file are subject to the terms of the
++# Common Development and Distribution License (the "License").
++# You may not use this file except in compliance with the License.
++#
++# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
++# or http://www.opensolaris.org/os/licensing.
++# See the License for the specific language governing permissions
++# and limitations under the License.
++#
++# When distributing Covered Code, include this CDDL HEADER in each
++# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
++# If applicable, add the following below this CDDL HEADER, with the
++# fields enclosed by brackets "[]" replaced with your own identifying
++# information: Portions Copyright [yyyy] [name of copyright owner]
++#
++# CDDL HEADER END
++#
++
++#
++# Copyright (c) 2020 by Lawrence Livermore National Security, LLC.
++# Copyright (c) 2021 by The FreeBSD Foundation.
++#
++
++. $STF_SUITE/include/libtest.shlib
++
++#
++# DESCRIPTION:
++# Test FALLOC_FL_ZERO_RANGE functionality
++#
++# STRATEGY:
++# 1. Create a dense file
++# 2. Zero various ranges in the file and verify the result.
++#
++
++verify_runnable "global"
++
++if is_freebsd; then
++	log_unsupported "FreeBSD does not implement an analogue to ZERO_RANGE."
++fi
++
++FILE=$TESTDIR/$TESTFILE0
++BLKSZ=$(get_prop recordsize $TESTPOOL)
++
++function cleanup
++{
++	[[ -e $TESTDIR ]] && log_must rm -f $FILE
++}
++
++# Helpfully, this function expects kilobytes, and check_apparent_size expects bytes.
++function check_reported_size
++{
++	typeset expected_size=$1
++
++	if ! [ -e "${FILE}" ]; then
++		log_fail "$FILE does not exist"
++	fi
++		
++	reported_size=$(du "${FILE}" | awk '{print $1}')
++	if [ "$reported_size" != "$expected_size" ]; then
++		log_fail "Incorrect reported size: $reported_size != $expected_size"
++	fi
++}
++
++function check_apparent_size
++{
++	typeset expected_size=$1
++
++	apparent_size=$(stat_size "${FILE}")
++	if [ "$apparent_size" != "$expected_size" ]; then
++		log_fail "Incorrect apparent size: $apparent_size != $expected_size"
++	fi
++}
++
++log_assert "Ensure ranges can be zeroed in files"
++
++log_onexit cleanup
++
++# Create a dense file and check it is the correct size.
++log_must file_write -o create -f $FILE -b $BLKSZ -c 8
++sync_pool $TESTPOOL
++log_must check_reported_size 1027
++
++# Zero a range covering the first full block.
++log_must zero_range 0 $BLKSZ $FILE
++sync_pool $TESTPOOL
++log_must check_reported_size 899
++
++# Partially zero a range in the second block.
++log_must zero_range $BLKSZ $((BLKSZ / 2)) $FILE
++sync_pool $TESTPOOL
++log_must check_reported_size 899
++
++# Zero range which overlaps the third and fourth block.
++log_must zero_range $(((BLKSZ * 2) + (BLKSZ / 2))) $((BLKSZ)) $FILE
++sync_pool $TESTPOOL
++log_must check_reported_size 899
++
++# Zero range from the fifth block past the end of file, with --keep-size.
++# The apparent file size must not change, since we did specify --keep-size.
++apparent_size=$(stat_size $FILE)
++log_must fallocate --keep-size --zero-range --offset $((BLKSZ * 4)) --length $((BLKSZ * 10)) "$FILE"
++sync_pool $TESTPOOL
++log_must check_reported_size 387
++log_must check_apparent_size $apparent_size
++
++# Zero range from the fifth block past the end of file.  The apparent
++# file size should change since --keep-size is not implied, unlike
++# with PUNCH_HOLE.
++apparent_size=$(stat_size $FILE)
++log_must zero_range $((BLKSZ * 4)) $((BLKSZ * 10)) $FILE
++sync_pool $TESTPOOL
++log_must check_reported_size 387
++log_must check_apparent_size $((BLKSZ * 14))
++
++log_pass "Ensure ranges can be zeroed in files"
+--- a/tests/zfs-tests/tests/functional/fallocate/setup.ksh
++++ b/tests/zfs-tests/tests/functional/fallocate/setup.ksh
+@@ -26,4 +26,7 @@
+ . $STF_SUITE/include/libtest.shlib
+ 
+ DISK=${DISKS%% *}
+-default_setup $DISK
++default_setup_noexit $DISK
++log_must zfs set compression=off $TESTPOOL
++log_pass
++
+

diff --git a/sys-fs/zfs-kmod/zfs-kmod-2.1.4-r1.ebuild b/sys-fs/zfs-kmod/zfs-kmod-2.1.4-r1.ebuild
new file mode 100644
index 000000000000..55f1e5adc436
--- /dev/null
+++ b/sys-fs/zfs-kmod/zfs-kmod-2.1.4-r1.ebuild
@@ -0,0 +1,209 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit autotools dist-kernel-utils flag-o-matic linux-mod toolchain-funcs
+
+DESCRIPTION="Linux ZFS kernel module for sys-fs/zfs"
+HOMEPAGE="https://github.com/openzfs/zfs"
+
+if [[ ${PV} == "9999" ]]; then
+	inherit git-r3
+	EGIT_REPO_URI="https://github.com/openzfs/zfs.git"
+else
+	VERIFY_SIG_OPENPGP_KEY_PATH=${BROOT}/usr/share/openpgp-keys/openzfs.asc
+	inherit verify-sig
+
+	MY_PV="${PV/_rc/-rc}"
+	SRC_URI="https://github.com/openzfs/zfs/releases/download/zfs-${MY_PV}/zfs-${MY_PV}.tar.gz"
+	SRC_URI+=" verify-sig? ( https://github.com/openzfs/zfs/releases/download/zfs-${MY_PV}/zfs-${MY_PV}.tar.gz.asc )"
+	S="${WORKDIR}/zfs-${PV%_rc?}"
+	ZFS_KERNEL_COMPAT="5.17"
+
+	#  increments minor eg 5.14 -> 5.15, and still supports override.
+	ZFS_KERNEL_DEP="${ZFS_KERNEL_COMPAT_OVERRIDE:-${ZFS_KERNEL_COMPAT}}"
+	ZFS_KERNEL_DEP="${ZFS_KERNEL_DEP%%.*}.$(( ${ZFS_KERNEL_DEP##*.} + 1))"
+
+	if [[ ${PV} != *_rc* ]]; then
+		KEYWORDS="~amd64 ~arm64 ~ppc64 ~riscv"
+	fi
+fi
+
+LICENSE="CDDL MIT debug? ( GPL-2+ )"
+SLOT="0/${PVR}"
+IUSE="custom-cflags debug +rootfs"
+
+RDEPEND="${DEPEND}
+	!sys-kernel/spl
+"
+
+BDEPEND="
+	dev-lang/perl
+	virtual/awk
+"
+
+# we want dist-kernel block in BDEPEND because of portage resolver.
+# since linux-mod.eclass already sets version-unbounded dep, portage
+# will pull new versions. So we set it in BDEPEND which takes priority.
+# and we don't need in in git ebuild.
+if [[ ${PV} != "9999" ]] ; then
+	BDEPEND+="
+		verify-sig? ( sec-keys/openpgp-keys-openzfs )
+		dist-kernel? ( <virtual/dist-kernel-${ZFS_KERNEL_DEP}:= )
+	"
+fi
+
+# PDEPEND in this form is needed to trick portage suggest
+# enabling dist-kernel if only 1 package have it set
+PDEPEND="dist-kernel? ( ~sys-fs/zfs-${PV}[dist-kernel] )"
+
+RESTRICT="debug? ( strip ) test"
+
+DOCS=( AUTHORS COPYRIGHT META README.md )
+
+PATCHES=(
+	"${FILESDIR}"/${PV}-ZERO_RANGE.patch
+)
+
+pkg_pretend() {
+	use rootfs || return 0
+
+	if has_version virtual/dist-kernel && ! use dist-kernel; then
+		ewarn "You have virtual/dist-kernel installed, but"
+		ewarn "USE=\"dist-kernel\" is not enabled for ${CATEGORY}/${PN}"
+		ewarn "It's recommended to globally enable dist-kernel USE flag"
+		ewarn "to auto-trigger initrd rebuilds with kernel updates"
+	fi
+}
+
+pkg_setup() {
+	CONFIG_CHECK="
+		!DEBUG_LOCK_ALLOC
+		EFI_PARTITION
+		MODULES
+		!PAX_KERNEXEC_PLUGIN_METHOD_OR
+		!TRIM_UNUSED_KSYMS
+		ZLIB_DEFLATE
+		ZLIB_INFLATE
+	"
+
+	use debug && CONFIG_CHECK="${CONFIG_CHECK}
+		FRAME_POINTER
+		DEBUG_INFO
+		!DEBUG_INFO_REDUCED
+	"
+
+	use rootfs && \
+		CONFIG_CHECK="${CONFIG_CHECK}
+			BLK_DEV_INITRD
+			DEVTMPFS
+	"
+
+	kernel_is -lt 5 && CONFIG_CHECK="${CONFIG_CHECK} IOSCHED_NOOP"
+
+	if [[ ${PV} != "9999" ]]; then
+		local kv_major_max kv_minor_max zcompat
+		zcompat="${ZFS_KERNEL_COMPAT_OVERRIDE:-${ZFS_KERNEL_COMPAT}}"
+		kv_major_max="${zcompat%%.*}"
+		zcompat="${zcompat#*.}"
+		kv_minor_max="${zcompat%%.*}"
+		kernel_is -le "${kv_major_max}" "${kv_minor_max}" || die \
+			"Linux ${kv_major_max}.${kv_minor_max} is the latest supported version"
+
+	fi
+
+	kernel_is -ge 3 10 || die "Linux 3.10 or newer required"
+
+	linux-mod_pkg_setup
+}
+
+src_prepare() {
+	default
+
+	# Run unconditionally (bug #792627)
+	eautoreconf
+
+	if [[ ${PV} != "9999" ]]; then
+		# Set module revision number
+		sed -i "s/\(Release:\)\(.*\)1/\1\2${PR}-gentoo/" META || die "Could not set Gentoo release"
+	fi
+}
+
+src_configure() {
+	set_arch_to_kernel
+
+	use custom-cflags || strip-flags
+
+	filter-ldflags -Wl,*
+
+	# Set CROSS_COMPILE in the environment.
+	# This allows the user to override it via make.conf or via a local Makefile.
+	# https://bugs.gentoo.org/811600
+	export CROSS_COMPILE=${CROSS_COMPILE-${CHOST}-}
+
+	local myconf=(
+		HOSTCC="$(tc-getBUILD_CC)"
+		--bindir="${EPREFIX}/bin"
+		--sbindir="${EPREFIX}/sbin"
+		--with-config=kernel
+		--with-linux="${KV_DIR}"
+		--with-linux-obj="${KV_OUT_DIR}"
+		$(use_enable debug)
+	)
+
+	econf "${myconf[@]}"
+}
+
+src_compile() {
+	set_arch_to_kernel
+
+	myemakeargs=(
+		HOSTCC="$(tc-getBUILD_CC)"
+		V=1
+	)
+
+	emake "${myemakeargs[@]}"
+}
+
+src_install() {
+	set_arch_to_kernel
+
+	myemakeargs+=(
+		DEPMOD=:
+		# INSTALL_MOD_PATH ?= $(DESTDIR) in module/Makefile
+		DESTDIR="${D}"
+	)
+
+	emake "${myemakeargs[@]}" install
+
+	einstalldocs
+}
+
+pkg_postinst() {
+	linux-mod_pkg_postinst
+
+	if [[ -z ${ROOT} ]] && use dist-kernel; then
+		set_arch_to_portage
+		dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}"
+	fi
+
+	if use x86 || use arm; then
+		ewarn "32-bit kernels will likely require increasing vmalloc to"
+		ewarn "at least 256M and decreasing zfs_arc_max to some value less than that."
+	fi
+
+	if has_version sys-boot/grub; then
+		ewarn "This version of OpenZFS includes support for new feature flags"
+		ewarn "that are incompatible with previous versions. GRUB2 support for"
+		ewarn "/boot with the new feature flags is not yet available."
+		ewarn "Do *NOT* upgrade root pools to use the new feature flags."
+		ewarn "Any new pools will be created with the new feature flags by default"
+		ewarn "and will not be compatible with older versions of OpenZFS. To"
+		ewarn "create a newpool that is backward compatible wih GRUB2, use "
+		ewarn
+		ewarn "zpool create -o compatibility=grub2 ..."
+		ewarn
+		ewarn "Refer to /usr/share/zfs/compatibility.d/grub2 for list of features."
+	fi
+}


             reply	other threads:[~2022-04-22  1:55 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-22  1:54 Sam James [this message]
  -- strict thread matches above, loose matches on Subject: below --
2023-12-28  3:43 [gentoo-commits] repo/gentoo:master commit in: sys-fs/zfs-kmod/files/, sys-fs/zfs-kmod/ Sam James
2023-01-27 19:34 Georgy Yakovlev
2023-01-24 21:04 Georgy Yakovlev
2023-01-13  4:33 Georgy Yakovlev
2022-06-30 10:37 Sam James
2022-06-07 18:47 Georgy Yakovlev
2021-11-08  6:09 Sam James
2020-11-03 20:07 Georgy Yakovlev
2020-08-26 23:35 Georgy Yakovlev
2019-12-13 23:43 Georgy Yakovlev
2019-06-23  8:00 Georgy Yakovlev
2019-04-26 21:09 Georgy Yakovlev
2019-01-09  6:31 Georgy Yakovlev
2015-09-18 12:50 Richard Yao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1650592493.3ac287680dc6014cf993afe44d99db03d0afa5ab.sam@gentoo \
    --to=sam@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox