From: Josef Bacik <[email protected]>

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 <[email protected]>
Signed-off-by: Daniel Vacek <[email protected]>
---

No changes in v7.
v6 changes:
 * 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.jo...@toxicpanda.com/
   ("btrfs: plumb the fscrypt extent context through create_io_em").
 * Moved fscrypt_info to be the last argument of alloc_ordered_extent().
v5: 
https://lore.kernel.org/linux-btrfs/80c5dabfe190b84e31a95160021da64ebcf7ecf7.1706116485.git.jo...@toxicpanda.com/
---
 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 57167d56dc72..5a53739e9445 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 17e2c77c584a..c6c8ae05e471 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1112,6 +1112,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->cb->compress_type;
+       file_extent.fscrypt_info = NULL;
 
        async_extent->cb->bbio.bio.bi_iter.bi_sector = ins.objectid >> 
SECTOR_SHIFT;
 
@@ -1249,6 +1250,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
@@ -10201,6 +10203,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 ac302fb7484b..5a9bb0e8a18c 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;
@@ -205,10 +206,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->csum_list);
@@ -290,6 +293,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
@@ -323,7 +327,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,
@@ -331,7 +336,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;
@@ -1270,8 +1276,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 9b288c3908f9..a3514a4d9ea1 100644
--- a/fs/btrfs/ordered-data.h
+++ b/fs/btrfs/ordered-data.h
@@ -192,6 +192,7 @@ struct btrfs_file_extent {
        u64 num_bytes;
        u64 ram_bytes;
        u64 offset;
+       struct fscrypt_extent_info *fscrypt_info;
        u8 compression;
 };
 
-- 
2.53.0


Reply via email to