diff --git a/module/zfs/dsl_dir.c b/module/zfs/dsl_dir.c index bbe6a03d620f..01ba8f04e858 100644 --- a/module/zfs/dsl_dir.c +++ b/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 . All rights reserved. + * Copyright (c) 2023 Hewlett Packard Enterprise Development LP. */ #include @@ -1358,6 +1359,10 @@ dsl_dir_tempreserve_impl(dsl_dir_t *dd, uint64_t asize, boolean_t netfree, 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); diff --git a/tests/zfs-tests/tests/functional/no_space/enospc_rm.ksh b/tests/zfs-tests/tests/functional/no_space/enospc_rm.ksh index d0f4ff4a08fe..2a12b76075a0 100755 --- a/tests/zfs-tests/tests/functional/no_space/enospc_rm.ksh +++ b/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,11 +52,20 @@ 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)" +log_must sleep 30 + +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)"