raw_co_get_block_status() should return 0 and set *pnum to 0 after the EOF; currently it does this merely by accident, so implement it directly. Also, nb_sectors should be clamped against the image end.
While doing that, centralize the generation of raw_co_get_block_status()'s return value along the way. v3: - Patch 1: - Remove the whole ENXIO assert(), just return -errno. ENXIO is not a very useful message for the user, but it's better than a broken assertion for sure (and there is no good way of returning 0 and setting *pnum to 0 as well, because this would mean acknowledging the new size of the file and we'd have to update its length in the BDS, etc. pp.; just return ENXIO and be done with it) [Kevin] - bdrv_getlength() may fail [Kevin] - Patch 2: Remove the pnum parameter from try_fiemap() and try_seek_hole(), it isn't used anyway - Patch 3: Added. git-backport-diff against v2: Key: [----] : patches are identical [####] : number of functional differences between upstream/downstream patch [down] : patch is downstream-only The flags [FC] indicate (F)unctional and (C)ontextual differences, respectively 001/3:[0008] [FC] 'raw-posix: Fix raw_co_get_block_status() after EOF' 002/3:[0008] [FC] 'raw-posix: raw_co_get_block_status() return value' 003/3:[down] 'iotests: Add test for external image truncation' Max Reitz (3): raw-posix: Fix raw_co_get_block_status() after EOF raw-posix: raw_co_get_block_status() return value iotests: Add test for external image truncation block/raw-posix.c | 42 ++++++++++++++++++++++++------------------ tests/qemu-iotests/102 | 15 +++++++++++++++ tests/qemu-iotests/102.out | 9 +++++++++ 3 files changed, 48 insertions(+), 18 deletions(-) -- 1.9.3