All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] zfs: recognize zpools formatted with features support
@ 2024-04-30 16:00 WHR
  0 siblings, 0 replies; only message in thread
From: WHR @ 2024-04-30 16:00 UTC (permalink / raw)
  To: u-boot; +Cc: Tom Rini, mwleeds

[-- Attachment #1: Type: text/plain, Size: 337 bytes --]

Currently no features are implemented, only the zpool version 5000 that
indicating the features support, is recognized. Since it is possible for
OpenZFS to create a pool with features support enabled, but without
enabling any actual feature, this change enables U-Boot to read such
pools.

Signed-off-by: WHR <msl0000023508@gmail.com>



[-- Attachment #2: 0001-zfs-recognize-zpools-formatted-with-features-support --]
[-- Type: text/plain, Size: 2212 bytes --]

diff --git a/fs/zfs/zfs.c b/fs/zfs/zfs.c
index 4896cc18ef..3575c23a42 100644
--- a/fs/zfs/zfs.c
+++ b/fs/zfs/zfs.c
@@ -336,6 +336,12 @@ vdev_uberblock_compare(uberblock_t *ub1, uberblock_t *ub2)
 	return 0;
 }
 
+static inline int
+is_supported_spa_version(uint64_t version) {
+	return version == FEATURES_SUPPORTED_SPA_VERSION ||
+		(version > 0 && version <= SPA_VERSION);
+}
+
 /*
  * Three pieces of information are needed to verify an uberblock: the magic
  * number, the version number, and the checksum.
@@ -348,6 +354,7 @@ static int
 uberblock_verify(uberblock_t *uber, int offset, struct zfs_data *data)
 {
 	int err;
+	uint64_t spa_version;
 	zfs_endian_t endian = UNKNOWN_ENDIAN;
 	zio_cksum_t zc;
 
@@ -357,14 +364,12 @@ uberblock_verify(uberblock_t *uber, int offset, struct zfs_data *data)
 		return ZFS_ERR_BAD_FS;
 	}
 
-	if (zfs_to_cpu64(uber->ub_magic, LITTLE_ENDIAN) == UBERBLOCK_MAGIC
-		&& zfs_to_cpu64(uber->ub_version, LITTLE_ENDIAN) > 0
-		&& zfs_to_cpu64(uber->ub_version, LITTLE_ENDIAN) <= SPA_VERSION)
+	if (zfs_to_cpu64(uber->ub_magic, LITTLE_ENDIAN) == UBERBLOCK_MAGIC &&
+		is_supported_spa_version(zfs_to_cpu64(uber->ub_version, LITTLE_ENDIAN)))
 		endian = LITTLE_ENDIAN;
 
-	if (zfs_to_cpu64(uber->ub_magic, BIG_ENDIAN) == UBERBLOCK_MAGIC
-		&& zfs_to_cpu64(uber->ub_version, BIG_ENDIAN) > 0
-		&& zfs_to_cpu64(uber->ub_version, BIG_ENDIAN) <= SPA_VERSION)
+	if (zfs_to_cpu64(uber->ub_magic, BIG_ENDIAN) == UBERBLOCK_MAGIC &&
+		is_supported_spa_version(zfs_to_cpu64(uber->ub_version, BIG_ENDIAN)))
 		endian = BIG_ENDIAN;
 
 	if (endian == UNKNOWN_ENDIAN) {
@@ -1790,7 +1795,7 @@ check_pool_label(struct zfs_data *data)
 		return ZFS_ERR_BAD_FS;
 	}
 
-	if (version > SPA_VERSION) {
+	if (!is_supported_spa_version(version)) {
 		free(nvlist);
 		printf("SPA version too new %llu > %llu\n",
 			   (unsigned long long) version,
diff --git a/include/zfs/zfs.h b/include/zfs/zfs.h
index 17b93c10c8..72d87452dd 100644
--- a/include/zfs/zfs.h
+++ b/include/zfs/zfs.h
@@ -15,6 +15,7 @@
  * On-disk version number.
  */
 #define	SPA_VERSION			28ULL
+#define	FEATURES_SUPPORTED_SPA_VERSION	5000ULL
 
 /*
  * The following are configuration names used in the nvlist describing a pool's

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2024-04-30 16:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-04-30 16:00 [PATCH] zfs: recognize zpools formatted with features support WHR

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.