Jens Axboe <ax...@kernel.dk> writes:

> From: Christoph Hellwig <h...@lst.de>
>
> Just call blk_poll on the iocb cookie, we can derive the block device
> from the inode trivially.

Does this work for multi-device file systems?

-Jeff

>
> Reviewed-by: Johannes Thumshirn <jthumsh...@suse.de>
> Signed-off-by: Christoph Hellwig <h...@lst.de>
> Signed-off-by: Jens Axboe <ax...@kernel.dk>
> ---
>  fs/block_dev.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/fs/block_dev.c b/fs/block_dev.c
> index e1886cc7048f..6de8d35f6e41 100644
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -281,6 +281,14 @@ struct blkdev_dio {
>  
>  static struct bio_set blkdev_dio_pool;
>  
> +static int blkdev_iopoll(struct kiocb *kiocb, bool wait)
> +{
> +     struct block_device *bdev = I_BDEV(kiocb->ki_filp->f_mapping->host);
> +     struct request_queue *q = bdev_get_queue(bdev);
> +
> +     return blk_poll(q, READ_ONCE(kiocb->ki_cookie), wait);
> +}
> +
>  static void blkdev_bio_end_io(struct bio *bio)
>  {
>       struct blkdev_dio *dio = bio->bi_private;
> @@ -398,6 +406,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter 
> *iter, int nr_pages)
>                               bio->bi_opf |= REQ_HIPRI;
>  
>                       qc = submit_bio(bio);
> +                     WRITE_ONCE(iocb->ki_cookie, qc);
>                       break;
>               }
>  
> @@ -2070,6 +2079,7 @@ const struct file_operations def_blk_fops = {
>       .llseek         = block_llseek,
>       .read_iter      = blkdev_read_iter,
>       .write_iter     = blkdev_write_iter,
> +     .iopoll         = blkdev_iopoll,
>       .mmap           = generic_file_mmap,
>       .fsync          = blkdev_fsync,
>       .unlocked_ioctl = block_ioctl,

Reply via email to