• Josh Durgin's avatar
    rbd: fix I/O error propagation for reads · 17c1cc1d
    Josh Durgin authored
    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: default avatarJosh Durgin <josh.durgin@inktank.com>
    Reviewed-by: default avatarAlex Elder <alex.elder@linaro.org>
    17c1cc1d
rbd.c 135 KB