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

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
...@@ -109,6 +109,8 @@ struct dio_submit { ...@@ -109,6 +109,8 @@ struct dio_submit {
struct dio { struct dio {
int flags; /* doesn't change */ int flags; /* doesn't change */
int rw; int rw;
blk_qc_t bio_cookie;
struct block_device *bio_bdev;
struct inode *inode; struct inode *inode;
loff_t i_size; /* i_size when submitted */ loff_t i_size; /* i_size when submitted */
dio_iodone_t *end_io; /* IO completion function */ 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) ...@@ -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) if (dio->is_async && dio->rw == READ && dio->should_dirty)
bio_set_pages_dirty(bio); bio_set_pages_dirty(bio);
if (sdio->submit_io) if (sdio->submit_io) {
sdio->submit_io(dio->rw, bio, dio->inode, sdio->submit_io(dio->rw, bio, dio->inode,
sdio->logical_offset_in_bio); sdio->logical_offset_in_bio);
else dio->bio_cookie = BLK_QC_T_NONE;
submit_bio(dio->rw, bio); } else {
dio->bio_cookie = submit_bio(dio->rw, bio);
dio->bio_bdev = bio->bi_bdev;
}
sdio->bio = NULL; sdio->bio = NULL;
sdio->boundary = 0; sdio->boundary = 0;
...@@ -440,6 +445,7 @@ static struct bio *dio_await_one(struct dio *dio) ...@@ -440,6 +445,7 @@ static struct bio *dio_await_one(struct dio *dio)
__set_current_state(TASK_UNINTERRUPTIBLE); __set_current_state(TASK_UNINTERRUPTIBLE);
dio->waiter = current; dio->waiter = current;
spin_unlock_irqrestore(&dio->bio_lock, flags); spin_unlock_irqrestore(&dio->bio_lock, flags);
if (!blk_poll(bdev_get_queue(dio->bio_bdev), dio->bio_cookie))
io_schedule(); io_schedule();
/* wake up sets us TASK_RUNNING */ /* wake up sets us TASK_RUNNING */
spin_lock_irqsave(&dio->bio_lock, flags); spin_lock_irqsave(&dio->bio_lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment