diff options
author | Martin Matuska <mm@FreeBSD.org> | 2023-09-29 23:21:44 +0000 |
---|---|---|
committer | Martin Matuska <mm@FreeBSD.org> | 2023-09-29 23:41:51 +0000 |
commit | f7a5903de272db58b2b9164c1219fc2d5b757654 (patch) | |
tree | b404ea19dcd9209bbaec51afef88c8349004002d | |
parent | e47381c9fc72c16e063da71fb32191e402948a50 (diff) | |
parent | e13538856479ff79ca6642e53dddf8a593deb2c9 (diff) |
zfs: merge openzfs/zfs@e13538856
Notable upstream pull request merges:
#15308 5551dcd76 Don't allocate from new metaslabs
#15312 ba769ea35 Fix ENOSPC for extended quota
#15321 e13538856 Restrict short block cloning requests
#15324 f9c39dc86 Tweak rebuild in-flight hard limit
Obtained from: OpenZFS
OpenZFS commit: e13538856479ff79ca6642e53dddf8a593deb2c9
16 files changed, 57 insertions, 32 deletions
diff --git a/sys/contrib/openzfs/module/zfs/dsl_dir.c b/sys/contrib/openzfs/module/zfs/dsl_dir.c index bbe6a03d620f..baf970121a61 100644 --- a/sys/contrib/openzfs/module/zfs/dsl_dir.c +++ b/sys/contrib/openzfs/module/zfs/dsl_dir.c @@ -26,6 +26,7 @@ * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved. * Copyright (c) 2016 Actifio, Inc. All rights reserved. * Copyright (c) 2018, loli10K <ezomori.nozomu@gmail.com>. All rights reserved. + * Copyright (c) 2023 Hewlett Packard Enterprise Development LP. */ #include <sys/dmu.h> @@ -1358,30 +1359,23 @@ top_of_function: ext_quota = 0; if (used_on_disk >= quota) { + if (retval == ENOSPC && (used_on_disk - quota) < + dsl_pool_deferred_space(dd->dd_pool)) { + retval = SET_ERROR(ERESTART); + } /* Quota exceeded */ mutex_exit(&dd->dd_lock); DMU_TX_STAT_BUMP(dmu_tx_quota); return (retval); } else if (used_on_disk + est_inflight >= quota + ext_quota) { - if (est_inflight > 0 || used_on_disk < quota) { - retval = SET_ERROR(ERESTART); - } else { - ASSERT3U(used_on_disk, >=, quota); - - if (retval == ENOSPC && (used_on_disk - quota) < - dsl_pool_deferred_space(dd->dd_pool)) { - retval = SET_ERROR(ERESTART); - } - } - dprintf_dd(dd, "failing: used=%lluK inflight = %lluK " - "quota=%lluK tr=%lluK err=%d\n", + "quota=%lluK tr=%lluK\n", (u_longlong_t)used_on_disk>>10, (u_longlong_t)est_inflight>>10, - (u_longlong_t)quota>>10, (u_longlong_t)asize>>10, retval); + (u_longlong_t)quota>>10, (u_longlong_t)asize>>10); mutex_exit(&dd->dd_lock); DMU_TX_STAT_BUMP(dmu_tx_quota); - return (retval); + return (SET_ERROR(ERESTART)); } /* We need to up our estimated delta before dropping dd_lock */ diff --git a/sys/contrib/openzfs/module/zfs/metaslab.c b/sys/contrib/openzfs/module/zfs/metaslab.c index dd4ff77e6f5d..8635403d6ad4 100644 --- a/sys/contrib/openzfs/module/zfs/metaslab.c +++ b/sys/contrib/openzfs/module/zfs/metaslab.c @@ -3251,6 +3251,15 @@ static boolean_t metaslab_should_allocate(metaslab_t *msp, uint64_t asize, boolean_t try_hard) { /* + * This case will usually but not always get caught by the checks below; + * metaslabs can be loaded by various means, including the trim and + * initialize code. Once that happens, without this check they are + * allocatable even before they finish their first txg sync. + */ + if (unlikely(msp->ms_new)) + return (B_FALSE); + + /* * If the metaslab is loaded, ms_max_size is definitive and we can use * the fast check. If it's not, the ms_max_size is a lower bound (once * set), and we should use the fast check as long as we're not in diff --git a/sys/contrib/openzfs/module/zfs/vdev_rebuild.c b/sys/contrib/openzfs/module/zfs/vdev_rebuild.c index 75c3900cbb0c..6503390f7973 100644 --- a/sys/contrib/openzfs/module/zfs/vdev_rebuild.c +++ b/sys/contrib/openzfs/module/zfs/vdev_rebuild.c @@ -807,12 +807,12 @@ vdev_rebuild_thread(void *arg) /* * Calculate the max number of in-flight bytes for top-level - * vdev scanning operations (minimum 1MB, maximum 1/4 of + * vdev scanning operations (minimum 1MB, maximum 1/2 of * arc_c_max shared by all top-level vdevs). Limits for the * issuing phase are done per top-level vdev and are handled * separately. */ - uint64_t limit = (arc_c_max / 4) / MAX(rvd->vdev_children, 1); + uint64_t limit = (arc_c_max / 2) / MAX(rvd->vdev_children, 1); vr->vr_bytes_inflight_max = MIN(limit, MAX(1ULL << 20, zfs_rebuild_vdev_limit * vd->vdev_children)); diff --git a/sys/contrib/openzfs/module/zfs/zfs_vnops.c b/sys/contrib/openzfs/module/zfs/zfs_vnops.c index a64e1e2dc83d..40d6c87a754e 100644 --- a/sys/contrib/openzfs/module/zfs/zfs_vnops.c +++ b/sys/contrib/openzfs/module/zfs/zfs_vnops.c @@ -1206,6 +1206,19 @@ zfs_clone_range(znode_t *inzp, uint64_t *inoffp, znode_t *outzp, goto unlock; } + /* + * If we are copying only one block and it is smaller than recordsize + * property, do not allow destination to grow beyond one block if it + * is not there yet. Otherwise the destination will get stuck with + * that block size forever, that can be as small as 512 bytes, no + * matter how big the destination grow later. + */ + if (len <= inblksz && inblksz < outzfsvfs->z_max_blksz && + outzp->z_size <= inblksz && outoff + len > inblksz) { + error = SET_ERROR(EINVAL); + goto unlock; + } + error = zn_rlimit_fsize(outoff + len); if (error != 0) { goto unlock; diff --git a/sys/contrib/openzfs/tests/test-runner/bin/zts-report.py.in b/sys/contrib/openzfs/tests/test-runner/bin/zts-report.py.in index e1bbe063ab4c..558e4b57279d 100755 --- a/sys/contrib/openzfs/tests/test-runner/bin/zts-report.py.in +++ b/sys/contrib/openzfs/tests/test-runner/bin/zts-report.py.in @@ -214,6 +214,7 @@ maybe = { 'cli_root/zfs_get/zfs_get_009_pos': ['SKIP', 5479], 'cli_root/zfs_rollback/zfs_rollback_001_pos': ['FAIL', known_reason], 'cli_root/zfs_rollback/zfs_rollback_002_pos': ['FAIL', known_reason], + 'cli_root/zfs_share/zfs_share_concurrent_shares': ['FAIL', known_reason], 'cli_root/zfs_snapshot/zfs_snapshot_002_neg': ['FAIL', known_reason], 'cli_root/zfs_unshare/zfs_unshare_006_pos': ['SKIP', na_reason], 'cli_root/zpool_add/zpool_add_004_pos': ['FAIL', known_reason], @@ -259,10 +260,9 @@ if sys.platform.startswith('freebsd'): maybe.update({ 'cli_root/zfs_copies/zfs_copies_002_pos': ['FAIL', known_reason], 'cli_root/zfs_inherit/zfs_inherit_001_neg': ['FAIL', known_reason], - 'cli_root/zfs_share/zfs_share_concurrent_shares': - ['FAIL', known_reason], 'cli_root/zpool_import/zpool_import_012_pos': ['FAIL', known_reason], 'delegate/zfs_allow_003_pos': ['FAIL', known_reason], + 'delegate/zfs_allow_010_pos': ['FAIL', known_reason], 'inheritance/inherit_001_pos': ['FAIL', 11829], 'resilver/resilver_restart_001': ['FAIL', known_reason], 'pool_checkpoint/checkpoint_big_rewind': ['FAIL', 12622], diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_fallback_same_txg.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_fallback_same_txg.ksh index 74c5a5bece60..2cd2f4763a73 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_fallback_same_txg.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/block_cloning/block_cloning_copyfilerange_fallback_same_txg.ksh @@ -48,10 +48,9 @@ function cleanup log_onexit cleanup -log_must zpool create -o feature@block_cloning=enabled $TESTPOOL $DISKS - log_must set_tunable64 TXG_TIMEOUT 5000 -log_must sync_pool $TESTPOOL true + +log_must zpool create -o feature@block_cloning=enabled $TESTPOOL $DISKS log_must dd if=/dev/urandom of=/$TESTPOOL/file bs=128K count=4 log_must clonefile -f /$TESTPOOL/file /$TESTPOOL/clone 0 0 524288 diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_partial.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_partial.ksh index bdbf3db53336..9342cbe880ae 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_partial.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_partial.ksh @@ -60,7 +60,7 @@ log_must set_tunable64 VDEV_MIN_MS_COUNT 64 # Minimum trim size is decreased to verify all trim sizes. typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN) -log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096 +log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 512 log_must mkdir "$TESTDIR" log_must truncate -s $LARGESIZE "$LARGEFILE" diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_verify_trimmed.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_verify_trimmed.ksh index d5aaf49aebc5..41d1decd13ce 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_verify_trimmed.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/cli_root/zpool_trim/zpool_trim_verify_trimmed.ksh @@ -52,7 +52,7 @@ LARGEFILE="$TESTDIR/largefile" # Reduce trim size to allow for tighter tolerance below when checking. typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN) -log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096 +log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 512 log_must mkdir "$TESTDIR" log_must truncate -s $LARGESIZE "$LARGEFILE" diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/no_space/enospc_rm.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/no_space/enospc_rm.ksh index d0f4ff4a08fe..d9582fbe2a76 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/no_space/enospc_rm.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/no_space/enospc_rm.ksh @@ -17,6 +17,7 @@ # # Copyright (c) 2014, 2016 by Delphix. All rights reserved. # Copyright (c) 2022 by Lawrence Livermore National Security, LLC. +# Copyright (c) 2023 Hewlett Packard Enterprise Development LP. # . $STF_SUITE/include/libtest.shlib @@ -51,12 +52,21 @@ log_must zfs create $TESTPOOL/$TESTFS log_must zfs set mountpoint=$TESTDIR $TESTPOOL/$TESTFS log_must zfs set compression=off $TESTPOOL/$TESTFS -log_note "Writing files until ENOSPC." +log_note "Writing Big(1G) files until ENOSPC." log_mustnot_expect "No space left on device" fio --name=test \ --fallocate=none --rw=write --bs=1M --size=1G --numjobs=4 \ --sync=1 --directory=$TESTDIR/ --group_reporting log_must rm $TESTDIR/test.* log_must test -z "$(ls -A $TESTDIR)" +sync_pool $TESTPOOL true + +log_note "Writing small(10M) files until ENOSPC." +log_mustnot_expect "No space left on device" fio --name=test \ + --fallocate=none --rw=write --bs=1M --size=10M --numjobs=200 \ + --sync=1 --directory=$TESTDIR/ --group_reporting + +log_must rm $TESTDIR/test.* +log_must test -z "$(ls -A $TESTDIR)" log_pass "All files removed without error" diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_config.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_config.ksh index c97772585737..4dba4616e947 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_config.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_config.ksh @@ -57,7 +57,7 @@ log_onexit cleanup # Minimum trim size is decreased to verify all trim sizes. typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN) -log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096 +log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 512 # Reduced TRIM_TXG_BATCH to make trimming more frequent. typeset trim_txg_batch=$(get_tunable TRIM_TXG_BATCH) diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_integrity.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_integrity.ksh index e25390339b6c..e139809105df 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_integrity.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_integrity.ksh @@ -54,7 +54,7 @@ log_onexit cleanup # Minimum trim size is decreased to verify all trim sizes. typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN) -log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096 +log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 512 # Reduced TRIM_TXG_BATCH to make trimming more frequent. typeset trim_txg_batch=$(get_tunable TRIM_TXG_BATCH) diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_trim_integrity.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_trim_integrity.ksh index ae7ad8d73dd8..53de485b1a8e 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_trim_integrity.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/autotrim_trim_integrity.ksh @@ -55,7 +55,7 @@ log_onexit cleanup # Minimum trim size is decreased to verify all trim sizes. typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN) -log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096 +log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 512 # Reduced TRIM_TXG_BATCH to make trimming more frequent. typeset trim_txg_batch=$(get_tunable TRIM_TXG_BATCH) diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_config.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_config.ksh index 6a187a05b579..c08b5edb5698 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_config.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_config.ksh @@ -57,7 +57,7 @@ log_onexit cleanup # Minimum trim size is decreased to verify all trim sizes. typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN) -log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096 +log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 512 # Reduced TRIM_TXG_BATCH to make trimming more frequent. typeset trim_txg_batch=$(get_tunable TRIM_TXG_BATCH) diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_integrity.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_integrity.ksh index 2dff0924f7b1..c67697521ce8 100755 --- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_integrity.ksh +++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/trim/trim_integrity.ksh @@ -54,7 +54,7 @@ log_onexit cleanup # Minimum trim size is decreased to verify all trim sizes. typeset trim_extent_bytes_min=$(get_tunable TRIM_EXTENT_BYTES_MIN) -log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 4096 +log_must set_tunable64 TRIM_EXTENT_BYTES_MIN 512 # Reduced TRIM_TXG_BATCH to make trimming more frequent. typeset trim_txg_batch=$(get_tunable TRIM_TXG_BATCH) diff --git a/sys/modules/zfs/zfs_config.h b/sys/modules/zfs/zfs_config.h index 1accbe621d17..b77a32e4754c 100644 --- a/sys/modules/zfs/zfs_config.h +++ b/sys/modules/zfs/zfs_config.h @@ -1110,7 +1110,7 @@ /* #undef ZFS_IS_GPL_COMPATIBLE */ /* Define the project alias string. */ -#define ZFS_META_ALIAS "zfs-2.2.99-FreeBSD_g2e2a46e0a" +#define ZFS_META_ALIAS "zfs-2.2.99-FreeBSD_ge13538856" /* Define the project author. */ #define ZFS_META_AUTHOR "OpenZFS" @@ -1140,7 +1140,7 @@ #define ZFS_META_NAME "zfs" /* Define the project release. */ -#define ZFS_META_RELEASE "FreeBSD_g2e2a46e0a" +#define ZFS_META_RELEASE "FreeBSD_ge13538856" /* Define the project version. */ #define ZFS_META_VERSION "2.2.99" diff --git a/sys/modules/zfs/zfs_gitrev.h b/sys/modules/zfs/zfs_gitrev.h index d3eeaf9d098c..d3c3225a609c 100644 --- a/sys/modules/zfs/zfs_gitrev.h +++ b/sys/modules/zfs/zfs_gitrev.h @@ -1 +1 @@ -#define ZFS_META_GITREV "zfs-2.2.99-110-g2e2a46e0a" +#define ZFS_META_GITREV "zfs-2.2.99-118-ge13538856" |