[PATCH v5 18/18] btrfs: allow encrypting compressed extents

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Conveniently, compressed extents are already padded to sector size, so
they can be encrypted in-place (which requires 16-byte alignment).

Signed-off-by: Sweet Tea Dorminy <sweettea-kernel@xxxxxxxxxx>
---
 fs/btrfs/btrfs_inode.h |  3 ---
 fs/btrfs/compression.c | 23 +++++++++++++++++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index f0935a95ec70..d7f2b9a3d42b 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -385,9 +385,6 @@ static inline bool btrfs_inode_in_log(struct btrfs_inode *inode, u64 generation)
  */
 static inline bool btrfs_inode_can_compress(const struct btrfs_inode *inode)
 {
-	if (IS_ENCRYPTED(&inode->vfs_inode))
-		return false;
-
 	if (inode->flags & BTRFS_INODE_NODATACOW ||
 	    inode->flags & BTRFS_INODE_NODATASUM)
 		return false;
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 52df6c06cc91..038721a66414 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -202,6 +202,16 @@ static void end_compressed_bio_read(struct btrfs_bio *bbio)
 				status = errno_to_blk_status(ret);
 			}
 		}
+		if (fscrypt_inode_uses_fs_layer_crypto(inode)) {
+			int err;
+			u64 lblk_num = start >> fs_info->sectorsize_bits;
+			err = fscrypt_decrypt_block_inplace(inode, bv.bv_page,
+							    fs_info->sectorsize,
+							    bv.bv_offset,
+							    lblk_num);
+			if (err)
+				status = errno_to_blk_status(err);
+		}
 	}
 
 	if (status)
@@ -451,6 +461,19 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
 		real_size = min_t(u64, real_size, compressed_len - offset);
 		ASSERT(IS_ALIGNED(real_size, fs_info->sectorsize));
 
+		if (fscrypt_inode_uses_fs_layer_crypto(&inode->vfs_inode)) {
+			int err;
+			u64 lblk_num = start >> fs_info->sectorsize_bits;
+
+			err = fscrypt_encrypt_block_inplace(&inode->vfs_inode,
+							    page, real_size, 0,
+							    lblk_num, GFP_NOFS);
+			if (err) {
+				ret = errno_to_blk_status(err);
+				break;
+			}
+		}
+
 		if (use_append)
 			added = bio_add_zone_append_page(bio, page, real_size,
 					offset_in_page(offset));
-- 
2.37.3




[Index of Archives]     [linux Cryptography]     [Asterisk App Development]     [PJ SIP]     [Gnu Gatekeeper]     [IETF Sipping]     [Info Cyrus]     [ALSA User]     [Fedora Linux Users]     [Linux SCTP]     [DCCP]     [Gimp]     [Yosemite News]     [Deep Creek Hot Springs]     [Yosemite Campsites]     [ISDN Cause Codes]

  Powered by Linux