| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Eric Biggers <ebiggers@google.com> |
| Date: Thu, 24 Oct 2019 14:43:37 -0700 |
| Subject: FROMLIST: ext4: add support for IV_INO_LBLK_64 encryption policies |
| |
| IV_INO_LBLK_64 encryption policies have special requirements from the |
| filesystem beyond those of the existing encryption policies: |
| |
| - Inode numbers must never change, even if the filesystem is resized. |
| - Inode numbers must be <= 32 bits. |
| - File logical block numbers must be <= 32 bits. |
| |
| ext4 has 32-bit inode and file logical block numbers. However, |
| resize2fs can re-number inodes when shrinking an ext4 filesystem. |
| |
| However, typically the people who would want to use this format don't |
| care about filesystem shrinking. They'd be fine with a solution that |
| just prevents the filesystem from being shrunk. |
| |
| Therefore, add a new feature flag EXT4_FEATURE_COMPAT_STABLE_INODES that |
| will do exactly that. Then wire up the fscrypt_operations to expose |
| this flag to fs/crypto/, so that it allows IV_INO_LBLK_64 policies when |
| this flag is set. |
| |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| |
| Change-Id: Iff0f96b3869a907d0539eaf130df8f5e633d0b19 |
| Signed-off-by: Satya Tangirala <satyat@google.com> |
| Link: https://patchwork.kernel.org/patch/11210907/ |
| --- |
| fs/ext4/ext4.h | 2 ++ |
| fs/ext4/super.c | 14 ++++++++++++++ |
| 2 files changed, 16 insertions(+) |
| |
| diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h |
| index 03db3e71676c..b3a2cc7c0252 100644 |
| --- a/fs/ext4/ext4.h |
| +++ b/fs/ext4/ext4.h |
| @@ -1678,6 +1678,7 @@ static inline bool ext4_verity_in_progress(struct inode *inode) |
| #define EXT4_FEATURE_COMPAT_RESIZE_INODE 0x0010 |
| #define EXT4_FEATURE_COMPAT_DIR_INDEX 0x0020 |
| #define EXT4_FEATURE_COMPAT_SPARSE_SUPER2 0x0200 |
| +#define EXT4_FEATURE_COMPAT_STABLE_INODES 0x0800 |
| |
| #define EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 |
| #define EXT4_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 |
| @@ -1779,6 +1780,7 @@ EXT4_FEATURE_COMPAT_FUNCS(xattr, EXT_ATTR) |
| EXT4_FEATURE_COMPAT_FUNCS(resize_inode, RESIZE_INODE) |
| EXT4_FEATURE_COMPAT_FUNCS(dir_index, DIR_INDEX) |
| EXT4_FEATURE_COMPAT_FUNCS(sparse_super2, SPARSE_SUPER2) |
| +EXT4_FEATURE_COMPAT_FUNCS(stable_inodes, STABLE_INODES) |
| |
| EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super, SPARSE_SUPER) |
| EXT4_FEATURE_RO_COMPAT_FUNCS(large_file, LARGE_FILE) |
| diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
| index dd654e53ba3d..b3cbf8622eab 100644 |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -1345,6 +1345,18 @@ static bool ext4_dummy_context(struct inode *inode) |
| return DUMMY_ENCRYPTION_ENABLED(EXT4_SB(inode->i_sb)); |
| } |
| |
| +static bool ext4_has_stable_inodes(struct super_block *sb) |
| +{ |
| + return ext4_has_feature_stable_inodes(sb); |
| +} |
| + |
| +static void ext4_get_ino_and_lblk_bits(struct super_block *sb, |
| + int *ino_bits_ret, int *lblk_bits_ret) |
| +{ |
| + *ino_bits_ret = 8 * sizeof(EXT4_SB(sb)->s_es->s_inodes_count); |
| + *lblk_bits_ret = 8 * sizeof(ext4_lblk_t); |
| +} |
| + |
| static const struct fscrypt_operations ext4_cryptops = { |
| .key_prefix = "ext4:", |
| .get_context = ext4_get_context, |
| @@ -1352,6 +1364,8 @@ static const struct fscrypt_operations ext4_cryptops = { |
| .dummy_context = ext4_dummy_context, |
| .empty_dir = ext4_empty_dir, |
| .max_namelen = EXT4_NAME_LEN, |
| + .has_stable_inodes = ext4_has_stable_inodes, |
| + .get_ino_and_lblk_bits = ext4_get_ino_and_lblk_bits, |
| }; |
| #endif |
| |