diff options
-rw-r--r-- | module/zfs/metaslab.c | 8 | ||||
-rw-r--r-- | module/zfs/vdev.c | 12 |
2 files changed, 19 insertions, 1 deletions
diff --git a/module/zfs/metaslab.c b/module/zfs/metaslab.c index 3ada403a8..3fd7f9049 100644 --- a/module/zfs/metaslab.c +++ b/module/zfs/metaslab.c @@ -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); diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c index c9bff69e2..e741a6998 100644 --- a/module/zfs/vdev.c +++ b/module/zfs/vdev.c @@ -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) { |