mirror of
https://github.com/mii443/qemu.git
synced 2025-12-03 11:08:25 +00:00
block: Allow NULL file for bdrv_get_block_status()
Not all callers care about which BDS owns the mapping for a given range of the file. This patch merely simplifies the callers by consolidating the logic in the common call point, while guaranteeing a non-NULL file to all the driver callbacks, for no semantic change. The only caller that does not care about pnum is bdrv_is_allocated, as invoked by vvfat; we can likewise add assertions that the rest of the stack does not have to worry about a NULL pnum. Furthermore, this will also set the stage for a future cleanup: when a caller does not care about which BDS owns an offset, it would be nice to allow the driver to optimize things to not have to return BDRV_BLOCK_OFFSET_VALID in the first place. In the case of fragmented allocation (for example, it's fairly easy to create a qcow2 image where consecutive guest addresses are not at consecutive host addresses), the current contract requires bdrv_get_block_status() to clamp *pnum to the limit where host addresses are no longer consecutive, but allowing a NULL file means that *pnum could be set to the full length of known-allocated data. Signed-off-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
10
qemu-img.c
10
qemu-img.c
@@ -1375,7 +1375,6 @@ static int img_compare(int argc, char **argv)
|
||||
|
||||
for (;;) {
|
||||
int64_t status1, status2;
|
||||
BlockDriverState *file;
|
||||
|
||||
nb_sectors = sectors_to_process(total_sectors, sector_num);
|
||||
if (nb_sectors <= 0) {
|
||||
@@ -1383,7 +1382,7 @@ static int img_compare(int argc, char **argv)
|
||||
}
|
||||
status1 = bdrv_get_block_status_above(bs1, NULL, sector_num,
|
||||
total_sectors1 - sector_num,
|
||||
&pnum1, &file);
|
||||
&pnum1, NULL);
|
||||
if (status1 < 0) {
|
||||
ret = 3;
|
||||
error_report("Sector allocation test failed for %s", filename1);
|
||||
@@ -1393,7 +1392,7 @@ static int img_compare(int argc, char **argv)
|
||||
|
||||
status2 = bdrv_get_block_status_above(bs2, NULL, sector_num,
|
||||
total_sectors2 - sector_num,
|
||||
&pnum2, &file);
|
||||
&pnum2, NULL);
|
||||
if (status2 < 0) {
|
||||
ret = 3;
|
||||
error_report("Sector allocation test failed for %s", filename2);
|
||||
@@ -1599,15 +1598,14 @@ static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
|
||||
n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS);
|
||||
|
||||
if (s->sector_next_status <= sector_num) {
|
||||
BlockDriverState *file;
|
||||
if (s->target_has_backing) {
|
||||
ret = bdrv_get_block_status(blk_bs(s->src[src_cur]),
|
||||
sector_num - src_cur_offset,
|
||||
n, &n, &file);
|
||||
n, &n, NULL);
|
||||
} else {
|
||||
ret = bdrv_get_block_status_above(blk_bs(s->src[src_cur]), NULL,
|
||||
sector_num - src_cur_offset,
|
||||
n, &n, &file);
|
||||
n, &n, NULL);
|
||||
}
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user