blob: 3284d1bebd2ba1c4ad6a2b80b534c8f2dfb13fa6 [file] [log] [blame]
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;