diff options
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r-- | fs/direct-io.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c index d6a9012d42ad..476f1ecbd1f0 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
@@ -253,8 +253,13 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, | |||
253 | if (ret == 0) | 253 | if (ret == 0) |
254 | ret = transferred; | 254 | ret = transferred; |
255 | 255 | ||
256 | if (dio->end_io && dio->result) | 256 | if (dio->end_io) { |
257 | dio->end_io(dio->iocb, offset, transferred, dio->private); | 257 | int err; |
258 | |||
259 | err = dio->end_io(dio->iocb, offset, ret, dio->private); | ||
260 | if (err) | ||
261 | ret = err; | ||
262 | } | ||
258 | 263 | ||
259 | if (!(dio->flags & DIO_SKIP_DIO_COUNT)) | 264 | if (!(dio->flags & DIO_SKIP_DIO_COUNT)) |
260 | inode_dio_end(dio->inode); | 265 | inode_dio_end(dio->inode); |
@@ -445,7 +450,8 @@ static struct bio *dio_await_one(struct dio *dio) | |||
445 | __set_current_state(TASK_UNINTERRUPTIBLE); | 450 | __set_current_state(TASK_UNINTERRUPTIBLE); |
446 | dio->waiter = current; | 451 | dio->waiter = current; |
447 | spin_unlock_irqrestore(&dio->bio_lock, flags); | 452 | spin_unlock_irqrestore(&dio->bio_lock, flags); |
448 | if (!blk_poll(bdev_get_queue(dio->bio_bdev), dio->bio_cookie)) | 453 | if (!(dio->iocb->ki_flags & IOCB_HIPRI) || |
454 | !blk_poll(bdev_get_queue(dio->bio_bdev), dio->bio_cookie)) | ||
449 | io_schedule(); | 455 | io_schedule(); |
450 | /* wake up sets us TASK_RUNNING */ | 456 | /* wake up sets us TASK_RUNNING */ |
451 | spin_lock_irqsave(&dio->bio_lock, flags); | 457 | spin_lock_irqsave(&dio->bio_lock, flags); |