| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Eric Biggers <ebiggers@google.com> |
| Date: Fri, 24 Jul 2020 18:44:57 +0000 |
| Subject: ANDROID: iomap: support direct I/O with fscrypt using blk-crypto |
| |
| Set bio crypt contexts on bios by calling into fscrypt when required. |
| No DUN contiguity checks are done - callers are expected to set up the |
| iomap correctly to ensure that each bio submitted by iomap will not have |
| blocks with incontiguous DUNs by calling fscrypt_limit_io_blocks() |
| appropriately. |
| |
| [CPNOTE: 25/05/21] Lee: No update since v8 was posted in January - poked the MLs |
| [CPNOTE: 26/05/21] Lee: Satya will work to push these forward over the next week |
| [CPNOTE: 22/07/21] Lee: v9 was posted 7 weeks ago with no reviews - poked again |
| [CPNOTE: 04/08/21] Lee: Eric and Satya are still working on this [0] |
| |
| [0] https://lore.kernel.org/linux-xfs/YPmFSw4JbWnIozSZ@gmail.com/ |
| |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| Co-developed-by: Satya Tangirala <satyat@google.com> |
| Signed-off-by: Satya Tangirala <satyat@google.com> |
| |
| Bug: 162255927 |
| Link: https://lore.kernel.org/r/20200724184501.1651378-4-satyat@google.com |
| Change-Id: I34bd73001d53c854b5905799d3a9c31762914763 |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| --- |
| fs/iomap/direct-io.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c |
| --- a/fs/iomap/direct-io.c |
| +++ b/fs/iomap/direct-io.c |
| @@ -6,6 +6,7 @@ |
| #include <linux/module.h> |
| #include <linux/compiler.h> |
| #include <linux/fs.h> |
| +#include <linux/fscrypt.h> |
| #include <linux/iomap.h> |
| #include <linux/backing-dev.h> |
| #include <linux/uio.h> |
| @@ -178,11 +179,14 @@ static void iomap_dio_bio_end_io(struct bio *bio) |
| static void iomap_dio_zero(const struct iomap_iter *iter, struct iomap_dio *dio, |
| loff_t pos, unsigned len) |
| { |
| + struct inode *inode = file_inode(dio->iocb->ki_filp); |
| struct page *page = ZERO_PAGE(0); |
| int flags = REQ_SYNC | REQ_IDLE; |
| struct bio *bio; |
| |
| bio = bio_alloc(GFP_KERNEL, 1); |
| + fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits, |
| + GFP_KERNEL); |
| bio_set_dev(bio, iter->iomap.bdev); |
| bio->bi_iter.bi_sector = iomap_sector(&iter->iomap, pos); |
| bio->bi_private = dio; |
| @@ -309,6 +313,8 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter, |
| } |
| |
| bio = bio_alloc(GFP_KERNEL, nr_pages); |
| + fscrypt_set_bio_crypt_ctx(bio, inode, pos >> inode->i_blkbits, |
| + GFP_KERNEL); |
| bio_set_dev(bio, iomap->bdev); |
| bio->bi_iter.bi_sector = iomap_sector(iomap, pos); |
| bio->bi_write_hint = dio->iocb->ki_hint; |