Needs further work, but this should work fine on normal setups
with a file system on a pollable block device.

Signed-off-by: Jens Axboe <[email protected]>
---
 fs/aio.c       | 2 ++
 fs/direct-io.c | 4 +++-
 fs/iomap.c     | 7 +++++--
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/fs/aio.c b/fs/aio.c
index 500da3ffc376..e02085fe10d7 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1310,6 +1310,8 @@ static struct block_device *aio_bdev_host(struct kiocb 
*req)
 
        if (S_ISBLK(inode->i_mode))
                return I_BDEV(inode);
+       else if (inode->i_sb && inode->i_sb->s_bdev)
+               return inode->i_sb->s_bdev;
 
        return NULL;
 }
diff --git a/fs/direct-io.c b/fs/direct-io.c
index a5a4e5a1423e..34de494e9061 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -477,8 +477,10 @@ static inline void dio_bio_submit(struct dio *dio, struct 
dio_submit *sdio)
        if (sdio->submit_io) {
                sdio->submit_io(bio, dio->inode, sdio->logical_offset_in_bio);
                dio->bio_cookie = BLK_QC_T_NONE;
-       } else
+       } else {
                dio->bio_cookie = submit_bio(bio);
+               WRITE_ONCE(dio->iocb->ki_blk_qc, dio->bio_cookie);
+       }
 
        sdio->bio = NULL;
        sdio->boundary = 0;
diff --git a/fs/iomap.c b/fs/iomap.c
index 74c1f37f0fd6..4cf412b6230a 100644
--- a/fs/iomap.c
+++ b/fs/iomap.c
@@ -1555,6 +1555,7 @@ iomap_dio_zero(struct iomap_dio *dio, struct iomap 
*iomap, loff_t pos,
        struct page *page = ZERO_PAGE(0);
        int flags = REQ_SYNC | REQ_IDLE;
        struct bio *bio;
+       blk_qc_t qc;
 
        bio = bio_alloc(GFP_KERNEL, 1);
        bio_set_dev(bio, iomap->bdev);
@@ -1570,7 +1571,9 @@ iomap_dio_zero(struct iomap_dio *dio, struct iomap 
*iomap, loff_t pos,
        bio_set_op_attrs(bio, REQ_OP_WRITE, flags);
 
        atomic_inc(&dio->ref);
-       return submit_bio(bio);
+       qc = submit_bio(bio);
+       WRITE_ONCE(dio->iocb->ki_blk_qc, qc);
+       return qc;
 }
 
 static loff_t
@@ -1680,7 +1683,7 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, 
loff_t length,
                atomic_inc(&dio->ref);
 
                dio->submit.last_queue = bdev_get_queue(iomap->bdev);
-               dio->submit.cookie = submit_bio(bio);
+               dio->iocb->ki_blk_qc = dio->submit.cookie = submit_bio(bio);
        } while (nr_pages);
 
        if (need_zeroout) {
-- 
2.17.1

Reply via email to