From 2d2d00c6c6dc3f2aa72dccec635885f03a37a14f Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 21 Oct 2019 16:30:43 -0700 Subject: [PATCH] AOSP: support the stable_inodes feature Reserve the codepoint for EXT4_FEATURE_COMPAT_STABLE_INODES, allow it to be set and cleared, and teach resize2fs to forbid shrinking the filesystem if it is set. This feature will allow the use of encryption policies where the inode number is included in the IVs (initialization vectors) for encryption, so data would be corrupted if the inodes were to be renumbered. For more details, see the kernel patchset: https://lkml.kernel.org/linux-fsdevel/20191021230355.23136-1-ebiggers@kernel.org/T/#u Signed-off-by: Eric Biggers Signed-off-by: Theodore Ts'o From AOSP commit: 9aa30c254dd57df54f00c5d520b7ac867ad7ca68 --- lib/e2p/feature.c | 2 ++ lib/ext2fs/ext2_fs.h | 2 ++ lib/ext2fs/ext2fs.h | 3 ++- misc/mke2fs.c | 3 ++- misc/tune2fs.c | 6 ++++-- resize/main.c | 6 ++++++ 6 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/e2p/feature.c b/lib/e2p/feature.c index ae7f7f0..ad0d7f8 100644 --- a/lib/e2p/feature.c +++ b/lib/e2p/feature.c @@ -47,6 +47,8 @@ static struct feature feature_list[] = { "sparse_super2" }, { E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_FAST_COMMIT, "fast_commit" }, + { E2P_FEATURE_COMPAT, EXT4_FEATURE_COMPAT_STABLE_INODES, + "stable_inodes" }, { E2P_FEATURE_RO_INCOMPAT, EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER, "sparse_super" }, diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h index febcb47..3165b38 100644 --- a/lib/ext2fs/ext2_fs.h +++ b/lib/ext2fs/ext2_fs.h @@ -811,6 +811,7 @@ struct ext2_super_block { #define EXT2_FEATURE_COMPAT_EXCLUDE_BITMAP 0x0100 #define EXT4_FEATURE_COMPAT_SPARSE_SUPER2 0x0200 #define EXT4_FEATURE_COMPAT_FAST_COMMIT 0x0400 +#define EXT4_FEATURE_COMPAT_STABLE_INODES 0x0800 #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 @@ -913,6 +914,7 @@ EXT4_FEATURE_COMPAT_FUNCS(lazy_bg, 2, LAZY_BG) EXT4_FEATURE_COMPAT_FUNCS(exclude_bitmap, 2, EXCLUDE_BITMAP) EXT4_FEATURE_COMPAT_FUNCS(sparse_super2, 4, SPARSE_SUPER2) EXT4_FEATURE_COMPAT_FUNCS(fast_commit, 4, FAST_COMMIT) +EXT4_FEATURE_COMPAT_FUNCS(stable_inodes, 4, STABLE_INODES) EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super, 2, SPARSE_SUPER) EXT4_FEATURE_RO_COMPAT_FUNCS(large_file, 2, LARGE_FILE) diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index 334944d..a5ed10f 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -612,7 +612,8 @@ typedef struct ext2_icount *ext2_icount_t; EXT2_FEATURE_COMPAT_DIR_INDEX|\ EXT2_FEATURE_COMPAT_EXT_ATTR|\ EXT4_FEATURE_COMPAT_SPARSE_SUPER2|\ - EXT4_FEATURE_COMPAT_FAST_COMMIT) + EXT4_FEATURE_COMPAT_FAST_COMMIT|\ + EXT4_FEATURE_COMPAT_STABLE_INODES) #ifdef CONFIG_MMP #define EXT4_LIB_INCOMPAT_MMP EXT4_FEATURE_INCOMPAT_MMP diff --git a/misc/mke2fs.c b/misc/mke2fs.c index fe49584..ffea823 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -1144,7 +1144,8 @@ static __u32 ok_features[3] = { EXT2_FEATURE_COMPAT_DIR_INDEX | EXT2_FEATURE_COMPAT_EXT_ATTR | EXT4_FEATURE_COMPAT_SPARSE_SUPER2 | - EXT4_FEATURE_COMPAT_FAST_COMMIT, + EXT4_FEATURE_COMPAT_FAST_COMMIT | + EXT4_FEATURE_COMPAT_STABLE_INODES, /* Incompat */ EXT2_FEATURE_INCOMPAT_FILETYPE| EXT3_FEATURE_INCOMPAT_EXTENTS| diff --git a/misc/tune2fs.c b/misc/tune2fs.c index 77a4587..8368a73 100644 --- a/misc/tune2fs.c +++ b/misc/tune2fs.c @@ -150,7 +150,8 @@ static __u32 ok_features[3] = { /* Compat */ EXT3_FEATURE_COMPAT_HAS_JOURNAL | EXT2_FEATURE_COMPAT_DIR_INDEX | - EXT4_FEATURE_COMPAT_FAST_COMMIT, + EXT4_FEATURE_COMPAT_FAST_COMMIT | + EXT4_FEATURE_COMPAT_STABLE_INODES, /* Incompat */ EXT2_FEATURE_INCOMPAT_FILETYPE | EXT3_FEATURE_INCOMPAT_EXTENTS | @@ -180,7 +181,8 @@ static __u32 clear_ok_features[3] = { EXT3_FEATURE_COMPAT_HAS_JOURNAL | EXT2_FEATURE_COMPAT_RESIZE_INODE | EXT2_FEATURE_COMPAT_DIR_INDEX | - EXT4_FEATURE_COMPAT_FAST_COMMIT, + EXT4_FEATURE_COMPAT_FAST_COMMIT | + EXT4_FEATURE_COMPAT_STABLE_INODES, /* Incompat */ EXT2_FEATURE_INCOMPAT_FILETYPE | EXT4_FEATURE_INCOMPAT_FLEX_BG | diff --git a/resize/main.c b/resize/main.c index a0c31c0..cb0bf6a 100644 --- a/resize/main.c +++ b/resize/main.c @@ -605,6 +605,12 @@ int main (int argc, char ** argv) fprintf(stderr, _("The filesystem is already 32-bit.\n")); exit(0); } + if (new_size < ext2fs_blocks_count(fs->super) && + ext2fs_has_feature_stable_inodes(fs->super)) { + fprintf(stderr, _("Cannot shrink this filesystem " + "because it has the stable_inodes feature flag.\n")); + exit(1); + } if (mount_flags & EXT2_MF_MOUNTED) { retval = online_resize_fs(fs, mtpt, &new_size, flags); } else { -- 1.8.3.1