ext4: clean up superblock encryption mode fields
authorTheodore Ts'o <tytso@mit.edu>
Mon, 18 May 2015 17:18:47 +0000 (13:18 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 18 May 2015 17:18:47 +0000 (13:18 -0400)
The superblock fields s_file_encryption_mode and s_dir_encryption_mode
are vestigal, so remove them as a cleanup.  While we're at it, allow
file systems with both encryption and inline_data enabled at the same
time to work correctly.  We can't have encrypted inodes with inline
data, but there's no reason to prohibit unencrypted inodes from using
the inline data feature.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/crypto_policy.c
fs/ext4/ext4.h
fs/ext4/ialloc.c
fs/ext4/super.c

index 370d3aa0a9cf95918d5ac0ec74bb832e6470303f..683391f790d61bc6e1c1cb4fda1fadf29c29565b 100644 (file)
@@ -51,6 +51,10 @@ static int ext4_create_encryption_context_from_policy(
        struct ext4_encryption_context ctx;
        int res = 0;
 
+       res = ext4_convert_inline_data(inode);
+       if (res)
+               return res;
+
        ctx.format = EXT4_ENCRYPTION_CONTEXT_FORMAT_V1;
        memcpy(ctx.master_key_descriptor, policy->master_key_descriptor,
               EXT4_KEY_DESCRIPTOR_SIZE);
@@ -199,8 +203,9 @@ int ext4_inherit_context(struct inode *parent, struct inode *child)
        res = ext4_xattr_set(child, EXT4_XATTR_INDEX_ENCRYPTION,
                             EXT4_XATTR_NAME_ENCRYPTION_CONTEXT, &ctx,
                             sizeof(ctx), 0);
-       if (!res)
+       if (!res) {
                ext4_set_inode_flag(child, EXT4_INODE_ENCRYPT);
+               ext4_clear_inode_state(child, EXT4_STATE_MAY_INLINE_DATA);
+       }
        return res;
-
 }
index cac1968e63cba33e4a066040655e31bb4d379445..213536fdab9fc281d54172ec2156e42eb23030a9 100644 (file)
@@ -1374,12 +1374,6 @@ struct ext4_sb_info {
        struct ratelimit_state s_err_ratelimit_state;
        struct ratelimit_state s_warning_ratelimit_state;
        struct ratelimit_state s_msg_ratelimit_state;
-
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-       /* Encryption */
-       uint32_t s_file_encryption_mode;
-       uint32_t s_dir_encryption_mode;
-#endif
 };
 
 static inline struct ext4_sb_info *EXT4_SB(struct super_block *sb)
index 1eaa6cb96cd086f0274c2af014fa8c6e75d7ec80..ddca1697ad863182a0b632681a2d01efc1ccf795 100644 (file)
@@ -1034,28 +1034,9 @@ got:
        ext4_set_inode_state(inode, EXT4_STATE_NEW);
 
        ei->i_extra_isize = EXT4_SB(sb)->s_want_extra_isize;
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-       if ((sbi->s_file_encryption_mode == EXT4_ENCRYPTION_MODE_INVALID) &&
-           (sbi->s_dir_encryption_mode == EXT4_ENCRYPTION_MODE_INVALID)) {
-               ei->i_inline_off = 0;
-               if (EXT4_HAS_INCOMPAT_FEATURE(sb,
-                       EXT4_FEATURE_INCOMPAT_INLINE_DATA))
-                       ext4_set_inode_state(inode,
-                       EXT4_STATE_MAY_INLINE_DATA);
-       } else {
-               /* Inline data and encryption are incompatible
-                * We turn off inline data since encryption is enabled */
-               ei->i_inline_off = 1;
-               if (EXT4_HAS_INCOMPAT_FEATURE(sb,
-                       EXT4_FEATURE_INCOMPAT_INLINE_DATA))
-                       ext4_clear_inode_state(inode,
-                       EXT4_STATE_MAY_INLINE_DATA);
-       }
-#else
        ei->i_inline_off = 0;
        if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_INLINE_DATA))
                ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
-#endif
        ret = inode;
        err = dquot_alloc_inode(inode);
        if (err)
index e0dac100fbe63524febfac9b4f0f14932dadb39e..b0bd1c1061b3dd991037da1c0a52fa06564990fa 100644 (file)
@@ -3452,11 +3452,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
        if (sb->s_bdev->bd_part)
                sbi->s_sectors_written_start =
                        part_stat_read(sb->s_bdev->bd_part, sectors[1]);
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-       /* Modes of operations for file and directory encryption. */
-       sbi->s_file_encryption_mode = EXT4_ENCRYPTION_MODE_AES_256_XTS;
-       sbi->s_dir_encryption_mode = EXT4_ENCRYPTION_MODE_INVALID;
-#endif
 
        /* Cleanup superblock name */
        for (cp = sb->s_id; (cp = strchr(cp, '/'));)