mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Improve handling of filesystem versions
Change mount code to diagnose filesystem versions that are not supported by the current implementation. Change upgrade code to do likewise and refuse to upgrade a pool if any filesystems on it are a version which is not supported by the current implementation. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Dan Swartzendruber <dswartz@druber.com> Closes: #2616
This commit is contained in:
committed by
Brian Behlendorf
parent
bcd9624d0f
commit
287be44f53
@@ -4601,12 +4601,33 @@ typedef struct upgrade_cbdata {
|
||||
char **cb_argv;
|
||||
} upgrade_cbdata_t;
|
||||
|
||||
static int
|
||||
check_unsupp_fs(zfs_handle_t *zhp, void *unsupp_fs)
|
||||
{
|
||||
int zfs_version = (int) zfs_prop_get_int(zhp, ZFS_PROP_VERSION);
|
||||
int *count = (int *)unsupp_fs;
|
||||
|
||||
if (zfs_version > ZPL_VERSION) {
|
||||
(void) printf(gettext("%s (v%d) is not supported by this "
|
||||
"implementation of ZFS.\n"),
|
||||
zfs_get_name(zhp), zfs_version);
|
||||
(*count)++;
|
||||
}
|
||||
|
||||
zfs_iter_filesystems(zhp, check_unsupp_fs, unsupp_fs);
|
||||
|
||||
zfs_close(zhp);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
upgrade_version(zpool_handle_t *zhp, uint64_t version)
|
||||
{
|
||||
int ret;
|
||||
nvlist_t *config;
|
||||
uint64_t oldversion;
|
||||
int unsupp_fs = 0;
|
||||
|
||||
config = zpool_get_config(zhp, NULL);
|
||||
verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
|
||||
@@ -4615,6 +4636,17 @@ upgrade_version(zpool_handle_t *zhp, uint64_t version)
|
||||
assert(SPA_VERSION_IS_SUPPORTED(oldversion));
|
||||
assert(oldversion < version);
|
||||
|
||||
ret = zfs_iter_root(zpool_get_handle(zhp), check_unsupp_fs, &unsupp_fs);
|
||||
if (ret != 0)
|
||||
return (ret);
|
||||
|
||||
if (unsupp_fs) {
|
||||
(void) printf(gettext("Upgrade not performed due to %d "
|
||||
"unsupported filesystems (max v%d).\n"),
|
||||
unsupp_fs, (int) ZPL_VERSION);
|
||||
return (1);
|
||||
}
|
||||
|
||||
ret = zpool_upgrade(zhp, version);
|
||||
if (ret != 0)
|
||||
return (ret);
|
||||
|
||||
Reference in New Issue
Block a user