提交 29d78271 编写于 作者: S Stefan Hajnoczi 提交者: Kevin Wolf

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: NStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Reviewed-by: NWenchao Xia <xiawenc@linux.vnet.ibm.com>
Signed-off-by: NWenchao Xia <xiawenc@linux.vnet.ibm.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 2499a096
...@@ -99,9 +99,6 @@ static QTAILQ_HEAD(, BlockDriverState) bdrv_states = ...@@ -99,9 +99,6 @@ static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
static QLIST_HEAD(, BlockDriver) bdrv_drivers = static QLIST_HEAD(, BlockDriver) bdrv_drivers =
QLIST_HEAD_INITIALIZER(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 */ /* If non-zero, use only whitelisted block drivers */
static int use_bdrv_whitelist; static int use_bdrv_whitelist;
...@@ -1368,9 +1365,6 @@ void bdrv_close(BlockDriverState *bs) ...@@ -1368,9 +1365,6 @@ void bdrv_close(BlockDriverState *bs)
notifier_list_notify(&bs->close_notifiers, bs); notifier_list_notify(&bs->close_notifiers, bs);
if (bs->drv) { if (bs->drv) {
if (bs == bs_snapshots) {
bs_snapshots = NULL;
}
if (bs->backing_hd) { if (bs->backing_hd) {
bdrv_delete(bs->backing_hd); bdrv_delete(bs->backing_hd);
bs->backing_hd = NULL; bs->backing_hd = NULL;
...@@ -1602,7 +1596,6 @@ void bdrv_delete(BlockDriverState *bs) ...@@ -1602,7 +1596,6 @@ void bdrv_delete(BlockDriverState *bs)
bdrv_close(bs); bdrv_close(bs);
assert(bs != bs_snapshots);
g_free(bs); g_free(bs);
} }
...@@ -1646,9 +1639,6 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops, ...@@ -1646,9 +1639,6 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops,
{ {
bs->dev_ops = ops; bs->dev_ops = ops;
bs->dev_opaque = opaque; 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, void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv,
...@@ -3392,24 +3382,6 @@ int bdrv_is_snapshot(BlockDriverState *bs) ...@@ -3392,24 +3382,6 @@ int bdrv_is_snapshot(BlockDriverState *bs)
return !!(bs->open_flags & BDRV_O_SNAPSHOT); 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, int bdrv_snapshot_create(BlockDriverState *bs,
QEMUSnapshotInfo *sn_info) QEMUSnapshotInfo *sn_info)
{ {
......
...@@ -333,7 +333,6 @@ BlockInfo *bdrv_query_info(BlockDriverState *s); ...@@ -333,7 +333,6 @@ BlockInfo *bdrv_query_info(BlockDriverState *s);
BlockStats *bdrv_query_stats(const BlockDriverState *bs); BlockStats *bdrv_query_stats(const BlockDriverState *bs);
int bdrv_can_snapshot(BlockDriverState *bs); int bdrv_can_snapshot(BlockDriverState *bs);
int bdrv_is_snapshot(BlockDriverState *bs); int bdrv_is_snapshot(BlockDriverState *bs);
BlockDriverState *bdrv_snapshots(void);
int bdrv_snapshot_create(BlockDriverState *bs, int bdrv_snapshot_create(BlockDriverState *bs,
QEMUSnapshotInfo *sn_info); QEMUSnapshotInfo *sn_info);
int bdrv_snapshot_goto(BlockDriverState *bs, int bdrv_snapshot_goto(BlockDriverState *bs,
......
...@@ -2262,6 +2262,17 @@ out: ...@@ -2262,6 +2262,17 @@ out:
return ret; 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, static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
const char *name) const char *name)
{ {
...@@ -2338,7 +2349,7 @@ void do_savevm(Monitor *mon, const QDict *qdict) ...@@ -2338,7 +2349,7 @@ void do_savevm(Monitor *mon, const QDict *qdict)
} }
} }
bs = bdrv_snapshots(); bs = find_vmstate_bs();
if (!bs) { if (!bs) {
monitor_printf(mon, "No block device can accept snapshots\n"); monitor_printf(mon, "No block device can accept snapshots\n");
return; return;
...@@ -2440,7 +2451,7 @@ int load_vmstate(const char *name) ...@@ -2440,7 +2451,7 @@ int load_vmstate(const char *name)
QEMUFile *f; QEMUFile *f;
int ret; int ret;
bs_vm_state = bdrv_snapshots(); bs_vm_state = find_vmstate_bs();
if (!bs_vm_state) { if (!bs_vm_state) {
error_report("No block device supports snapshots"); error_report("No block device supports snapshots");
return -ENOTSUP; return -ENOTSUP;
...@@ -2519,7 +2530,7 @@ void do_delvm(Monitor *mon, const QDict *qdict) ...@@ -2519,7 +2530,7 @@ void do_delvm(Monitor *mon, const QDict *qdict)
int ret; int ret;
const char *name = qdict_get_str(qdict, "name"); const char *name = qdict_get_str(qdict, "name");
bs = bdrv_snapshots(); bs = find_vmstate_bs();
if (!bs) { if (!bs) {
monitor_printf(mon, "No block device supports snapshots\n"); monitor_printf(mon, "No block device supports snapshots\n");
return; return;
...@@ -2551,7 +2562,7 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict) ...@@ -2551,7 +2562,7 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict)
int *available_snapshots; int *available_snapshots;
char buf[256]; char buf[256];
bs = bdrv_snapshots(); bs = find_vmstate_bs();
if (!bs) { if (!bs) {
monitor_printf(mon, "No available block device supports snapshots\n"); monitor_printf(mon, "No available block device supports snapshots\n");
return; return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册