summaryrefslogtreecommitdiffstats
path: root/cmd/zpool
diff options
context:
space:
mode:
authorloli10K <[email protected]>2020-01-07 00:40:06 +0100
committerBrian Behlendorf <[email protected]>2020-01-06 15:40:06 -0800
commitc24fa4b19a1b117945f3235e014f926fe93b0c5a (patch)
tree37178dc7c410829ef81f1f2c61c7df44d6d41710 /cmd/zpool
parentbc9cef11fddfe8e6e240477084a49f4bad1fb4f3 (diff)
Fix "zpool add -n" for dedup, special and log devices
For dedup, special and log devices "zpool add -n" does not print correctly their vdev type: ~# zpool add -n pool dedup /tmp/dedup special /tmp/special log /tmp/log would update 'pool' to the following configuration: pool /tmp/normal /tmp/dedup /tmp/special /tmp/log This could lead storage administrators to modify their ZFS pools to unexpected and unintended vdev configurations. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: loli10K <[email protected]> Closes #9783 Closes #9390
Diffstat (limited to 'cmd/zpool')
-rw-r--r--cmd/zpool/zpool_main.c43
1 files changed, 29 insertions, 14 deletions
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
index f7696caac..77c826ba8 100644
--- a/cmd/zpool/zpool_main.c
+++ b/cmd/zpool/zpool_main.c
@@ -936,20 +936,35 @@ zpool_do_add(int argc, char **argv)
print_vdev_tree(zhp, NULL, nvroot, 0, "", name_flags);
/* print other classes: 'dedup', 'special', and 'log' */
- print_vdev_tree(zhp, "dedup", poolnvroot, 0,
- VDEV_ALLOC_BIAS_DEDUP, name_flags);
- print_vdev_tree(zhp, NULL, nvroot, 0, VDEV_ALLOC_BIAS_DEDUP,
- name_flags);
-
- print_vdev_tree(zhp, "special", poolnvroot, 0,
- VDEV_ALLOC_BIAS_SPECIAL, name_flags);
- print_vdev_tree(zhp, NULL, nvroot, 0, VDEV_ALLOC_BIAS_SPECIAL,
- name_flags);
-
- print_vdev_tree(zhp, "logs", poolnvroot, 0, VDEV_ALLOC_BIAS_LOG,
- name_flags);
- print_vdev_tree(zhp, NULL, nvroot, 0, VDEV_ALLOC_BIAS_LOG,
- name_flags);
+ if (zfs_special_devs(poolnvroot, VDEV_ALLOC_BIAS_DEDUP)) {
+ print_vdev_tree(zhp, "dedup", poolnvroot, 0,
+ VDEV_ALLOC_BIAS_DEDUP, name_flags);
+ print_vdev_tree(zhp, NULL, nvroot, 0,
+ VDEV_ALLOC_BIAS_DEDUP, name_flags);
+ } else if (zfs_special_devs(nvroot, VDEV_ALLOC_BIAS_DEDUP)) {
+ print_vdev_tree(zhp, "dedup", nvroot, 0,
+ VDEV_ALLOC_BIAS_DEDUP, name_flags);
+ }
+
+ if (zfs_special_devs(poolnvroot, VDEV_ALLOC_BIAS_SPECIAL)) {
+ print_vdev_tree(zhp, "special", poolnvroot, 0,
+ VDEV_ALLOC_BIAS_SPECIAL, name_flags);
+ print_vdev_tree(zhp, NULL, nvroot, 0,
+ VDEV_ALLOC_BIAS_SPECIAL, name_flags);
+ } else if (zfs_special_devs(nvroot, VDEV_ALLOC_BIAS_SPECIAL)) {
+ print_vdev_tree(zhp, "special", nvroot, 0,
+ VDEV_ALLOC_BIAS_SPECIAL, name_flags);
+ }
+
+ if (num_logs(poolnvroot) > 0) {
+ print_vdev_tree(zhp, "logs", poolnvroot, 0,
+ VDEV_ALLOC_BIAS_LOG, name_flags);
+ print_vdev_tree(zhp, NULL, nvroot, 0,
+ VDEV_ALLOC_BIAS_LOG, name_flags);
+ } else if (num_logs(nvroot) > 0) {
+ print_vdev_tree(zhp, "logs", nvroot, 0,
+ VDEV_ALLOC_BIAS_LOG, name_flags);
+ }
/* Do the same for the caches */
if (nvlist_lookup_nvlist_array(poolnvroot, ZPOOL_CONFIG_L2CACHE,