mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-01-25 10:12:13 +03:00
Add no-upgrade featureflag
Adds a featureflag that is not enabled during upgrades unless listed explicitly. This is useful for features that could cause issues unless applied carefully; for example, a feature that could make a root pool unbootable if bootloaders don't yet have support for it. Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Rob Norris <rob.norris@klarasystems.com> Reviewed-by: Allan Jude <allan@klarasystems.com> Signed-off-by: Paul Dagnelie <paul.dagnelie@klarasystems.com> Closes #17004
This commit is contained in:
parent
4c2a7f85d5
commit
e845be28e7
@ -11330,7 +11330,8 @@ upgrade_enable_all(zpool_handle_t *zhp, int *countp)
|
|||||||
const char *fname = spa_feature_table[i].fi_uname;
|
const char *fname = spa_feature_table[i].fi_uname;
|
||||||
const char *fguid = spa_feature_table[i].fi_guid;
|
const char *fguid = spa_feature_table[i].fi_guid;
|
||||||
|
|
||||||
if (!spa_feature_table[i].fi_zfs_mod_supported)
|
if (!spa_feature_table[i].fi_zfs_mod_supported ||
|
||||||
|
(spa_feature_table[i].fi_flags & ZFEATURE_FLAG_NO_UPGRADE))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!nvlist_exists(enabled, fguid) && requested_features[i]) {
|
if (!nvlist_exists(enabled, fguid) && requested_features[i]) {
|
||||||
@ -11485,7 +11486,11 @@ upgrade_list_disabled_cb(zpool_handle_t *zhp, void *arg)
|
|||||||
"Note that the pool "
|
"Note that the pool "
|
||||||
"'compatibility' feature can be "
|
"'compatibility' feature can be "
|
||||||
"used to inhibit\nfeature "
|
"used to inhibit\nfeature "
|
||||||
"upgrades.\n\n"));
|
"upgrades.\n\n"
|
||||||
|
"Features marked with (*) are not "
|
||||||
|
"applied automatically on upgrade, "
|
||||||
|
"and\nmust be applied explicitly "
|
||||||
|
"with zpool-set(7).\n\n"));
|
||||||
(void) printf(gettext("POOL "
|
(void) printf(gettext("POOL "
|
||||||
"FEATURE\n"));
|
"FEATURE\n"));
|
||||||
(void) printf(gettext("------"
|
(void) printf(gettext("------"
|
||||||
@ -11499,7 +11504,9 @@ upgrade_list_disabled_cb(zpool_handle_t *zhp, void *arg)
|
|||||||
poolfirst = B_FALSE;
|
poolfirst = B_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) printf(gettext(" %s\n"), fname);
|
(void) printf(gettext(" %s%s\n"), fname,
|
||||||
|
spa_feature_table[i].fi_flags &
|
||||||
|
ZFEATURE_FLAG_NO_UPGRADE ? "(*)" : "");
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* If they did "zpool upgrade -a", then we could
|
* If they did "zpool upgrade -a", then we could
|
||||||
|
|||||||
@ -103,7 +103,15 @@ typedef enum zfeature_flags {
|
|||||||
/* Activate this feature at the same time it is enabled. */
|
/* Activate this feature at the same time it is enabled. */
|
||||||
ZFEATURE_FLAG_ACTIVATE_ON_ENABLE = (1 << 2),
|
ZFEATURE_FLAG_ACTIVATE_ON_ENABLE = (1 << 2),
|
||||||
/* Each dataset has a field set if it has ever used this feature. */
|
/* Each dataset has a field set if it has ever used this feature. */
|
||||||
ZFEATURE_FLAG_PER_DATASET = (1 << 3)
|
ZFEATURE_FLAG_PER_DATASET = (1 << 3),
|
||||||
|
/*
|
||||||
|
* This feature isn't enabled by zpool upgrade; it must be explicitly
|
||||||
|
* listed to be enabled. It will also be applied if listed in an
|
||||||
|
* explicitly provided compatibility list. This flag can be removed
|
||||||
|
* from a given feature once support is sufficiently widespread, or
|
||||||
|
* worries about backwards compatibility are no longer relevant.
|
||||||
|
*/
|
||||||
|
ZFEATURE_FLAG_NO_UPGRADE = (1 << 4)
|
||||||
} zfeature_flags_t;
|
} zfeature_flags_t;
|
||||||
|
|
||||||
typedef enum zfeature_type {
|
typedef enum zfeature_type {
|
||||||
|
|||||||
@ -5093,9 +5093,10 @@ zpool_load_compat(const char *compat, boolean_t *features, char *report,
|
|||||||
/* special cases (unset), "" and "off" => enable all features */
|
/* special cases (unset), "" and "off" => enable all features */
|
||||||
if (compat == NULL || compat[0] == '\0' ||
|
if (compat == NULL || compat[0] == '\0' ||
|
||||||
strcmp(compat, ZPOOL_COMPAT_OFF) == 0) {
|
strcmp(compat, ZPOOL_COMPAT_OFF) == 0) {
|
||||||
if (features != NULL)
|
if (features != NULL) {
|
||||||
for (uint_t i = 0; i < SPA_FEATURES; i++)
|
for (uint_t i = 0; i < SPA_FEATURES; i++)
|
||||||
features[i] = B_TRUE;
|
features[i] = B_TRUE;
|
||||||
|
}
|
||||||
if (report != NULL)
|
if (report != NULL)
|
||||||
strlcpy(report, gettext("all features enabled"), rlen);
|
strlcpy(report, gettext("all features enabled"), rlen);
|
||||||
return (ZPOOL_COMPATIBILITY_OK);
|
return (ZPOOL_COMPATIBILITY_OK);
|
||||||
|
|||||||
@ -484,7 +484,8 @@ check_status(nvlist_t *config, boolean_t isimport,
|
|||||||
}
|
}
|
||||||
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)
|
if (!fi->fi_zfs_mod_supported ||
|
||||||
|
(fi->fi_flags & ZFEATURE_FLAG_NO_UPGRADE))
|
||||||
continue;
|
continue;
|
||||||
if (c_features[i] && !nvlist_exists(feat, fi->fi_guid))
|
if (c_features[i] && !nvlist_exists(feat, fi->fi_guid))
|
||||||
return (ZPOOL_STATUS_FEAT_DISABLED);
|
return (ZPOOL_STATUS_FEAT_DISABLED);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user