diff options
author | Colm <[email protected]> | 2021-02-18 05:30:45 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-02-17 21:30:45 -0800 |
commit | 658fb8020f0501435516baeea7004575d640649b (patch) | |
tree | c457e97687bbef4abe4b791fce7f4515feaaf4d2 /include | |
parent | 35ec51796f0aa8d4fe322b48e7d1d5a65e38a4ce (diff) |
Add "compatibility" property for zpool feature sets
Property to allow sets of features to be specified; for compatibility
with specific versions / releases / external systems. Influences
the behavior of 'zpool upgrade' and 'zpool create'. Initial man
page changes and test cases included.
Brief synopsis:
zpool create -o compatibility=off|legacy|file[,file...] pool vdev...
compatibility = off : disable compatibility mode (enable all features)
compatibility = legacy : request that no features be enabled
compatibility = file[,file...] : read features from specified files.
Only features present in *all* files will be enabled on the
resulting pool. Filenames may be absolute, or relative to
/etc/zfs/compatibility.d or /usr/share/zfs/compatibility.d (/etc
checked first).
Only affects zpool create, zpool upgrade and zpool status.
ABI changes in libzfs:
* New function "zpool_load_compat" to load and parse compat sets.
* Add "zpool_compat_status_t" typedef for compatibility parse status.
* Add ZPOOL_PROP_COMPATIBILITY to the pool properties enum
* Add ZPOOL_STATUS_COMPATIBILITY_ERR to the pool status enum
An initial set of base compatibility sets are included in
cmd/zpool/compatibility.d, and the Makefile for cmd/zpool is
modified to install these in $pkgdatadir/compatibility.d and to
create symbolic links to a reasonable set of aliases.
Reviewed-by: ericloewe
Reviewed-by: Matthew Ahrens <[email protected]>
Reviewed-by: Richard Laager <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Colm Buckley <[email protected]>
Closes #11468
Diffstat (limited to 'include')
-rw-r--r-- | include/libzfs.h | 16 | ||||
-rw-r--r-- | include/sys/fs/zfs.h | 19 | ||||
-rw-r--r-- | include/sys/spa_impl.h | 2 |
3 files changed, 35 insertions, 2 deletions
diff --git a/include/libzfs.h b/include/libzfs.h index 66cedd0ee..5f0bc03be 100644 --- a/include/libzfs.h +++ b/include/libzfs.h @@ -28,6 +28,7 @@ * Copyright 2016 Nexenta Systems, Inc. * Copyright (c) 2017 Open-E, Inc. All Rights Reserved. * Copyright (c) 2019 Datto Inc. + * Copyright (c) 2021, Colm Buckley <[email protected]> */ #ifndef _LIBZFS_H @@ -391,6 +392,7 @@ typedef enum { ZPOOL_STATUS_REBUILDING, /* device being rebuilt */ ZPOOL_STATUS_REBUILD_SCRUB, /* recommend scrubbing the pool */ ZPOOL_STATUS_NON_NATIVE_ASHIFT, /* (e.g. 512e dev with ashift of 9) */ + ZPOOL_STATUS_COMPATIBILITY_ERR, /* bad 'compatibility' property */ /* * Finally, the following indicates a healthy pool. @@ -912,6 +914,20 @@ int zfs_smb_acl_rename(libzfs_handle_t *, char *, char *, char *, char *); extern int zpool_enable_datasets(zpool_handle_t *, const char *, int); extern int zpool_disable_datasets(zpool_handle_t *, boolean_t); +/* + * Parse a features file for -o compatibility + */ +typedef enum { + ZPOOL_COMPATIBILITY_OK, + ZPOOL_COMPATIBILITY_READERR, + ZPOOL_COMPATIBILITY_BADFILE, + ZPOOL_COMPATIBILITY_BADWORD, + ZPOOL_COMPATIBILITY_NOFILES +} zpool_compat_status_t; + +extern zpool_compat_status_t zpool_load_compat(const char *, + boolean_t *, char *, char *); + #ifdef __FreeBSD__ /* diff --git a/include/sys/fs/zfs.h b/include/sys/fs/zfs.h index 65515e382..71d736d5c 100644 --- a/include/sys/fs/zfs.h +++ b/include/sys/fs/zfs.h @@ -27,10 +27,10 @@ * Copyright (c) 2014 Integros [integros.com] * Copyright (c) 2017, Intel Corporation. * Copyright (c) 2019 Datto Inc. + * Portions Copyright 2010 Robert Milkowski + * Copyright (c) 2021, Colm Buckley <[email protected]> */ -/* Portions Copyright 2010 Robert Milkowski */ - #ifndef _SYS_FS_ZFS_H #define _SYS_FS_ZFS_H @@ -246,6 +246,7 @@ typedef enum { ZPOOL_PROP_CHECKPOINT, ZPOOL_PROP_LOAD_GUID, ZPOOL_PROP_AUTOTRIM, + ZPOOL_PROP_COMPATIBILITY, ZPOOL_NUM_PROPS } zpool_prop_t; @@ -733,6 +734,7 @@ typedef struct zpool_load_policy { #define ZPOOL_CONFIG_ALLOCATION_BIAS "alloc_bias" /* not stored on disk */ #define ZPOOL_CONFIG_EXPANSION_TIME "expansion_time" /* not stored */ #define ZPOOL_CONFIG_REBUILD_STATS "org.openzfs:rebuild_stats" +#define ZPOOL_CONFIG_COMPATIBILITY "compatibility" /* * The persistent vdev state is stored as separate values rather than a single @@ -846,6 +848,19 @@ typedef struct zpool_load_policy { #define ZPOOL_CACHE_BOOT "/boot/zfs/zpool.cache" #define ZPOOL_CACHE "/etc/zfs/zpool.cache" /* + * Settings for zpool compatibility features files + */ +#define ZPOOL_SYSCONF_COMPAT_D SYSCONFDIR "/zfs/compatibility.d" +#define ZPOOL_DATA_COMPAT_D PKGDATADIR "/compatibility.d" +#define ZPOOL_COMPAT_MAXSIZE 16384 + +/* + * Hard-wired compatibility settings + */ +#define ZPOOL_COMPAT_LEGACY "legacy" +#define ZPOOL_COMPAT_OFF "off" + +/* * vdev states are ordered from least to most healthy. * A vdev that's CANT_OPEN or below is considered unusable. */ diff --git a/include/sys/spa_impl.h b/include/sys/spa_impl.h index 7f15fd030..bc88cfa15 100644 --- a/include/sys/spa_impl.h +++ b/include/sys/spa_impl.h @@ -424,6 +424,8 @@ struct spa { int spa_waiters; /* number of waiting threads */ boolean_t spa_waiters_cancel; /* waiters should return */ + char *spa_compatibility; /* compatibility file(s) */ + /* * spa_refcount & spa_config_lock must be the last elements * because zfs_refcount_t changes size based on compilation options. |