mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
block: Eliminate BlockDriverState member device_name[]
device_name[] can become non-empty only in bdrv_new_root() and bdrv_move_feature_fields(). The latter is used only to undo damage done by bdrv_swap(). The former is called only by blk_new_with_bs(). Therefore, when a BlockDriverState's device_name[] is non-empty, then it's been created with a BlockBackend, and vice versa. Furthermore, blk_new_with_bs() keeps the two names equal. Therefore, device_name[] is redundant. Eliminate it. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
fea68bb6e9
commit
bfb197e0d9
16 changed files with 55 additions and 48 deletions
49
block.c
49
block.c
|
@ -28,6 +28,7 @@
|
|||
#include "block/blockjob.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qapi/qmp/qjson.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "qemu/notify.h"
|
||||
#include "block/coroutine.h"
|
||||
|
@ -360,9 +361,7 @@ BlockDriverState *bdrv_new_root(const char *device_name, Error **errp)
|
|||
|
||||
bs = bdrv_new();
|
||||
|
||||
pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
|
||||
QTAILQ_INSERT_TAIL(&bdrv_states, bs, device_list);
|
||||
|
||||
return bs;
|
||||
}
|
||||
|
||||
|
@ -1168,7 +1167,7 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
|
|||
} else if (backing_hd) {
|
||||
error_setg(&bs->backing_blocker,
|
||||
"device is used as backing hd of '%s'",
|
||||
bs->device_name);
|
||||
bdrv_get_device_name(bs));
|
||||
}
|
||||
|
||||
bs->backing_hd = backing_hd;
|
||||
|
@ -1542,7 +1541,7 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
|
|||
} else {
|
||||
error_setg(errp, "Block format '%s' used by device '%s' doesn't "
|
||||
"support the option '%s'", drv->format_name,
|
||||
bs->device_name, entry->key);
|
||||
bdrv_get_device_name(bs), entry->key);
|
||||
}
|
||||
|
||||
ret = -EINVAL;
|
||||
|
@ -1749,7 +1748,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
|
|||
if (!(reopen_state->bs->open_flags & BDRV_O_ALLOW_RDWR) &&
|
||||
reopen_state->flags & BDRV_O_RDWR) {
|
||||
error_set(errp, QERR_DEVICE_IS_READ_ONLY,
|
||||
reopen_state->bs->device_name);
|
||||
bdrv_get_device_name(reopen_state->bs));
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -1776,7 +1775,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
|
|||
/* It is currently mandatory to have a bdrv_reopen_prepare()
|
||||
* handler for each supported drv. */
|
||||
error_set(errp, QERR_BLOCK_FORMAT_FEATURE_NOT_SUPPORTED,
|
||||
drv->format_name, reopen_state->bs->device_name,
|
||||
drv->format_name, bdrv_get_device_name(reopen_state->bs),
|
||||
"reopening of file");
|
||||
ret = -1;
|
||||
goto error;
|
||||
|
@ -1964,10 +1963,17 @@ void bdrv_drain_all(void)
|
|||
Also, NULL terminate the device_name to prevent double remove */
|
||||
void bdrv_make_anon(BlockDriverState *bs)
|
||||
{
|
||||
if (bs->device_name[0] != '\0') {
|
||||
/*
|
||||
* Take care to remove bs from bdrv_states only when it's actually
|
||||
* in it. Note that bs->device_list.tqe_prev is initially null,
|
||||
* and gets set to non-null by QTAILQ_INSERT_TAIL(). Establish
|
||||
* the useful invariant "bs in bdrv_states iff bs->tqe_prev" by
|
||||
* resetting it to null on remove.
|
||||
*/
|
||||
if (bs->device_list.tqe_prev) {
|
||||
QTAILQ_REMOVE(&bdrv_states, bs, device_list);
|
||||
bs->device_list.tqe_prev = NULL;
|
||||
}
|
||||
bs->device_name[0] = '\0';
|
||||
if (bs->node_name[0] != '\0') {
|
||||
QTAILQ_REMOVE(&graph_bdrv_states, bs, node_list);
|
||||
}
|
||||
|
@ -2021,8 +2027,6 @@ static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
|
|||
bs_dest->job = bs_src->job;
|
||||
|
||||
/* keep the same entry in bdrv_states */
|
||||
pstrcpy(bs_dest->device_name, sizeof(bs_dest->device_name),
|
||||
bs_src->device_name);
|
||||
bs_dest->device_list = bs_src->device_list;
|
||||
bs_dest->blk = bs_src->blk;
|
||||
|
||||
|
@ -2038,7 +2042,7 @@ static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
|
|||
* This will modify the BlockDriverState fields, and swap contents
|
||||
* between bs_new and bs_old. Both bs_new and bs_old are modified.
|
||||
*
|
||||
* bs_new must be nameless and not attached to a BlockBackend.
|
||||
* bs_new must not be attached to a BlockBackend.
|
||||
*
|
||||
* This function does not create any image files.
|
||||
*/
|
||||
|
@ -2057,8 +2061,7 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
|
|||
QTAILQ_REMOVE(&graph_bdrv_states, bs_old, node_list);
|
||||
}
|
||||
|
||||
/* bs_new must be nameless and shouldn't have anything fancy enabled */
|
||||
assert(bs_new->device_name[0] == '\0');
|
||||
/* bs_new must be unattached and shouldn't have anything fancy enabled */
|
||||
assert(!bs_new->blk);
|
||||
assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
|
||||
assert(bs_new->job == NULL);
|
||||
|
@ -2075,8 +2078,7 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
|
|||
bdrv_move_feature_fields(bs_old, bs_new);
|
||||
bdrv_move_feature_fields(bs_new, &tmp);
|
||||
|
||||
/* bs_new must remain nameless and unattached */
|
||||
assert(bs_new->device_name[0] == '\0');
|
||||
/* bs_new must remain unattached */
|
||||
assert(!bs_new->blk);
|
||||
|
||||
/* Check a few fields that should remain attached to the device */
|
||||
|
@ -2104,7 +2106,7 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
|
|||
* This will modify the BlockDriverState fields, and swap contents
|
||||
* between bs_new and bs_top. Both bs_new and bs_top are modified.
|
||||
*
|
||||
* bs_new must be nameless and not attached to a BlockBackend.
|
||||
* bs_new must not be attached to a BlockBackend.
|
||||
*
|
||||
* This function does not create any image files.
|
||||
*/
|
||||
|
@ -3820,7 +3822,7 @@ BlockDriverState *bdrv_find(const char *name)
|
|||
BlockDriverState *bs;
|
||||
|
||||
QTAILQ_FOREACH(bs, &bdrv_states, device_list) {
|
||||
if (!strcmp(name, bs->device_name)) {
|
||||
if (!strcmp(name, bdrv_get_device_name(bs))) {
|
||||
return bs;
|
||||
}
|
||||
}
|
||||
|
@ -3906,9 +3908,9 @@ BlockDriverState *bdrv_next(BlockDriverState *bs)
|
|||
return QTAILQ_NEXT(bs, device_list);
|
||||
}
|
||||
|
||||
const char *bdrv_get_device_name(BlockDriverState *bs)
|
||||
const char *bdrv_get_device_name(const BlockDriverState *bs)
|
||||
{
|
||||
return bs->device_name;
|
||||
return bs->blk ? blk_name(bs->blk) : "";
|
||||
}
|
||||
|
||||
int bdrv_get_flags(BlockDriverState *bs)
|
||||
|
@ -5262,13 +5264,15 @@ int bdrv_media_changed(BlockDriverState *bs)
|
|||
void bdrv_eject(BlockDriverState *bs, bool eject_flag)
|
||||
{
|
||||
BlockDriver *drv = bs->drv;
|
||||
const char *device_name;
|
||||
|
||||
if (drv && drv->bdrv_eject) {
|
||||
drv->bdrv_eject(bs, eject_flag);
|
||||
}
|
||||
|
||||
if (bs->device_name[0] != '\0') {
|
||||
qapi_event_send_device_tray_moved(bdrv_get_device_name(bs),
|
||||
device_name = bdrv_get_device_name(bs);
|
||||
if (device_name[0] != '\0') {
|
||||
qapi_event_send_device_tray_moved(device_name,
|
||||
eject_flag, &error_abort);
|
||||
}
|
||||
}
|
||||
|
@ -5478,7 +5482,8 @@ bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp)
|
|||
blocker = QLIST_FIRST(&bs->op_blockers[op]);
|
||||
if (errp) {
|
||||
error_setg(errp, "Device '%s' is busy: %s",
|
||||
bs->device_name, error_get_pretty(blocker->reason));
|
||||
bdrv_get_device_name(bs),
|
||||
error_get_pretty(blocker->reason));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue