lkml.org 
[lkml]   [2020]   [May]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 3/9] fs/ext4: Disallow encryption if inode is DAX
    Date
    From: Ira Weiny <ira.weiny@intel.com>

    Encryption and DAX are incompatible. Changing the DAX mode due to a
    change in Encryption mode is wrong without a corresponding
    address_space_operations update.

    Make the 2 options mutually exclusive by returning an error if DAX was
    set first.

    Furthermore, clarify the documentation of the exclusivity and how that
    will work.

    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Ira Weiny <ira.weiny@intel.com>

    ---
    Changes:
    remove WARN_ON_ONCE
    Add documentation to the encrypt doc WRT DAX
    ---
    Documentation/filesystems/fscrypt.rst | 4 +++-
    fs/ext4/super.c | 10 +---------
    2 files changed, 4 insertions(+), 10 deletions(-)

    diff --git a/Documentation/filesystems/fscrypt.rst b/Documentation/filesystems/fscrypt.rst
    index aa072112cfff..1475b8d52fef 100644
    --- a/Documentation/filesystems/fscrypt.rst
    +++ b/Documentation/filesystems/fscrypt.rst
    @@ -1038,7 +1038,9 @@ astute users may notice some differences in behavior:
    - The ext4 filesystem does not support data journaling with encrypted
    regular files. It will fall back to ordered data mode instead.

    -- DAX (Direct Access) is not supported on encrypted files.
    +- DAX (Direct Access) is not supported on encrypted files. Attempts to enable
    + DAX on an encrypted file will fail. Mount options will _not_ enable DAX on
    + encrypted files.

    - The st_size of an encrypted symlink will not necessarily give the
    length of the symlink target as required by POSIX. It will actually
    diff --git a/fs/ext4/super.c b/fs/ext4/super.c
    index bf5fcb477f66..9873ab27e3fa 100644
    --- a/fs/ext4/super.c
    +++ b/fs/ext4/super.c
    @@ -1320,7 +1320,7 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len,
    if (inode->i_ino == EXT4_ROOT_INO)
    return -EPERM;

    - if (WARN_ON_ONCE(IS_DAX(inode) && i_size_read(inode)))
    + if (IS_DAX(inode))
    return -EINVAL;

    res = ext4_convert_inline_data(inode);
    @@ -1344,10 +1344,6 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len,
    ext4_set_inode_flag(inode, EXT4_INODE_ENCRYPT);
    ext4_clear_inode_state(inode,
    EXT4_STATE_MAY_INLINE_DATA);
    - /*
    - * Update inode->i_flags - S_ENCRYPTED will be enabled,
    - * S_DAX may be disabled
    - */
    ext4_set_inode_flags(inode);
    }
    return res;
    @@ -1371,10 +1367,6 @@ static int ext4_set_context(struct inode *inode, const void *ctx, size_t len,
    ctx, len, 0);
    if (!res) {
    ext4_set_inode_flag(inode, EXT4_INODE_ENCRYPT);
    - /*
    - * Update inode->i_flags - S_ENCRYPTED will be enabled,
    - * S_DAX may be disabled
    - */
    ext4_set_inode_flags(inode);
    res = ext4_mark_inode_dirty(handle, inode);
    if (res)
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-05-15 06:42    [W:2.865 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site