ext4: add support for IV_INO_LBLK_64 encryption policies
authorEric Biggers <ebiggers@google.com>
Thu, 24 Oct 2019 21:54:37 +0000 (14:54 -0700)
committerEric Biggers <ebiggers@google.com>
Wed, 6 Nov 2019 20:34:42 +0000 (12:34 -0800)
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.

Acked-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Eric Biggers <ebiggers@google.com>
fs/ext4/ext4.h
fs/ext4/super.c

index 03db3e7..b3a2cc7 100644 (file)
@@ -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)
index dd654e5..b3cbf86 100644 (file)
@@ -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