mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
block: Mark bdrv_skip_filters() and callers GRAPH_RDLOCK
This adds GRAPH_RDLOCK annotations to declare that callers of bdrv_skip_filters() need to hold a reader lock for the graph because it calls bdrv_filter_child(), which accesses bs->file/backing. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20231027155333.420094-9-kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
430da832af
commit
ad74751fc0
9 changed files with 77 additions and 31 deletions
18
qemu-img.c
18
qemu-img.c
|
@ -1050,12 +1050,14 @@ static int img_commit(int argc, char **argv)
|
|||
qemu_progress_init(progress, 1.f);
|
||||
qemu_progress_print(0.f, 100);
|
||||
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
if (base) {
|
||||
base_bs = bdrv_find_backing_image(bs, base);
|
||||
if (!base_bs) {
|
||||
error_setg(&local_err,
|
||||
"Did not find '%s' in the backing chain of '%s'",
|
||||
base, filename);
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
goto done;
|
||||
}
|
||||
} else {
|
||||
|
@ -1065,9 +1067,11 @@ static int img_commit(int argc, char **argv)
|
|||
base_bs = bdrv_backing_chain_next(bs);
|
||||
if (!base_bs) {
|
||||
error_setg(&local_err, "Image does not have a backing file");
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
|
||||
cbi = (CommonBlockJobCBInfo){
|
||||
.errp = &local_err,
|
||||
|
@ -1713,7 +1717,8 @@ static void convert_select_part(ImgConvertState *s, int64_t sector_num,
|
|||
}
|
||||
}
|
||||
|
||||
static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
|
||||
static int coroutine_mixed_fn GRAPH_RDLOCK
|
||||
convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
|
||||
{
|
||||
int64_t src_cur_offset;
|
||||
int ret, n, src_cur;
|
||||
|
@ -2115,7 +2120,9 @@ static int convert_do_copy(ImgConvertState *s)
|
|||
}
|
||||
|
||||
while (sector_num < s->total_sectors) {
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
n = convert_iteration_sectors(s, sector_num);
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
if (n < 0) {
|
||||
return n;
|
||||
}
|
||||
|
@ -2757,8 +2764,10 @@ static int img_convert(int argc, char **argv)
|
|||
* s.target_backing_sectors has to be negative, which it will
|
||||
* be automatically). The backing file length is used only
|
||||
* for optimizations, so such a case is not fatal. */
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
s.target_backing_sectors =
|
||||
bdrv_nb_sectors(bdrv_backing_chain_next(out_bs));
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
} else {
|
||||
s.target_backing_sectors = -1;
|
||||
}
|
||||
|
@ -3145,6 +3154,9 @@ static int get_block_status(BlockDriverState *bs, int64_t offset,
|
|||
int64_t map;
|
||||
char *filename = NULL;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
|
||||
/* As an optimization, we could cache the current range of unallocated
|
||||
* clusters in each file of the chain, and avoid querying the same
|
||||
* range repeatedly.
|
||||
|
@ -3173,9 +3185,7 @@ static int get_block_status(BlockDriverState *bs, int64_t offset,
|
|||
has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID);
|
||||
|
||||
if (file && has_offset) {
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
bdrv_refresh_filename(file);
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
filename = file->filename;
|
||||
}
|
||||
|
||||
|
@ -3663,7 +3673,9 @@ static int img_rebase(int argc, char **argv)
|
|||
}
|
||||
bs = blk_bs(blk);
|
||||
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
unfiltered_bs = bdrv_skip_filters(bs);
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
|
||||
if (compress && !block_driver_can_compress(unfiltered_bs->drv)) {
|
||||
error_report("Compression not supported for this file format");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue