Re: [PATCH v2 11/20] btrfs: disable various operations on encrypted inodes

David Sterba
2022-09-07T20:17:01Z

On Mon, Sep 05, 2022 at 08:35:26PM -0400, Sweet Tea Dorminy wrote:
> --- a/fs/btrfs/file.c
> +++ b/fs/btrfs/file.c
> @@ -1895,7 +1895,7 @@ static ssize_t btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
> goto relock;
> }
>
> - if (check_direct_IO(fs_info, from, pos)) {
> + if (IS_ENCRYPTED(inode) || check_direct_IO(fs_info, from, pos)) {

I'm not sure if we want the IS_ENCRYPTED as an explicit check or put it
to check_direct_IO, but probably to make it obvious that direct io does
not work with it a separate check is ok.

> btrfs_inode_unlock(inode, ilock_flags);
> goto buffered;
> }
> @@ -3729,7 +3729,7 @@ static ssize_t btrfs_direct_read(struct kiocb *iocb, struct iov_iter *to)
> ssize_t read = 0;
> ssize_t ret;
>
> - if (fsverity_active(inode))
> + if (IS_ENCRYPTED(inode) || fsverity_active(inode))

Yeah as we have something similar for verity.

> return 0;
>
> if (check_direct_read(btrfs_sb(inode->i_sb), to, iocb->ki_pos))
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 482c5b3d9e70..fea48c12a33a 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -409,7 +409,8 @@ static noinline int cow_file_range_inline(struct btrfs_inode *inode, u64 size,
> * compressed) data fits in a leaf and the configured maximum inline
> * size.
> */
> - if (size < i_size_read(&inode->vfs_inode) ||
> + if (IS_ENCRYPTED(&inode->vfs_inode) ||
> + size < i_size_read(&inode->vfs_inode) ||
> size > fs_info->sectorsize ||
> data_len > BTRFS_MAX_INLINE_DATA_SIZE(fs_info) ||
> data_len > fs_info->max_inline)
> diff --git a/fs/btrfs/reflink.c b/fs/btrfs/reflink.c
> index 9acf47b11fe6..d22086e1cbc8 100644
> --- a/fs/btrfs/reflink.c
> +++ b/fs/btrfs/reflink.c
> @@ -805,6 +805,13 @@ static int btrfs_remap_file_range_prep(struct file *file_in, loff_t pos_in,
> ASSERT(inode_in->i_sb == inode_out->i_sb);
> }
>
> + /*
> + * Can only reflink encrypted files if both files are encrypted.
> + */

The comment fits on one line (and slight 80 chars overflow is ok).

> + if (!fscrypt_have_same_policy(inode_in, inode_out)) {
> + return -EINVAL;

Single statements don't need the { }

> + }
> +