Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15c4f638 authored by Jens Axboe's avatar Jens Axboe
Browse files

directio: add block polling support



This adds support for sync O_DIRECT read/write poll support.

Signed-off-by: default avatarJens Axboe <axboe@fb.com>
[hch: split from a larger patch, minor updates]
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarKeith Busch <keith.busch@intel.com>
parent a0fa9647
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -109,6 +109,8 @@ struct dio_submit {
struct dio {
	int flags;			/* doesn't change */
	int rw;
	blk_qc_t bio_cookie;
	struct block_device *bio_bdev;
	struct inode *inode;
	loff_t i_size;			/* i_size when submitted */
	dio_iodone_t *end_io;		/* IO completion function */
@@ -397,11 +399,14 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
	if (dio->is_async && dio->rw == READ && dio->should_dirty)
		bio_set_pages_dirty(bio);

	if (sdio->submit_io)
	if (sdio->submit_io) {
		sdio->submit_io(dio->rw, bio, dio->inode,
			       sdio->logical_offset_in_bio);
	else
		submit_bio(dio->rw, bio);
		dio->bio_cookie = BLK_QC_T_NONE;
	} else {
		dio->bio_cookie = submit_bio(dio->rw, bio);
		dio->bio_bdev = bio->bi_bdev;
	}

	sdio->bio = NULL;
	sdio->boundary = 0;
@@ -440,6 +445,7 @@ static struct bio *dio_await_one(struct dio *dio)
		__set_current_state(TASK_UNINTERRUPTIBLE);
		dio->waiter = current;
		spin_unlock_irqrestore(&dio->bio_lock, flags);
		if (!blk_poll(bdev_get_queue(dio->bio_bdev), dio->bio_cookie))
			io_schedule();
		/* wake up sets us TASK_RUNNING */
		spin_lock_irqsave(&dio->bio_lock, flags);