svn commit: r307267 - stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Alexander Motin
mav at FreeBSD.org
Fri Oct 14 07:16:13 UTC 2016
Author: mav
Date: Fri Oct 14 07:16:11 2016
New Revision: 307267
URL: https://svnweb.freebsd.org/changeset/base/307267
Log:
MFC r305324: MFV r303077:
7072 zfs fails to expand if lun added when os is in shutdown state
illumos/illumos-gate at c39a2aae1e2c439d156021edfc20910dad7f9891
https://github.com/illumos/illumos-gate/commit/c39a2aae1e2c439d156021edfc20910dad7f9891
https://www.illumos.org/issues/7072
upstream:
38733 zfs fails to expand if lun added when os is in shutdown state
DLPX-36910 spares and caches should not display expandable space
DLPX-39262 vdev_disk_open spam zfs_dbgmsg buffer
Reviewed by: Igor Kozhukhov <ikozhukhov at gmail.com>
Reviewed by: Dan Kimmel <dan.kimmel at delphix.com>
Reviewed by: Matthew Ahrens <mahrens at delphix.com>
Reviewed by: Prakash Surya <prakash.surya at delphix.com>
Reviewed by: Alex Reece <alex at delphix.com>
Approved by: Dan McDonald <danmcd at omniti.com>
Author: George Wilson <george.wilson at delphix.com>
Modified:
stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c Fri Oct 14 07:14:35 2016 (r307266)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c Fri Oct 14 07:16:11 2016 (r307267)
@@ -468,7 +468,13 @@ metaslab_class_expandable_space(metaslab
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);
Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c Fri Oct 14 07:14:35 2016 (r307266)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c Fri Oct 14 07:16:11 2016 (r307267)
@@ -2885,6 +2885,7 @@ vdev_get_stats(vdev_t *vd, vdev_stat_t *
{
spa_t *spa = vd->vdev_spa;
vdev_t *rvd = spa->spa_root_vdev;
+ vdev_t *tvd = vd->vdev_top;
ASSERT(spa_config_held(spa, SCL_ALL, RW_READER) != 0);
@@ -2895,8 +2896,15 @@ vdev_get_stats(vdev_t *vd, vdev_stat_t *
vs->vs_rsize = vdev_get_min_asize(vd);
if (vd->vdev_ops->vdev_op_leaf)
vs->vs_rsize += VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE;
- if (vd->vdev_max_asize != 0)
- vs->vs_esize = vd->vdev_max_asize - vd->vdev_asize;
+ /*
+ * 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 && vd->vdev_max_asize != 0) {
+ vs->vs_esize = P2ALIGN(vd->vdev_max_asize - vd->vdev_asize,
+ 1ULL << tvd->vdev_ms_shift);
+ }
vs->vs_configured_ashift = vd->vdev_top != NULL
? vd->vdev_top->vdev_ashift : vd->vdev_ashift;
vs->vs_logical_ashift = vd->vdev_logical_ashift;
Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c Fri Oct 14 07:14:35 2016 (r307266)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c Fri Oct 14 07:16:11 2016 (r307267)
@@ -241,34 +241,6 @@ vdev_disk_rele(vdev_t *vd)
}
}
-static uint64_t
-vdev_disk_get_space(vdev_t *vd, uint64_t capacity, uint_t blksz)
-{
- ASSERT(vd->vdev_wholedisk);
-
- vdev_disk_t *dvd = vd->vdev_tsd;
- dk_efi_t dk_ioc;
- efi_gpt_t *efi;
- uint64_t avail_space = 0;
- int efisize = EFI_LABEL_SIZE * 2;
-
- dk_ioc.dki_data = kmem_alloc(efisize, KM_SLEEP);
- dk_ioc.dki_lba = 1;
- dk_ioc.dki_length = efisize;
- dk_ioc.dki_data_64 = (uint64_t)(uintptr_t)dk_ioc.dki_data;
- efi = dk_ioc.dki_data;
-
- if (ldi_ioctl(dvd->vd_lh, DKIOCGETEFI, (intptr_t)&dk_ioc,
- FKIOCTL, kcred, NULL) == 0) {
- uint64_t efi_altern_lba = LE_64(efi->efi_gpt_AlternateLBA);
-
- if (capacity > efi_altern_lba)
- avail_space = (capacity - efi_altern_lba) * blksz;
- }
- kmem_free(dk_ioc.dki_data, efisize);
- return (avail_space);
-}
-
/*
* We want to be loud in DEBUG kernels when DKIOCGMEDIAINFOEXT fails, or when
* even a fallback to DKIOCGMEDIAINFO fails.
@@ -559,10 +531,7 @@ skip_open:
* Adjust max_psize upward accordingly since we know
* we own the whole disk now.
*/
- *max_psize += vdev_disk_get_space(vd, capacity, blksz);
- zfs_dbgmsg("capacity change: vdev %s, psize %llu, "
- "max_psize %llu", vd->vdev_path, *psize,
- *max_psize);
+ *max_psize = capacity * blksz;
}
/*
More information about the svn-src-all
mailing list