block: drop bs_snapshots global variable
The bs_snapshots global variable points to the BlockDriverState which will be used to save vmstate. This is really a savevm.c concept but was moved into block.c:bdrv_snapshots() when it became clear that hotplug could result in a dangling pointer. While auditing the block layer's global state I came upon bs_snapshots and realized that a variable is not necessary here. Simply find the first BlockDriverState capable of internal snapshots each time this is needed. The behavior of bdrv_snapshots() is preserved across hotplug because new drives are always appended to the bdrv_states list. This means that calling the new find_vmstate_bs() function is idempotent - it returns the same BlockDriverState unless it was hot-unplugged. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
2499a096a2
commit
29d782710f
28
block.c
28
block.c
@ -99,9 +99,6 @@ static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
|
||||
static QLIST_HEAD(, BlockDriver) bdrv_drivers =
|
||||
QLIST_HEAD_INITIALIZER(bdrv_drivers);
|
||||
|
||||
/* The device to use for VM snapshots */
|
||||
static BlockDriverState *bs_snapshots;
|
||||
|
||||
/* If non-zero, use only whitelisted block drivers */
|
||||
static int use_bdrv_whitelist;
|
||||
|
||||
@ -1368,9 +1365,6 @@ void bdrv_close(BlockDriverState *bs)
|
||||
notifier_list_notify(&bs->close_notifiers, bs);
|
||||
|
||||
if (bs->drv) {
|
||||
if (bs == bs_snapshots) {
|
||||
bs_snapshots = NULL;
|
||||
}
|
||||
if (bs->backing_hd) {
|
||||
bdrv_delete(bs->backing_hd);
|
||||
bs->backing_hd = NULL;
|
||||
@ -1602,7 +1596,6 @@ void bdrv_delete(BlockDriverState *bs)
|
||||
|
||||
bdrv_close(bs);
|
||||
|
||||
assert(bs != bs_snapshots);
|
||||
g_free(bs);
|
||||
}
|
||||
|
||||
@ -1646,9 +1639,6 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
|
||||
{
|
||||
bs->dev_ops = ops;
|
||||
bs->dev_opaque = opaque;
|
||||
if (bdrv_dev_has_removable_media(bs) && bs == bs_snapshots) {
|
||||
bs_snapshots = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv,
|
||||
@ -3392,24 +3382,6 @@ int bdrv_is_snapshot(BlockDriverState *bs)
|
||||
return !!(bs->open_flags & BDRV_O_SNAPSHOT);
|
||||
}
|
||||
|
||||
BlockDriverState *bdrv_snapshots(void)
|
||||
{
|
||||
BlockDriverState *bs;
|
||||
|
||||
if (bs_snapshots) {
|
||||
return bs_snapshots;
|
||||
}
|
||||
|
||||
bs = NULL;
|
||||
while ((bs = bdrv_next(bs))) {
|
||||
if (bdrv_can_snapshot(bs)) {
|
||||
bs_snapshots = bs;
|
||||
return bs;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int bdrv_snapshot_create(BlockDriverState *bs,
|
||||
QEMUSnapshotInfo *sn_info)
|
||||
{
|
||||
|
@ -333,7 +333,6 @@ BlockInfo *bdrv_query_info(BlockDriverState *s);
|
||||
BlockStats *bdrv_query_stats(const BlockDriverState *bs);
|
||||
int bdrv_can_snapshot(BlockDriverState *bs);
|
||||
int bdrv_is_snapshot(BlockDriverState *bs);
|
||||
BlockDriverState *bdrv_snapshots(void);
|
||||
int bdrv_snapshot_create(BlockDriverState *bs,
|
||||
QEMUSnapshotInfo *sn_info);
|
||||
int bdrv_snapshot_goto(BlockDriverState *bs,
|
||||
|
19
savevm.c
19
savevm.c
@ -2262,6 +2262,17 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static BlockDriverState *find_vmstate_bs(void)
|
||||
{
|
||||
BlockDriverState *bs = NULL;
|
||||
while ((bs = bdrv_next(bs))) {
|
||||
if (bdrv_can_snapshot(bs)) {
|
||||
return bs;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
|
||||
const char *name)
|
||||
{
|
||||
@ -2338,7 +2349,7 @@ void do_savevm(Monitor *mon, const QDict *qdict)
|
||||
}
|
||||
}
|
||||
|
||||
bs = bdrv_snapshots();
|
||||
bs = find_vmstate_bs();
|
||||
if (!bs) {
|
||||
monitor_printf(mon, "No block device can accept snapshots\n");
|
||||
return;
|
||||
@ -2440,7 +2451,7 @@ int load_vmstate(const char *name)
|
||||
QEMUFile *f;
|
||||
int ret;
|
||||
|
||||
bs_vm_state = bdrv_snapshots();
|
||||
bs_vm_state = find_vmstate_bs();
|
||||
if (!bs_vm_state) {
|
||||
error_report("No block device supports snapshots");
|
||||
return -ENOTSUP;
|
||||
@ -2519,7 +2530,7 @@ void do_delvm(Monitor *mon, const QDict *qdict)
|
||||
int ret;
|
||||
const char *name = qdict_get_str(qdict, "name");
|
||||
|
||||
bs = bdrv_snapshots();
|
||||
bs = find_vmstate_bs();
|
||||
if (!bs) {
|
||||
monitor_printf(mon, "No block device supports snapshots\n");
|
||||
return;
|
||||
@ -2551,7 +2562,7 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict)
|
||||
int *available_snapshots;
|
||||
char buf[256];
|
||||
|
||||
bs = bdrv_snapshots();
|
||||
bs = find_vmstate_bs();
|
||||
if (!bs) {
|
||||
monitor_printf(mon, "No available block device supports snapshots\n");
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user