From: Sweet Tea Dorminy <[email protected]>

This puts the long-preserved 1-byte encryption field to work, storing
whether the extent is encrypted.  Update the tree-checker to allow for
the encryption bit to be set to our valid types.

Signed-off-by: Sweet Tea Dorminy <[email protected]>
Signed-off-by: Josef Bacik <[email protected]>
Signed-off-by: Daniel Vacek <[email protected]>
---

v5: 
https://lore.kernel.org/linux-btrfs/1bf1cb768bc8bc54b3855e271412077c60f23c50.1706116485.git.jo...@toxicpanda.com/
 * No changes since.
---
 fs/btrfs/accessors.h            | 2 ++
 fs/btrfs/inode.c                | 6 ++++--
 fs/btrfs/tree-checker.c         | 8 +++++---
 fs/btrfs/tree-log.c             | 2 ++
 include/uapi/linux/btrfs_tree.h | 8 +++++++-
 5 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/fs/btrfs/accessors.h b/fs/btrfs/accessors.h
index 8938357fcb40..09ed68fa2041 100644
--- a/fs/btrfs/accessors.h
+++ b/fs/btrfs/accessors.h
@@ -907,6 +907,8 @@ BTRFS_SETGET_STACK_FUNCS(stack_file_extent_disk_num_bytes,
                         struct btrfs_file_extent_item, disk_num_bytes, 64);
 BTRFS_SETGET_STACK_FUNCS(stack_file_extent_compression,
                         struct btrfs_file_extent_item, compression, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_file_extent_encryption,
+                        struct btrfs_file_extent_item, encryption, 8);
 
 
 BTRFS_SETGET_FUNCS(file_extent_type, struct btrfs_file_extent_item, type, 8);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 79f0b67249de..758dde148be6 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3123,7 +3123,8 @@ static int insert_ordered_extent_file_extent(struct 
btrfs_trans_handle *trans,
        btrfs_set_stack_file_extent_num_bytes(&stack_fi, num_bytes);
        btrfs_set_stack_file_extent_ram_bytes(&stack_fi, ram_bytes);
        btrfs_set_stack_file_extent_compression(&stack_fi, oe->compress_type);
-       /* Encryption and other encoding is reserved and all 0 */
+       btrfs_set_stack_file_extent_encryption(&stack_fi, 
BTRFS_ENCRYPTION_NONE);
+       /* Other encoding is reserved and always 0 */
 
        /*
         * For delalloc, when completing an ordered extent we update the inode's
@@ -9205,7 +9206,8 @@ static struct btrfs_trans_handle 
*insert_prealloc_file_extent(
        btrfs_set_stack_file_extent_num_bytes(&stack_fi, len);
        btrfs_set_stack_file_extent_ram_bytes(&stack_fi, len);
        btrfs_set_stack_file_extent_compression(&stack_fi, BTRFS_COMPRESS_NONE);
-       /* Encryption and other encoding is reserved and all 0 */
+       btrfs_set_stack_file_extent_encryption(&stack_fi, 
BTRFS_ENCRYPTION_NONE);
+       /* Other encoding is reserved and always 0 */
 
        ret = btrfs_qgroup_release_data(inode, file_offset, len, 
&qgroup_released);
        if (ret < 0)
diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
index 452394b34d01..9675dbcd78a3 100644
--- a/fs/btrfs/tree-checker.c
+++ b/fs/btrfs/tree-checker.c
@@ -213,6 +213,7 @@ static int check_extent_data_item(struct extent_buffer 
*leaf,
        u32 sectorsize = fs_info->sectorsize;
        u32 item_size = btrfs_item_size(leaf, slot);
        u64 extent_end;
+       u8 policy;
 
        if (unlikely(!IS_ALIGNED(key->offset, sectorsize))) {
                file_extent_err(leaf, slot,
@@ -264,10 +265,11 @@ static int check_extent_data_item(struct extent_buffer 
*leaf,
                        BTRFS_NR_COMPRESS_TYPES - 1);
                return -EUCLEAN;
        }
-       if (unlikely(btrfs_file_extent_encryption(leaf, fi))) {
+       policy = btrfs_file_extent_encryption(leaf, fi);
+       if (unlikely(policy >= BTRFS_NR_ENCRYPTION_TYPES)) {
                file_extent_err(leaf, slot,
-                       "invalid encryption for file extent, have %u expect 0",
-                       btrfs_file_extent_encryption(leaf, fi));
+                       "invalid encryption for file extent, have %u expect 
range [0, %u]",
+                       policy, BTRFS_NR_ENCRYPTION_TYPES - 1);
                return -EUCLEAN;
        }
        if (btrfs_file_extent_type(leaf, fi) == BTRFS_FILE_EXTENT_INLINE) {
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index d6d3ce41fc3e..118dd1888996 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -5123,6 +5123,7 @@ static int log_one_extent(struct btrfs_trans_handle 
*trans,
        u64 block_start = btrfs_extent_map_block_start(em);
        u64 block_len;
        int ret;
+       u8 encryption = BTRFS_ENCRYPTION_NONE;
 
        btrfs_set_stack_file_extent_generation(&fi, trans->transid);
        if (em->flags & EXTENT_FLAG_PREALLOC)
@@ -5144,6 +5145,7 @@ static int log_one_extent(struct btrfs_trans_handle 
*trans,
        btrfs_set_stack_file_extent_num_bytes(&fi, em->len);
        btrfs_set_stack_file_extent_ram_bytes(&fi, em->ram_bytes);
        btrfs_set_stack_file_extent_compression(&fi, compress_type);
+       btrfs_set_stack_file_extent_encryption(&fi, encryption);
 
        ret = log_extent_csums(trans, inode, log, em, ctx);
        if (ret)
diff --git a/include/uapi/linux/btrfs_tree.h b/include/uapi/linux/btrfs_tree.h
index 02b1ab1f7858..cb8dbcc612e9 100644
--- a/include/uapi/linux/btrfs_tree.h
+++ b/include/uapi/linux/btrfs_tree.h
@@ -1107,8 +1107,14 @@ struct btrfs_file_extent_item {
         * but not for stat.
         */
        __u8 compression;
+
+       /*
+        * Type of encryption in use. Unencrypted value is 0.
+        */
        __u8 encryption;
-       __le16 other_encoding; /* spare for later use */
+
+       /* spare for later use */
+       __le16 other_encoding;
 
        /* are we inline data or a real extent? */
        __u8 type;
-- 
2.51.0


Reply via email to