diff options
author | Josh Durgin <josh.durgin@inktank.com> | 2013-08-26 17:55:38 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-03 22:06:10 -0700 |
commit | 17c1cc1d9293a568a00545469078e29555cc7f39 (patch) | |
tree | f20e923740a3b20fb449bff813ca7438ce00b1e5 /fs/cachefiles | |
parent | 7d6e1f5461d0c16eb6aa8d226976995856d85e4e (diff) | |
download | linux-next-17c1cc1d9293a568a00545469078e29555cc7f39.tar.gz |
rbd: fix I/O error propagation for reads
When a request returns an error, the driver needs to report the entire
extent of the request as completed. Writes already did this, since
they always set xferred = length, but reads were skipping that step if
an error other than -ENOENT occurred. Instead, rbd would end up
passing 0 xferred to blk_end_request(), which would always report
needing more data. This resulted in an assert failing when more data
was required by the block layer, but all the object requests were
done:
[ 1868.719077] rbd: obj_request read result -108 xferred 0
[ 1868.719077]
[ 1868.719518] end_request: I/O error, dev rbd1, sector 0
[ 1868.719739]
[ 1868.719739] Assertion failure in rbd_img_obj_callback() at line 1736:
[ 1868.719739]
[ 1868.719739] rbd_assert(more ^ (which == img_request->obj_request_count));
Without this assert, reads that hit errors would hang forever, since
the block layer considered them incomplete.
Fixes: http://tracker.ceph.com/issues/5647
CC: stable@vger.kernel.org # v3.10
Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
Reviewed-by: Alex Elder <alex.elder@linaro.org>
Diffstat (limited to 'fs/cachefiles')
0 files changed, 0 insertions, 0 deletions