summaryrefslogtreecommitdiffstats
path: root/module/zcommon/zfs_comutil.c
diff options
context:
space:
mode:
authorloli10K <[email protected]>2019-10-11 01:39:41 +0200
committerBrian Behlendorf <[email protected]>2019-10-10 16:39:41 -0700
commit715c996d3b5e45897ff165f2e6610e1b57da47e4 (patch)
tree4c600a53be1551d992a0ea222cb60e93f28234f3 /module/zcommon/zfs_comutil.c
parent2516a8782158a1d420aa00ce5f470a33cc7ec2ca (diff)
Fix pool creation with feature@allocation_classes disabled
When "feature@allocation_classes" is not enabled on the pool no vdev with "special" or "dedup" allocation type should be allowed to exist in the vdev tree. Reviewed-by: Pavel Zakharov <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: loli10K <[email protected]> Closes #9427 Closes #9429
Diffstat (limited to 'module/zcommon/zfs_comutil.c')
-rw-r--r--module/zcommon/zfs_comutil.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/module/zcommon/zfs_comutil.c b/module/zcommon/zfs_comutil.c
index 5daa6907c..a3ff7d8e6 100644
--- a/module/zcommon/zfs_comutil.c
+++ b/module/zcommon/zfs_comutil.c
@@ -64,6 +64,33 @@ zfs_allocatable_devs(nvlist_t *nv)
return (B_FALSE);
}
+/*
+ * Are there special vdevs?
+ */
+boolean_t
+zfs_special_devs(nvlist_t *nv)
+{
+ char *bias;
+ uint_t c;
+ nvlist_t **child;
+ uint_t children;
+
+ if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
+ &child, &children) != 0) {
+ return (B_FALSE);
+ }
+ for (c = 0; c < children; c++) {
+ if (nvlist_lookup_string(child[c], ZPOOL_CONFIG_ALLOCATION_BIAS,
+ &bias) == 0) {
+ if (strcmp(bias, VDEV_ALLOC_BIAS_SPECIAL) == 0 ||
+ strcmp(bias, VDEV_ALLOC_BIAS_DEDUP) == 0) {
+ return (B_TRUE);
+ }
+ }
+ }
+ return (B_FALSE);
+}
+
void
zpool_get_load_policy(nvlist_t *nvl, zpool_load_policy_t *zlpp)
{
@@ -223,6 +250,7 @@ zfs_dataset_name_hidden(const char *name)
#if defined(_KERNEL)
EXPORT_SYMBOL(zfs_allocatable_devs);
+EXPORT_SYMBOL(zfs_special_devs);
EXPORT_SYMBOL(zpool_get_load_policy);
EXPORT_SYMBOL(zfs_zpl_version_map);
EXPORT_SYMBOL(zfs_spa_version_map);