aboutsummaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r--fs/direct-io.c12
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);