Commit bbf0ea7e authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba

btrfs: fix lost error return value when reading a data page

At btrfs_do_readpage(), if we get an error when trying to lookup for an
extent map, we end up marking the page with the error bit, clearing
the uptodate bit on it, and doing everything else that should be done.
However we return success (0) to the caller, when we should return the
error encoded in the extent map pointer. So fix that by returning the
error encoded in the pointer.
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent c0347550
...@@ -3611,6 +3611,7 @@ int btrfs_do_readpage(struct page *page, struct extent_map **em_cached, ...@@ -3611,6 +3611,7 @@ int btrfs_do_readpage(struct page *page, struct extent_map **em_cached,
if (IS_ERR(em)) { if (IS_ERR(em)) {
unlock_extent(tree, cur, end); unlock_extent(tree, cur, end);
end_page_read(page, false, cur, end + 1 - cur); end_page_read(page, false, cur, end + 1 - cur);
ret = PTR_ERR(em);
break; break;
} }
extent_offset = cur - em->start; extent_offset = cur - em->start;
......
...@@ -8118,8 +8118,13 @@ int btrfs_readpage(struct file *file, struct page *page) ...@@ -8118,8 +8118,13 @@ int btrfs_readpage(struct file *file, struct page *page)
btrfs_lock_and_flush_ordered_range(inode, start, end, NULL); btrfs_lock_and_flush_ordered_range(inode, start, end, NULL);
ret = btrfs_do_readpage(page, NULL, &bio_ctrl, 0, NULL); ret = btrfs_do_readpage(page, NULL, &bio_ctrl, 0, NULL);
if (bio_ctrl.bio) if (bio_ctrl.bio) {
ret = submit_one_bio(bio_ctrl.bio, 0, bio_ctrl.bio_flags); int ret2;
ret2 = submit_one_bio(bio_ctrl.bio, 0, bio_ctrl.bio_flags);
if (ret == 0)
ret = ret2;
}
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment