]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Storage device expansion "silently" fails on degraded vdev
authorPaul Dagnelie <paul.dagnelie@delphix.com>
Thu, 6 Apr 2023 17:29:27 +0000 (10:29 -0700)
committerGitHub <noreply@github.com>
Thu, 6 Apr 2023 17:29:27 +0000 (10:29 -0700)
When a vdev is degraded or faulted, we refuse to expand it when doing
online -e. However, we also don't actually cause the online command
to fail, even though the disk didn't expand. This is confusing and
misleading, and can result in violated expectations.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Mark Maybee <mark.maybee@delphix.com>
Signed-off-by: Paul Dagnelie <pcd@delphix.com>
Closes 14145

cmd/zpool/zpool_main.c

index d79c1608b09f0e349aad647331d0e44b9c1c14a8..9475beaa2368f36299d5cda09104981fd95fd663 100644 (file)
@@ -6936,6 +6936,17 @@ zpool_do_online(int argc, char **argv)
                return (1);
 
        for (i = 1; i < argc; i++) {
+               vdev_state_t oldstate;
+               boolean_t avail_spare, l2cache;
+               nvlist_t *tgt = zpool_find_vdev(zhp, argv[i], &avail_spare,
+                   &l2cache, NULL);
+               if (tgt == NULL) {
+                       ret = 1;
+                       continue;
+               }
+               uint_t vsc;
+               oldstate = ((vdev_stat_t *)fnvlist_lookup_uint64_array(tgt,
+                   ZPOOL_CONFIG_VDEV_STATS, &vsc))->vs_state;
                if (zpool_vdev_online(zhp, argv[i], flags, &newstate) == 0) {
                        if (newstate != VDEV_STATE_HEALTHY) {
                                (void) printf(gettext("warning: device '%s' "
@@ -6949,6 +6960,17 @@ zpool_do_online(int argc, char **argv)
                                        (void) printf(gettext("use 'zpool "
                                            "replace' to replace devices "
                                            "that are no longer present\n"));
+                               if ((flags & ZFS_ONLINE_EXPAND)) {
+                                       (void) printf(gettext("%s: failed "
+                                           "to expand usable space on "
+                                           "unhealthy device '%s'\n"),
+                                           (oldstate >= VDEV_STATE_DEGRADED ?
+                                           "error" : "warning"), argv[i]);
+                                       if (oldstate >= VDEV_STATE_DEGRADED) {
+                                               ret = 1;
+                                               break;
+                                       }
+                               }
                        }
                } else {
                        ret = 1;