From: Vyacheslav Dubeyko <[email protected]> Date: Wed, 18 May 2016 15:58:00 -0700 Subject: [PATCH] f2fs: introduce on-disk layout version checking functionality
Currently, F2FS has 16TB limitation on volume size. But 16TB NAND-based SSDs are around the corner. Unfortunately, support of 16TB+ volume size needs in modification of on-disk layout metadata structures that will be incompatible with current version of F2FS's on-disk layout. This patch implements support of checking version of F2FS on-disk layout. The F2FS superblock contains major_ver and feature fields. Implemented functionality checks the major_ver field and presence of flag that declares 16TB+ volumes support. If file system driver is unable to support 16TB+ volume size then mount of operation of F2FS volume with incompatible version or feature will fail. Signed-off-by: Vyacheslav Dubeyko <[email protected]> CC: Vyacheslav Dubeyko <[email protected]> CC: Jaegeuk Kim <[email protected]> CC: Cyril Guyot <[email protected]> CC: Adam Manzanares <[email protected]> CC: Damien Le Moal <[email protected]> --- fs/f2fs/Kconfig | 12 ++++++++++++ fs/f2fs/f2fs.h | 10 +++++++++- fs/f2fs/super.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/Kconfig b/fs/f2fs/Kconfig index 1f8982a..ec6bba4 100644 --- a/fs/f2fs/Kconfig +++ b/fs/f2fs/Kconfig @@ -94,3 +94,15 @@ config F2FS_IO_TRACE information and block IO patterns in the filesystem level. If unsure, say N. + +config F2FS_16TB_VOLUME_SUPPORT + bool "Support for large (16TB+) F2FS volumes" + depends on F2FS_FS + default n + help + Enable support of 16TB and larger F2FS volumes. + + This feature is under implementation right now. So, no real support + is available yet. + + If unsure, say N. diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 7a4558d..8fa3acc 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -37,6 +37,13 @@ } while (0) #endif +#ifdef CONFIG_F2FS_16TB_VOLUME_SUPPORT +#define F2FS_MAX_SUPP_MAJOR_VERSION (2) +#define F2FS_MIN_16TB_VOLUME_SUPPORT_VERSION (2) +#else +#define F2FS_MAX_SUPP_MAJOR_VERSION (1) +#endif + /* * For mount options */ @@ -75,7 +82,8 @@ struct f2fs_mount_info { unsigned int opt; }; -#define F2FS_FEATURE_ENCRYPT 0x0001 +#define F2FS_FEATURE_ENCRYPT (1 << 0) +#define F2FS_FEATURE_16TB_SUPPORT (1 << 1) #define F2FS_HAS_FEATURE(sb, mask) \ ((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 006f87d..9dcb7a4 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1318,6 +1318,53 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover) return err; } +static int f2fs_check_version_and_features(struct super_block *sb, + struct f2fs_super_block *raw_super) +{ + u16 major_ver = le16_to_cpu(raw_super->major_ver); + u32 feature = le32_to_cpu(raw_super->feature); + + if (major_ver > F2FS_MAX_SUPP_MAJOR_VERSION) { + f2fs_msg(sb, KERN_CRIT, + "Failed to mount volume: " + "major version %u, max supported version %u", + major_ver, + F2FS_MAX_SUPP_MAJOR_VERSION); + return -EOPNOTSUPP; + } + +#ifdef CONFIG_F2FS_16TB_VOLUME_SUPPORT + + if (major_ver < F2FS_MIN_16TB_VOLUME_SUPPORT_VERSION) { + if (feature & F2FS_FEATURE_16TB_SUPPORT) { + f2fs_msg(sb, KERN_CRIT, + "Failed to mount corrupted volume. " + "Please, check the volume by FSCK utility."); + return -EOPNOTSUPP; + } + } else { + if (!(feature & F2FS_FEATURE_16TB_SUPPORT)) { + f2fs_msg(sb, KERN_CRIT, + "Failed to mount corrupted volume. " + "Please, check the volume by FSCK utility."); + return -EOPNOTSUPP; + } + } + +#else + + if (feature & F2FS_FEATURE_16TB_SUPPORT) { + f2fs_msg(sb, KERN_CRIT, + "Failed to mount corrupted volume. " + "Please, check the volume by FSCK utility."); + return -EOPNOTSUPP; + } + +#endif + + return 0; +} + static int f2fs_fill_super(struct super_block *sb, void *data, int silent) { struct f2fs_sb_info *sbi; @@ -1360,6 +1407,10 @@ try_onemore: if (err) goto free_sbi; + err = f2fs_check_version_and_features(sb, raw_super); + if (err) + goto free_sbi; + sb->s_fs_info = sbi; default_options(sbi); /* parse mount options */ -- 1.9.1 ------------------------------------------------------------------------------ Mobile security can be enabling, not merely restricting. Employees who bring their own devices (BYOD) to work are irked by the imposition of MDM restrictions. Mobile Device Manager Plus allows you to control only the apps on BYO-devices by containerizing them, leaving personal data untouched! https://ad.doubleclick.net/ddm/clk/304595813;131938128;j _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
