Add missing checks for unsupported features

After 35ec517 it has become possible to import ZFS pools witn an
active org.illumos:edonr feature on FreeBSD, leading to a panic.

In addition, "zpool status" reported all pools without edonr
as upgradable and "zpool upgrade -v" reported edonr in the list
of upgradable features.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Martin Matuska <mm@FreeBSD.org>
Closes #11653
This commit is contained in:
Martin Matuška 2021-02-28 02:16:02 +01:00 committed by GitHub
parent 778fa36ee7
commit 03ef8f09e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 9 additions and 0 deletions

View File

@ -9030,6 +9030,8 @@ zpool_do_upgrade(int argc, char **argv)
"---------------\n"); "---------------\n");
for (i = 0; i < SPA_FEATURES; i++) { for (i = 0; i < SPA_FEATURES; i++) {
zfeature_info_t *fi = &spa_feature_table[i]; zfeature_info_t *fi = &spa_feature_table[i];
if (!fi->fi_zfs_mod_supported)
continue;
const char *ro = const char *ro =
(fi->fi_flags & ZFEATURE_FLAG_READONLY_COMPAT) ? (fi->fi_flags & ZFEATURE_FLAG_READONLY_COMPAT) ?
" (read-only compatible)" : ""; " (read-only compatible)" : "";

View File

@ -7592,6 +7592,9 @@ ztest_init(ztest_shared_t *zs)
for (i = 0; i < SPA_FEATURES; i++) { for (i = 0; i < SPA_FEATURES; i++) {
char *buf; char *buf;
if (!spa_feature_table[i].fi_zfs_mod_supported)
continue;
/* /*
* 75% chance of using the log space map feature. We want ztest * 75% chance of using the log space map feature. We want ztest
* to exercise both the code paths that use the log space map * to exercise both the code paths that use the log space map

View File

@ -482,6 +482,8 @@ check_status(nvlist_t *config, boolean_t isimport,
return (ZPOOL_STATUS_COMPATIBILITY_ERR); return (ZPOOL_STATUS_COMPATIBILITY_ERR);
for (i = 0; i < SPA_FEATURES; i++) { for (i = 0; i < SPA_FEATURES; i++) {
zfeature_info_t *fi = &spa_feature_table[i]; zfeature_info_t *fi = &spa_feature_table[i];
if (!fi->fi_zfs_mod_supported)
continue;
if (pool_features[i] && if (pool_features[i] &&
!nvlist_exists(feat, fi->fi_guid)) !nvlist_exists(feat, fi->fi_guid))
return (ZPOOL_STATUS_FEAT_DISABLED); return (ZPOOL_STATUS_FEAT_DISABLED);

View File

@ -100,6 +100,8 @@ zfeature_is_supported(const char *guid)
for (spa_feature_t i = 0; i < SPA_FEATURES; i++) { for (spa_feature_t i = 0; i < SPA_FEATURES; i++) {
zfeature_info_t *feature = &spa_feature_table[i]; zfeature_info_t *feature = &spa_feature_table[i];
if (!feature->fi_zfs_mod_supported)
continue;
if (strcmp(guid, feature->fi_guid) == 0) if (strcmp(guid, feature->fi_guid) == 0)
return (B_TRUE); return (B_TRUE);
} }