Mounting f2fs devices with future options leads to unwanted behaviors incurring errors and data destruction.
Implement a long overdue safeguard to prevent mounting devices with unsupported features. This can be further extended to allow read-only mounts on certain incompatible features, but that doesn't seem necessary for now with how f2fs features has been added. Cc: [email protected] Signed-off-by: Park Ju Hyung <[email protected]> --- fs/f2fs/f2fs.h | 11 +++++++++++ fs/f2fs/super.c | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index e2d302ae3a46..12d274492d6f 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -153,6 +153,9 @@ struct f2fs_mount_info { unsigned char extensions[COMPRESS_EXT_NUM][F2FS_EXTENSION_LEN]; /* extensions */ }; +/* + * All features listed here should be appended to F2FS_SUPPORTED_FEATURES + */ #define F2FS_FEATURE_ENCRYPT 0x0001 #define F2FS_FEATURE_BLKZONED 0x0002 #define F2FS_FEATURE_ATOMIC_WRITE 0x0004 @@ -168,6 +171,14 @@ struct f2fs_mount_info { #define F2FS_FEATURE_CASEFOLD 0x1000 #define F2FS_FEATURE_COMPRESSION 0x2000 +/* Currently supported features by this version of f2fs */ +#define F2FS_SUPPORTED_FEATURES \ + (F2FS_FEATURE_ENCRYPT | F2FS_FEATURE_BLKZONED | F2FS_FEATURE_ATOMIC_WRITE | \ + F2FS_FEATURE_EXTRA_ATTR | F2FS_FEATURE_PRJQUOTA | F2FS_FEATURE_INODE_CHKSUM | \ + F2FS_FEATURE_FLEXIBLE_INLINE_XATTR | F2FS_FEATURE_QUOTA_INO | F2FS_FEATURE_INODE_CRTIME | \ + F2FS_FEATURE_LOST_FOUND | F2FS_FEATURE_VERITY | F2FS_FEATURE_SB_CHKSUM | \ + F2FS_FEATURE_CASEFOLD | F2FS_FEATURE_COMPRESSION) + #define __F2FS_HAS_FEATURE(raw_super, mask) \ ((raw_super->feature & cpu_to_le32(mask)) != 0) #define F2FS_HAS_FEATURE(sbi, mask) __F2FS_HAS_FEATURE(sbi->raw_super, mask) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 82592b19b4e0..4a2fe29b0740 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -3610,6 +3610,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) int recovery, i, valid_super_block; struct curseg_info *seg_i; int retry_cnt = 1; + __le32 unsupported; try_onemore: err = -EINVAL; @@ -3647,6 +3648,15 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) sb->s_fs_info = sbi; sbi->raw_super = raw_super; + /* check supported features */ + unsupported = raw_super->feature & ~F2FS_SUPPORTED_FEATURES; + if (unsupported) { + f2fs_err(sbi, "unsupported features: 0x%x\n", unsupported); + f2fs_err(sbi, "please update your kernel or adjust the mkfs.f2fs option\n"); + err = -EOPNOTSUPP; + goto free_sb_buf; + } + /* precompute checksum seed for metadata */ if (f2fs_sb_has_inode_chksum(sbi)) sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid, -- 2.31.1 _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
