From 8af08a69cda63e6d7983fc2f32f9fed4155b95be Mon Sep 17 00:00:00 2001 From: Mariusz Zaborski Date: Fri, 28 Oct 2022 20:44:18 +0200 Subject: [PATCH] quota: extend quota for dataset This patch relax the quota limitation for dataset by around 3%. What this means is that user can write more data then the quota is set to. However thanks to that we can get more stable bandwidth, in case when we are overwriting data in-place, and not consuming any additional space. Reviewed-by: Brian Behlendorf Signed-off-by: Allan Jude Signed-off-by: Mariusz Zaborski Sponsored-by: Zededa Inc. Sponsored-by: Klara Inc. Closes #13839 --- module/zfs/dsl_dir.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/module/zfs/dsl_dir.c b/module/zfs/dsl_dir.c index d93c7f08c..15af67ba8 100644 --- a/module/zfs/dsl_dir.c +++ b/module/zfs/dsl_dir.c @@ -1268,6 +1268,7 @@ dsl_dir_tempreserve_impl(dsl_dir_t *dd, uint64_t asize, boolean_t netfree, uint64_t quota; struct tempreserve *tr; int retval; + uint64_t ext_quota; uint64_t ref_rsrv; top_of_function: @@ -1343,7 +1344,16 @@ top_of_function: * on-disk is over quota and there are no pending changes * or deferred frees (which may free up space for us). */ - if (used_on_disk + est_inflight >= quota) { + ext_quota = quota >> 5; + if (quota == UINT64_MAX) + ext_quota = 0; + + if (used_on_disk >= quota) { + /* 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 {