From 03b7cfdef38aed0966fb69510b1ce1a4bc3f2bde Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Thu, 19 Dec 2024 20:11:54 +1100 Subject: [PATCH] spa_sync_props: remove pool userprops by setting empty-string People have noted there's no way to remove a pool userprop, only zero it. Turns vdev userprops had a method, by setting empty-string. So this makes pool userprops follow the same behaviour. Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. Reviewed-by: Brian Behlendorf Reviewed-by: Alexander Motin Signed-off-by: Rob Norris Closes #16887 --- module/zfs/spa.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/module/zfs/spa.c b/module/zfs/spa.c index b83c982c1..c93c7945f 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -9683,9 +9683,17 @@ spa_sync_props(void *arg, dmu_tx_t *tx) if (nvpair_type(elem) == DATA_TYPE_STRING) { ASSERT(proptype == PROP_TYPE_STRING); strval = fnvpair_value_string(elem); - VERIFY0(zap_update(mos, - spa->spa_pool_props_object, propname, - 1, strlen(strval) + 1, strval, tx)); + if (strlen(strval) == 0) { + /* remove the property if value == "" */ + (void) zap_remove(mos, + spa->spa_pool_props_object, + propname, tx); + } else { + VERIFY0(zap_update(mos, + spa->spa_pool_props_object, + propname, 1, strlen(strval) + 1, + strval, tx)); + } spa_history_log_internal(spa, "set", tx, "%s=%s", elemname, strval); } else if (nvpair_type(elem) == DATA_TYPE_UINT64) {