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 370d3aa..683391f 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;
-
 }
diff --cc fs/ext4/ext4.h
Simple merge
Simple merge
diff --cc fs/ext4/super.c
Simple merge