Index: xen-3.3.1-testing/tools/ioemu-remote/xenstore.c =================================================================== --- xen-3.3.1-testing.orig/tools/ioemu-remote/xenstore.c +++ xen-3.3.1-testing/tools/ioemu-remote/xenstore.c @@ -671,6 +671,18 @@ static void xenstore_process_dm_command_ } snapshot_name = xs_read(xsh, XBT_NULL, path, &len); + } else if (!strncmp(command, "snapshot-delete", len)) { + + if (pasprintf(&path, + "/local/domain/0/device-model/%u/parameter", domid) == -1) { + fprintf(logfile, "out of memory reading dm command parameter\n"); + goto out; + } + par = xs_read(xsh, XBT_NULL, path, &len); + if (!par) + goto out; + if (delete_disk_snapshots(par) == 0) + xenstore_record_dm_state("snapshot-deleted"); } else if (!strncmp(command, "continue", len)) { fprintf(logfile, "dm-command: continue after state save\n"); xen_pause_requested = 0; Index: xen-3.3.1-testing/tools/ioemu-remote/xen-vl-extra.c =================================================================== --- xen-3.3.1-testing.orig/tools/ioemu-remote/xen-vl-extra.c +++ xen-3.3.1-testing/tools/ioemu-remote/xen-vl-extra.c @@ -16,6 +16,8 @@ static int qemu_savevm_state(QEMUFile *f static int qemu_loadvm_state(QEMUFile *f); static int bdrv_can_snapshot(BlockDriverState *bs); +static int bdrv_has_snapshot(BlockDriverState *bs); +static BlockDriverState *get_bs_snapshots(void); static int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info, const char *name); @@ -166,6 +168,35 @@ the_end: return ret; } +int delete_disk_snapshots(const char* name) +{ + BlockDriverState *bs, *bs1; + int i, ret; + + bs = get_bs_snapshots(); + if (!bs) { + xenstore_record_dm_error("No block device supports snapshots"); + return -1; + } + + for(i = 0; i <= nb_drives; i++) { + bs1 = drives_table[i].bdrv; + if (bdrv_has_snapshot(bs1)) { + ret = bdrv_snapshot_delete(bs1, name); + if (ret < 0) { + if (ret == -ENOTSUP) + fprintf(stderr, "Snapshots not supported on device '%s'\n", + bdrv_get_device_name(bs1)); + else + fprintf(stderr, "Error %d while deleting snapshot on " + "'%s'\n", ret, bdrv_get_device_name(bs1)); + } + } + } + + return 0; +} + struct qemu_alarm_timer; static int unix_start_timer(struct qemu_alarm_timer *t) { return 0; } static void unix_stop_timer(struct qemu_alarm_timer *t) { } Index: xen-3.3.1-testing/tools/ioemu-remote/qemu-xen.h =================================================================== --- xen-3.3.1-testing.orig/tools/ioemu-remote/qemu-xen.h +++ xen-3.3.1-testing/tools/ioemu-remote/qemu-xen.h @@ -22,6 +22,7 @@ enum { /* xen-vl-extra.c */ int save_disk_snapshots(const char* name); +int delete_disk_snapshots(const char* name); /* helper2.c */ extern long time_offset;