|
@@ -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,7 +445,8 @@ static struct bio *dio_await_one(struct dio *dio)
|
|
|
__set_current_state(TASK_UNINTERRUPTIBLE);
|
|
|
dio->waiter = current;
|
|
|
spin_unlock_irqrestore(&dio->bio_lock, flags);
|
|
|
- io_schedule();
|
|
|
+ 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);
|
|
|
dio->waiter = NULL;
|