From: Josef Bacik We're going to be getting fscrypt_info from the extent maps. Pass the fscrypt_info to helpers using the file_extent structure and use that to set the encryption type on the ordered extent. For prealloc extents we create an em, since we already have the context loaded from the original prealloc extent creation we need to pre- populate the extent map fscrypt info so it can be read properly later if the pages are evicted. Signed-off-by: Josef Bacik Signed-off-by: Daniel Vacek --- v5: https://lore.kernel.org/linux-btrfs/80c5dabfe190b84e31a95160021da64ebcf7ecf7.1706116485.git.josef@toxicpanda.com/ * Added fscrypt_info to file_extent structure to clean up and simplify the code following upstream changes since. * Squashed in https://lore.kernel.org/linux-btrfs/f2b402eac1963296b6b8db3cb59cdf24a8121b97.1706116485.git.josef@toxicpanda.com/ ("btrfs: plumb the fscrypt extent context through create_io_em"). * Moved fscrypt_info to be the last argument of alloc_ordered_extent(). --- fs/btrfs/direct-io.c | 1 + fs/btrfs/inode.c | 3 +++ fs/btrfs/ordered-data.c | 18 ++++++++++++------ fs/btrfs/ordered-data.h | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/fs/btrfs/direct-io.c b/fs/btrfs/direct-io.c index 9a63200d7a53..f3efc451d9a5 100644 --- a/fs/btrfs/direct-io.c +++ b/fs/btrfs/direct-io.c @@ -202,6 +202,7 @@ static struct extent_map *btrfs_new_extent_direct(struct btrfs_inode *inode, file_extent.ram_bytes = ins.offset; file_extent.offset = 0; file_extent.compression = BTRFS_COMPRESS_NONE; + file_extent.fscrypt_info = NULL; em = btrfs_create_dio_extent(inode, dio_data, start, &file_extent, BTRFS_ORDERED_REGULAR); btrfs_dec_block_group_reservations(fs_info, ins.objectid); diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index b425047f77c7..aef95d6e02bf 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1183,6 +1183,7 @@ static void submit_one_async_extent(struct async_chunk *async_chunk, file_extent.num_bytes = async_extent->ram_size; file_extent.offset = 0; file_extent.compression = async_extent->compress_type; + file_extent.fscrypt_info = NULL; em = btrfs_create_io_em(inode, start, &file_extent, BTRFS_ORDERED_COMPRESSED); if (IS_ERR(em)) { @@ -1319,6 +1320,7 @@ static int cow_one_range(struct btrfs_inode *inode, struct folio *locked_folio, file_extent.ram_bytes = ins->offset; file_extent.offset = 0; file_extent.compression = BTRFS_COMPRESS_NONE; + file_extent.fscrypt_info = NULL; /* * Locked range will be released either during error clean up (inside @@ -10117,6 +10119,7 @@ ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from, file_extent.ram_bytes = ram_bytes; file_extent.offset = encoded->unencoded_offset; file_extent.compression = compression; + file_extent.fscrypt_info = NULL; em = btrfs_create_io_em(inode, start, &file_extent, BTRFS_ORDERED_COMPRESSED); if (IS_ERR(em)) { ret = PTR_ERR(em); diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 7a5701937184..1b4d20a2f983 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c @@ -148,7 +148,8 @@ static inline struct rb_node *ordered_tree_search(struct btrfs_inode *inode, static struct btrfs_ordered_extent *alloc_ordered_extent( struct btrfs_inode *inode, u64 file_offset, u64 num_bytes, u64 ram_bytes, u64 disk_bytenr, u64 disk_num_bytes, - u64 offset, unsigned long flags, int compress_type) + u64 offset, unsigned long flags, int compress_type, + struct fscrypt_extent_info *fscrypt_info) { struct btrfs_ordered_extent *entry; int ret; @@ -192,10 +193,12 @@ static struct btrfs_ordered_extent *alloc_ordered_extent( } entry->inode = inode; entry->compress_type = compress_type; - entry->encryption_type = BTRFS_ENCRYPTION_NONE; entry->truncated_len = (u64)-1; entry->qgroup_rsv = qgroup_rsv; entry->flags = flags; + entry->fscrypt_info = fscrypt_get_extent_info(fscrypt_info); + entry->encryption_type = entry->fscrypt_info ? + BTRFS_ENCRYPTION_FSCRYPT : BTRFS_ENCRYPTION_NONE; refcount_set(&entry->refs, 1); init_waitqueue_head(&entry->wait); INIT_LIST_HEAD(&entry->list); @@ -272,6 +275,7 @@ static void insert_ordered_extent(struct btrfs_ordered_extent *entry) * @offset: Offset into unencoded data where file data starts. * @flags: Flags specifying type of extent (1U << BTRFS_ORDERED_*). * @compress_type: Compression algorithm used for data. + * @fscrypt_info: The fscrypt_extent_info for this extent, if necessary. * * Most of these parameters correspond to &struct btrfs_file_extent_item. The * tree is given a single reference on the ordered extent that was inserted, and @@ -305,7 +309,8 @@ struct btrfs_ordered_extent *btrfs_alloc_ordered_extent( file_extent->num_bytes, file_extent->disk_bytenr + file_extent->offset, file_extent->num_bytes, 0, flags, - file_extent->compression); + file_extent->compression, + file_extent->fscrypt_info); else entry = alloc_ordered_extent(inode, file_offset, file_extent->num_bytes, @@ -313,7 +318,8 @@ struct btrfs_ordered_extent *btrfs_alloc_ordered_extent( file_extent->disk_bytenr, file_extent->disk_num_bytes, file_extent->offset, flags, - file_extent->compression); + file_extent->compression, + file_extent->fscrypt_info); if (!IS_ERR(entry)) insert_ordered_extent(entry); return entry; @@ -1271,8 +1277,8 @@ struct btrfs_ordered_extent *btrfs_split_ordered_extent( if (WARN_ON_ONCE(ordered->disk_num_bytes != ordered->num_bytes)) return ERR_PTR(-EINVAL); - new = alloc_ordered_extent(inode, file_offset, len, len, disk_bytenr, - len, 0, flags, ordered->compress_type); + new = alloc_ordered_extent(inode, file_offset, len, len, disk_bytenr, len, 0, + flags, ordered->compress_type, ordered->fscrypt_info); if (IS_ERR(new)) return new; diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h index ce19198e7f84..51c795865fe6 100644 --- a/fs/btrfs/ordered-data.h +++ b/fs/btrfs/ordered-data.h @@ -188,6 +188,7 @@ struct btrfs_file_extent { u64 num_bytes; u64 ram_bytes; u64 offset; + struct fscrypt_extent_info *fscrypt_info; u8 compression; }; -- 2.51.0