diff --git a/include/sys/fs/zfs.h b/include/sys/fs/zfs.h index 0ee9b00bd98d..76e61eb07620 100644 --- a/include/sys/fs/zfs.h +++ b/include/sys/fs/zfs.h @@ -320,6 +320,7 @@ const char *zpool_prop_to_name(zpool_prop_t); const char *zpool_prop_default_string(zpool_prop_t); uint64_t zpool_prop_default_numeric(zpool_prop_t); boolean_t zpool_prop_readonly(zpool_prop_t); +boolean_t zpool_prop_setonce(zpool_prop_t); boolean_t zpool_prop_feature(const char *); boolean_t zpool_prop_unsupported(const char *); int zpool_prop_index_to_string(zpool_prop_t, uint64_t, const char **); diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c index e8c0cdfe4e38..8f2eedec8003 100644 --- a/lib/libzfs/libzfs_pool.c +++ b/lib/libzfs/libzfs_pool.c @@ -549,6 +549,14 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, goto error; } + if (!flags.create && zpool_prop_setonce(prop)) { + zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, + "property '%s' can only be set at " + "creation time"), propname); + (void) zfs_error(hdl, EZFS_BADPROP, errbuf); + goto error; + } + if (zprop_parse_value(hdl, elem, prop, ZFS_TYPE_POOL, retprops, &strval, &intval, errbuf) != 0) goto error; @@ -704,15 +712,6 @@ zpool_valid_proplist(libzfs_handle_t *hdl, const char *poolname, goto error; } break; - case ZPOOL_PROP_TNAME: - if (!flags.create) { - zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, - "property '%s' can only be set at " - "creation time"), propname); - (void) zfs_error(hdl, EZFS_BADPROP, errbuf); - goto error; - } - break; case ZPOOL_PROP_MULTIHOST: if (get_system_hostid() == 0) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, diff --git a/module/zcommon/zpool_prop.c b/module/zcommon/zpool_prop.c index dc0bb59bc8da..263d043cc615 100644 --- a/module/zcommon/zpool_prop.c +++ b/module/zcommon/zpool_prop.c @@ -171,6 +171,12 @@ zpool_prop_readonly(zpool_prop_t prop) return (zpool_prop_table[prop].pd_attr == PROP_READONLY); } +boolean_t +zpool_prop_setonce(zpool_prop_t prop) +{ + return (zpool_prop_table[prop].pd_attr == PROP_ONETIME); +} + const char * zpool_prop_default_string(zpool_prop_t prop) {