summaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r--fs/block_dev.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index c1dc393ad6b9..bcd8e16a34e1 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -262,8 +262,8 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
262 if (vecs != inline_vecs) 262 if (vecs != inline_vecs)
263 kfree(vecs); 263 kfree(vecs);
264 264
265 if (unlikely(bio.bi_error)) 265 if (unlikely(bio.bi_status))
266 return bio.bi_error; 266 return blk_status_to_errno(bio.bi_status);
267 return ret; 267 return ret;
268} 268}
269 269
@@ -288,16 +288,18 @@ static void blkdev_bio_end_io(struct bio *bio)
288 bool should_dirty = dio->should_dirty; 288 bool should_dirty = dio->should_dirty;
289 289
290 if (dio->multi_bio && !atomic_dec_and_test(&dio->ref)) { 290 if (dio->multi_bio && !atomic_dec_and_test(&dio->ref)) {
291 if (bio->bi_error && !dio->bio.bi_error) 291 if (bio->bi_status && !dio->bio.bi_status)
292 dio->bio.bi_error = bio->bi_error; 292 dio->bio.bi_status = bio->bi_status;
293 } else { 293 } else {
294 if (!dio->is_sync) { 294 if (!dio->is_sync) {
295 struct kiocb *iocb = dio->iocb; 295 struct kiocb *iocb = dio->iocb;
296 ssize_t ret = dio->bio.bi_error; 296 ssize_t ret;
297 297
298 if (likely(!ret)) { 298 if (likely(!dio->bio.bi_status)) {
299 ret = dio->size; 299 ret = dio->size;
300 iocb->ki_pos += ret; 300 iocb->ki_pos += ret;
301 } else {
302 ret = blk_status_to_errno(dio->bio.bi_status);
301 } 303 }
302 304
303 dio->iocb->ki_complete(iocb, ret, 0); 305 dio->iocb->ki_complete(iocb, ret, 0);
@@ -363,7 +365,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
363 365
364 ret = bio_iov_iter_get_pages(bio, iter); 366 ret = bio_iov_iter_get_pages(bio, iter);
365 if (unlikely(ret)) { 367 if (unlikely(ret)) {
366 bio->bi_error = -EIO; 368 bio->bi_status = BLK_STS_IOERR;
367 bio_endio(bio); 369 bio_endio(bio);
368 break; 370 break;
369 } 371 }
@@ -413,7 +415,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
413 __set_current_state(TASK_RUNNING); 415 __set_current_state(TASK_RUNNING);
414 416
415 if (!ret) 417 if (!ret)
416 ret = dio->bio.bi_error; 418 ret = blk_status_to_errno(dio->bio.bi_status);
417 if (likely(!ret)) 419 if (likely(!ret))
418 ret = dio->size; 420 ret = dio->size;
419 421