]> granicus.if.org Git - zfs/commitdiff
OpenZFS 7072 - zfs fails to expand if lun added when os is in shutdown state
authorGeorge Melikov <mail@gmelikov.ru>
Wed, 1 Feb 2017 21:14:02 +0000 (00:14 +0300)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 1 Feb 2017 21:14:02 +0000 (13:14 -0800)
Authored by: George Wilson <george.wilson@delphix.com>
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Alex Reece <alex@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Ported-by: George Melikov <mail@gmelikov.ru>
OpenZFS-issue: https://www.illumos.org/issues/7072
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/c39a2aa
Closes #5694

Porting notes:
- vdev.c: 'vdev_get_stats' changes are moved to 'vdev_get_stats_ex'.
- vdev_disk.c: ignored, Linux specific code is different.

module/zfs/metaslab.c
module/zfs/vdev.c

index 3ada403a8a520d68edb7d3ab901af9258e572c38..3fd7f9049c8b5ea2bacb25981cf4fc5050c9a632 100644 (file)
@@ -413,7 +413,13 @@ metaslab_class_expandable_space(metaslab_class_t *mc)
                        continue;
                }
 
-               space += tvd->vdev_max_asize - tvd->vdev_asize;
+               /*
+                * Calculate if we have enough space to add additional
+                * metaslabs. We report the expandable space in terms
+                * of the metaslab size since that's the unit of expansion.
+                */
+               space += P2ALIGN(tvd->vdev_max_asize - tvd->vdev_asize,
+                   1ULL << tvd->vdev_ms_shift);
        }
        spa_config_exit(mc->mc_spa, SCL_VDEV, FTAG);
        return (space);
index c9bff69e29d35544194d23bb44fea31a7e5b3f5d..e741a699870a1211202bf60a8dd4ef1234c0dc06 100644 (file)
@@ -2900,6 +2900,7 @@ vdev_get_stats_ex_impl(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx)
 void
 vdev_get_stats_ex(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx)
 {
+       vdev_t *tvd = vd->vdev_top;
        mutex_enter(&vd->vdev_stat_lock);
        if (vs) {
                bcopy(&vd->vdev_stat, vs, sizeof (*vs));
@@ -2909,6 +2910,17 @@ vdev_get_stats_ex(vdev_t *vd, vdev_stat_t *vs, vdev_stat_ex_t *vsx)
                if (vd->vdev_ops->vdev_op_leaf)
                        vs->vs_rsize += VDEV_LABEL_START_SIZE +
                            VDEV_LABEL_END_SIZE;
+               /*
+                * Report expandable space on top-level, non-auxillary devices
+                * only. The expandable space is reported in terms of metaslab
+                * sized units since that determines how much space the pool
+                * can expand.
+                */
+               if (vd->vdev_aux == NULL && tvd != NULL) {
+                       vs->vs_esize = P2ALIGN(
+                           vd->vdev_max_asize - vd->vdev_asize,
+                           1ULL << tvd->vdev_ms_shift);
+               }
                vs->vs_esize = vd->vdev_max_asize - vd->vdev_asize;
                if (vd->vdev_aux == NULL && vd == vd->vdev_top &&
                    !vd->vdev_ishole) {