mirror of https://github.com/xemu-project/xemu.git
block: Mark bdrv_co_get_info() and callers GRAPH_RDLOCK
This adds GRAPH_RDLOCK annotations to declare that callers of bdrv_co_get_info() need to hold a reader lock for the graph. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20230504115750.54437-15-kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
de335638a3
commit
a00e70c012
2
block.c
2
block.c
|
@ -6349,6 +6349,8 @@ int coroutine_fn bdrv_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||||
int ret;
|
int ret;
|
||||||
BlockDriver *drv = bs->drv;
|
BlockDriver *drv = bs->drv;
|
||||||
IO_CODE();
|
IO_CODE();
|
||||||
|
assert_bdrv_graph_readable();
|
||||||
|
|
||||||
/* if bs->drv == NULL, bs is closed, so there's nothing to do here */
|
/* if bs->drv == NULL, bs is closed, so there's nothing to do here */
|
||||||
if (!drv) {
|
if (!drv) {
|
||||||
return -ENOMEDIUM;
|
return -ENOMEDIUM;
|
||||||
|
|
|
@ -736,7 +736,7 @@ fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int coroutine_fn
|
static int coroutine_fn GRAPH_RDLOCK
|
||||||
block_crypto_co_get_info_luks(BlockDriverState *bs, BlockDriverInfo *bdi)
|
block_crypto_co_get_info_luks(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||||
{
|
{
|
||||||
BlockDriverInfo subbdi;
|
BlockDriverInfo subbdi;
|
||||||
|
|
11
block/io.c
11
block/io.c
|
@ -727,10 +727,9 @@ BdrvTrackedRequest *coroutine_fn bdrv_co_get_self_request(BlockDriverState *bs)
|
||||||
/**
|
/**
|
||||||
* Round a region to cluster boundaries
|
* Round a region to cluster boundaries
|
||||||
*/
|
*/
|
||||||
void coroutine_fn bdrv_round_to_clusters(BlockDriverState *bs,
|
void coroutine_fn GRAPH_RDLOCK
|
||||||
int64_t offset, int64_t bytes,
|
bdrv_round_to_clusters(BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||||
int64_t *cluster_offset,
|
int64_t *cluster_offset, int64_t *cluster_bytes)
|
||||||
int64_t *cluster_bytes)
|
|
||||||
{
|
{
|
||||||
BlockDriverInfo bdi;
|
BlockDriverInfo bdi;
|
||||||
IO_CODE();
|
IO_CODE();
|
||||||
|
@ -744,7 +743,7 @@ void coroutine_fn bdrv_round_to_clusters(BlockDriverState *bs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static coroutine_fn int bdrv_get_cluster_size(BlockDriverState *bs)
|
static int coroutine_fn GRAPH_RDLOCK bdrv_get_cluster_size(BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
BlockDriverInfo bdi;
|
BlockDriverInfo bdi;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1800,7 +1799,7 @@ fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int coroutine_fn
|
static inline int coroutine_fn GRAPH_RDLOCK
|
||||||
bdrv_co_write_req_prepare(BdrvChild *child, int64_t offset, int64_t bytes,
|
bdrv_co_write_req_prepare(BdrvChild *child, int64_t offset, int64_t bytes,
|
||||||
BdrvTrackedRequest *req, int flags)
|
BdrvTrackedRequest *req, int flags)
|
||||||
{
|
{
|
||||||
|
|
|
@ -576,8 +576,10 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
|
||||||
} else if (ret >= 0 && !(ret & BDRV_BLOCK_DATA)) {
|
} else if (ret >= 0 && !(ret & BDRV_BLOCK_DATA)) {
|
||||||
int64_t target_offset;
|
int64_t target_offset;
|
||||||
int64_t target_bytes;
|
int64_t target_bytes;
|
||||||
|
WITH_GRAPH_RDLOCK_GUARD() {
|
||||||
bdrv_round_to_clusters(blk_bs(s->target), offset, io_bytes,
|
bdrv_round_to_clusters(blk_bs(s->target), offset, io_bytes,
|
||||||
&target_offset, &target_bytes);
|
&target_offset, &target_bytes);
|
||||||
|
}
|
||||||
if (target_offset == offset &&
|
if (target_offset == offset &&
|
||||||
target_bytes == io_bytes) {
|
target_bytes == io_bytes) {
|
||||||
mirror_method = ret & BDRV_BLOCK_ZERO ?
|
mirror_method = ret & BDRV_BLOCK_ZERO ?
|
||||||
|
@ -966,11 +968,13 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
|
||||||
*/
|
*/
|
||||||
bdrv_get_backing_filename(target_bs, backing_filename,
|
bdrv_get_backing_filename(target_bs, backing_filename,
|
||||||
sizeof(backing_filename));
|
sizeof(backing_filename));
|
||||||
|
bdrv_graph_co_rdlock();
|
||||||
if (!bdrv_co_get_info(target_bs, &bdi) && bdi.cluster_size) {
|
if (!bdrv_co_get_info(target_bs, &bdi) && bdi.cluster_size) {
|
||||||
s->target_cluster_size = bdi.cluster_size;
|
s->target_cluster_size = bdi.cluster_size;
|
||||||
} else {
|
} else {
|
||||||
s->target_cluster_size = BDRV_SECTOR_SIZE;
|
s->target_cluster_size = BDRV_SECTOR_SIZE;
|
||||||
}
|
}
|
||||||
|
bdrv_graph_co_rdunlock();
|
||||||
if (backing_filename[0] && !bdrv_backing_chain_next(target_bs) &&
|
if (backing_filename[0] && !bdrv_backing_chain_next(target_bs) &&
|
||||||
s->granularity < s->target_cluster_size) {
|
s->granularity < s->target_cluster_size) {
|
||||||
s->buf_size = MAX(s->buf_size, s->target_cluster_size);
|
s->buf_size = MAX(s->buf_size, s->target_cluster_size);
|
||||||
|
|
|
@ -369,7 +369,7 @@ static BlockMeasureInfo *raw_measure(QemuOpts *opts, BlockDriverState *in_bs,
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int coroutine_fn
|
static int coroutine_fn GRAPH_RDLOCK
|
||||||
raw_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
raw_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||||
{
|
{
|
||||||
return bdrv_co_get_info(bs->file->bs, bdi);
|
return bdrv_co_get_info(bs->file->bs, bdi);
|
||||||
|
|
|
@ -167,8 +167,11 @@ const char *bdrv_get_node_name(const BlockDriverState *bs);
|
||||||
const char *bdrv_get_device_name(const BlockDriverState *bs);
|
const char *bdrv_get_device_name(const BlockDriverState *bs);
|
||||||
const char *bdrv_get_device_or_node_name(const BlockDriverState *bs);
|
const char *bdrv_get_device_or_node_name(const BlockDriverState *bs);
|
||||||
|
|
||||||
int coroutine_fn bdrv_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
int coroutine_fn GRAPH_RDLOCK
|
||||||
int co_wrapper_mixed bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
bdrv_co_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
|
|
||||||
|
int co_wrapper_mixed_bdrv_rdlock
|
||||||
|
bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
|
|
||||||
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs,
|
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
|
@ -699,8 +699,8 @@ struct BlockDriver {
|
||||||
BlockDriverState *bs, int64_t offset, int64_t bytes,
|
BlockDriverState *bs, int64_t offset, int64_t bytes,
|
||||||
QEMUIOVector *qiov, size_t qiov_offset);
|
QEMUIOVector *qiov, size_t qiov_offset);
|
||||||
|
|
||||||
int coroutine_fn (*bdrv_co_get_info)(BlockDriverState *bs,
|
int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_get_info)(
|
||||||
BlockDriverInfo *bdi);
|
BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
|
|
||||||
ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs,
|
ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
Loading…
Reference in New Issue