diff --git a/savevm.c b/savevm.c index ab58d63c85..20354a8714 100644 --- a/savevm.c +++ b/savevm.c @@ -1578,12 +1578,13 @@ out: static BlockDriverState *get_bs_snapshots(void) { BlockDriverState *bs; - DriveInfo *dinfo; if (bs_snapshots) return bs_snapshots; - QTAILQ_FOREACH(dinfo, &drives, next) { - bs = dinfo->bdrv; + /* FIXME what if bs_snapshots gets hot-unplugged? */ + + bs = NULL; + while ((bs = bdrv_next(bs))) { if (bdrv_can_snapshot(bs)) { goto ok; } @@ -1622,12 +1623,11 @@ static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info, static int del_existing_snapshots(Monitor *mon, const char *name) { BlockDriverState *bs; - DriveInfo *dinfo; QEMUSnapshotInfo sn1, *snapshot = &sn1; int ret; - QTAILQ_FOREACH(dinfo, &drives, next) { - bs = dinfo->bdrv; + bs = NULL; + while ((bs = bdrv_next(bs))) { if (bdrv_can_snapshot(bs) && bdrv_snapshot_find(bs, snapshot, name) >= 0) { @@ -1646,7 +1646,6 @@ static int del_existing_snapshots(Monitor *mon, const char *name) void do_savevm(Monitor *mon, const QDict *qdict) { - DriveInfo *dinfo; BlockDriverState *bs, *bs1; QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; int ret; @@ -1661,8 +1660,8 @@ void do_savevm(Monitor *mon, const QDict *qdict) const char *name = qdict_get_try_str(qdict, "name"); /* Verify if there is a device that doesn't support snapshots and is writable */ - QTAILQ_FOREACH(dinfo, &drives, next) { - bs = dinfo->bdrv; + bs = NULL; + while ((bs = bdrv_next(bs))) { if (bdrv_is_removable(bs) || bdrv_is_read_only(bs)) { continue; @@ -1730,8 +1729,8 @@ void do_savevm(Monitor *mon, const QDict *qdict) /* create the snapshots */ - QTAILQ_FOREACH(dinfo, &drives, next) { - bs1 = dinfo->bdrv; + bs1 = NULL; + while ((bs1 = bdrv_next(bs1))) { if (bdrv_can_snapshot(bs1)) { /* Write VM state size only to the image that contains the state */ sn->vm_state_size = (bs == bs1 ? vm_state_size : 0); @@ -1750,15 +1749,14 @@ void do_savevm(Monitor *mon, const QDict *qdict) int load_vmstate(const char *name) { - DriveInfo *dinfo; BlockDriverState *bs, *bs1; QEMUSnapshotInfo sn; QEMUFile *f; int ret; /* Verify if there is a device that doesn't support snapshots and is writable */ - QTAILQ_FOREACH(dinfo, &drives, next) { - bs = dinfo->bdrv; + bs = NULL; + while ((bs = bdrv_next(bs))) { if (bdrv_is_removable(bs) || bdrv_is_read_only(bs)) { continue; @@ -1780,8 +1778,8 @@ int load_vmstate(const char *name) /* Flush all IO requests so they don't interfere with the new state. */ qemu_aio_flush(); - QTAILQ_FOREACH(dinfo, &drives, next) { - bs1 = dinfo->bdrv; + bs1 = NULL; + while ((bs1 = bdrv_next(bs1))) { if (bdrv_can_snapshot(bs1)) { ret = bdrv_snapshot_goto(bs1, name); if (ret < 0) { @@ -1831,7 +1829,6 @@ int load_vmstate(const char *name) void do_delvm(Monitor *mon, const QDict *qdict) { - DriveInfo *dinfo; BlockDriverState *bs, *bs1; int ret; const char *name = qdict_get_str(qdict, "name"); @@ -1842,8 +1839,8 @@ void do_delvm(Monitor *mon, const QDict *qdict) return; } - QTAILQ_FOREACH(dinfo, &drives, next) { - bs1 = dinfo->bdrv; + bs1 = NULL; + while ((bs1 = bdrv_next(bs1))) { if (bdrv_can_snapshot(bs1)) { ret = bdrv_snapshot_delete(bs1, name); if (ret < 0) { @@ -1861,7 +1858,6 @@ void do_delvm(Monitor *mon, const QDict *qdict) void do_info_snapshots(Monitor *mon) { - DriveInfo *dinfo; BlockDriverState *bs, *bs1; QEMUSnapshotInfo *sn_tab, *sn; int nb_sns, i; @@ -1873,8 +1869,8 @@ void do_info_snapshots(Monitor *mon) return; } monitor_printf(mon, "Snapshot devices:"); - QTAILQ_FOREACH(dinfo, &drives, next) { - bs1 = dinfo->bdrv; + bs1 = NULL; + while ((bs1 = bdrv_next(bs1))) { if (bdrv_can_snapshot(bs1)) { if (bs == bs1) monitor_printf(mon, " %s", bdrv_get_device_name(bs1));