mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Illumos #2762: zpool command should have better support for feature flags
2762 zpool command should have better support for feature flags Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Approved by: Eric Schrock <Eric.Schrock@delphix.com> References: illumos/illumos-gate@57221772c3 https://www.illumos.org/issues/2762 Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
committed by
Brian Behlendorf
parent
3bc7e0fb0f
commit
b9b24bb4ca
+13
-8
@@ -2209,7 +2209,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config,
|
||||
|
||||
if (spa_version(spa) >= SPA_VERSION_FEATURES) {
|
||||
boolean_t missing_feat_read = B_FALSE;
|
||||
nvlist_t *unsup_feat;
|
||||
nvlist_t *unsup_feat, *enabled_feat;
|
||||
|
||||
if (spa_dir_prop(spa, DMU_POOL_FEATURES_FOR_READ,
|
||||
&spa->spa_feat_for_read_obj) != 0) {
|
||||
@@ -2226,27 +2226,32 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config,
|
||||
return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO));
|
||||
}
|
||||
|
||||
VERIFY(nvlist_alloc(&unsup_feat, NV_UNIQUE_NAME, KM_SLEEP) ==
|
||||
0);
|
||||
enabled_feat = fnvlist_alloc();
|
||||
unsup_feat = fnvlist_alloc();
|
||||
|
||||
if (!feature_is_supported(spa->spa_meta_objset,
|
||||
spa->spa_feat_for_read_obj, spa->spa_feat_desc_obj,
|
||||
unsup_feat))
|
||||
unsup_feat, enabled_feat))
|
||||
missing_feat_read = B_TRUE;
|
||||
|
||||
if (spa_writeable(spa) || state == SPA_LOAD_TRYIMPORT) {
|
||||
if (!feature_is_supported(spa->spa_meta_objset,
|
||||
spa->spa_feat_for_write_obj, spa->spa_feat_desc_obj,
|
||||
unsup_feat))
|
||||
unsup_feat, enabled_feat)) {
|
||||
missing_feat_write = B_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
fnvlist_add_nvlist(spa->spa_load_info,
|
||||
ZPOOL_CONFIG_ENABLED_FEAT, enabled_feat);
|
||||
|
||||
if (!nvlist_empty(unsup_feat)) {
|
||||
VERIFY(nvlist_add_nvlist(spa->spa_load_info,
|
||||
ZPOOL_CONFIG_UNSUP_FEAT, unsup_feat) == 0);
|
||||
fnvlist_add_nvlist(spa->spa_load_info,
|
||||
ZPOOL_CONFIG_UNSUP_FEAT, unsup_feat);
|
||||
}
|
||||
|
||||
nvlist_free(unsup_feat);
|
||||
fnvlist_free(enabled_feat);
|
||||
fnvlist_free(unsup_feat);
|
||||
|
||||
if (!missing_feat_read) {
|
||||
fnvlist_add_boolean(spa->spa_load_info,
|
||||
|
||||
@@ -173,7 +173,7 @@ typedef enum {
|
||||
*/
|
||||
boolean_t
|
||||
feature_is_supported(objset_t *os, uint64_t obj, uint64_t desc_obj,
|
||||
nvlist_t *unsup_feat)
|
||||
nvlist_t *unsup_feat, nvlist_t *enabled_feat)
|
||||
{
|
||||
boolean_t supported;
|
||||
zap_cursor_t *zc;
|
||||
@@ -191,11 +191,16 @@ feature_is_supported(objset_t *os, uint64_t obj, uint64_t desc_obj,
|
||||
ASSERT(za->za_integer_length == sizeof (uint64_t) &&
|
||||
za->za_num_integers == 1);
|
||||
|
||||
if (NULL != enabled_feat) {
|
||||
fnvlist_add_uint64(enabled_feat, za->za_name,
|
||||
za->za_first_integer);
|
||||
}
|
||||
|
||||
if (za->za_first_integer != 0 &&
|
||||
!zfeature_is_supported(za->za_name)) {
|
||||
supported = B_FALSE;
|
||||
|
||||
if (unsup_feat != NULL) {
|
||||
if (NULL != unsup_feat) {
|
||||
char *desc = "";
|
||||
|
||||
if (zap_lookup(os, desc_obj, za->za_name,
|
||||
|
||||
Reference in New Issue
Block a user