diff options
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 18 |
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 | ||