520
520
mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
522
522
snprintf(dinfo->id, 32, "%s%i%s%i",
523
devname, bus_id, mediastr, unit_id);
523
if_name[type], bus_id, mediastr, unit_id);
525
525
snprintf(dinfo->id, 32, "%s%s%i",
526
devname, mediastr, unit_id);
526
if_name[type], mediastr, unit_id);
528
528
dinfo->bdrv = bdrv_new(dinfo->id);
529
529
dinfo->devaddr = devaddr;
530
530
dinfo->type = type;
531
531
dinfo->bus = bus_id;
532
532
dinfo->unit = unit_id;
534
dinfo->heads = heads;
536
dinfo->trans = translation;
533
537
dinfo->opts = opts;
534
538
dinfo->refcount = 1;
536
strncpy(dinfo->serial, serial, sizeof(dinfo->serial) - 1);
539
dinfo->serial = serial;
537
540
QTAILQ_INSERT_TAIL(&drives, dinfo, next);
539
542
bdrv_set_on_error(dinfo->bdrv, on_read_error, on_write_error);
653
static void blockdev_do_action(int kind, void *data, Error **errp)
655
BlockdevAction action;
656
BlockdevActionList list;
660
list.value = &action;
662
qmp_transaction(&list, errp);
649
665
void qmp_blockdev_snapshot_sync(const char *device, const char *snapshot_file,
650
666
bool has_format, const char *format,
667
bool has_mode, enum NewImageMode mode,
653
BlockDriverState *bs;
654
BlockDriver *drv, *old_drv, *proto_drv;
657
char old_filename[1024];
659
bs = bdrv_find(device);
661
error_set(errp, QERR_DEVICE_NOT_FOUND, device);
664
if (bdrv_in_use(bs)) {
665
error_set(errp, QERR_DEVICE_IN_USE, device);
669
pstrcpy(old_filename, sizeof(old_filename), bs->filename);
672
flags = bs->open_flags;
678
drv = bdrv_find_format(format);
680
error_set(errp, QERR_INVALID_BLOCK_FORMAT, format);
684
proto_drv = bdrv_find_protocol(snapshot_file);
686
error_set(errp, QERR_INVALID_BLOCK_FORMAT, format);
690
ret = bdrv_img_create(snapshot_file, format, bs->filename,
691
bs->drv->format_name, NULL, -1, flags);
693
error_set(errp, QERR_UNDEFINED_ERROR);
701
ret = bdrv_open(bs, snapshot_file, flags, drv);
703
* If reopening the image file we just created fails, fall back
704
* and try to re-open the original image. If that fails too, we
705
* are in serious trouble.
708
ret = bdrv_open(bs, old_filename, flags, old_drv);
710
error_set(errp, QERR_OPEN_FILE_FAILED, old_filename);
712
error_set(errp, QERR_OPEN_FILE_FAILED, snapshot_file);
670
BlockdevSnapshot snapshot = {
671
.device = (char *) device,
672
.snapshot_file = (char *) snapshot_file,
673
.has_format = has_format,
674
.format = (char *) format,
675
.has_mode = has_mode,
678
blockdev_do_action(BLOCKDEV_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC, &snapshot,
718
683
/* New and old BlockDriverState structs for group snapshots */
719
typedef struct BlkGroupSnapshotStates {
684
typedef struct BlkTransactionStates {
720
685
BlockDriverState *old_bs;
721
686
BlockDriverState *new_bs;
722
QSIMPLEQ_ENTRY(BlkGroupSnapshotStates) entry;
723
} BlkGroupSnapshotStates;
687
QSIMPLEQ_ENTRY(BlkTransactionStates) entry;
688
} BlkTransactionStates;
726
691
* 'Atomic' group snapshots. The snapshots are taken as a set, and if any fail
727
692
* then we do not pivot any of the devices in the group, and abandon the
730
void qmp_blockdev_group_snapshot_sync(SnapshotDevList *dev_list,
695
void qmp_transaction(BlockdevActionList *dev_list, Error **errp)
734
SnapshotDevList *dev_entry = dev_list;
735
SnapshotDev *dev_info = NULL;
736
BlkGroupSnapshotStates *states;
737
BlockDriver *proto_drv;
741
const char *snapshot_file;
698
BlockdevActionList *dev_entry = dev_list;
699
BlkTransactionStates *states, *next;
743
QSIMPLEQ_HEAD(snap_bdrv_states, BlkGroupSnapshotStates) snap_bdrv_states;
701
QSIMPLEQ_HEAD(snap_bdrv_states, BlkTransactionStates) snap_bdrv_states;
744
702
QSIMPLEQ_INIT(&snap_bdrv_states);
746
704
/* drain all i/o before any snapshots */
749
707
/* We don't do anything in this loop that commits us to the snapshot */
750
708
while (NULL != dev_entry) {
709
BlockdevAction *dev_info = NULL;
710
BlockDriver *proto_drv;
713
enum NewImageMode mode;
714
const char *new_image_file;
716
const char *format = "qcow2";
751
718
dev_info = dev_entry->value;
752
719
dev_entry = dev_entry->next;
754
states = g_malloc0(sizeof(BlkGroupSnapshotStates));
721
states = g_malloc0(sizeof(BlkTransactionStates));
755
722
QSIMPLEQ_INSERT_TAIL(&snap_bdrv_states, states, entry);
757
states->old_bs = bdrv_find(dev_info->device);
724
switch (dev_info->kind) {
725
case BLOCKDEV_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC:
726
device = dev_info->blockdev_snapshot_sync->device;
727
if (!dev_info->blockdev_snapshot_sync->has_mode) {
728
dev_info->blockdev_snapshot_sync->mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
730
new_image_file = dev_info->blockdev_snapshot_sync->snapshot_file;
731
if (dev_info->blockdev_snapshot_sync->has_format) {
732
format = dev_info->blockdev_snapshot_sync->format;
734
mode = dev_info->blockdev_snapshot_sync->mode;
740
drv = bdrv_find_format(format);
742
error_set(errp, QERR_INVALID_BLOCK_FORMAT, format);
743
goto delete_and_fail;
746
states->old_bs = bdrv_find(device);
759
747
if (!states->old_bs) {
760
error_set(errp, QERR_DEVICE_NOT_FOUND, dev_info->device);
748
error_set(errp, QERR_DEVICE_NOT_FOUND, device);
749
goto delete_and_fail;
752
if (!bdrv_is_inserted(states->old_bs)) {
753
error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
761
754
goto delete_and_fail;
764
757
if (bdrv_in_use(states->old_bs)) {
765
error_set(errp, QERR_DEVICE_IN_USE, dev_info->device);
758
error_set(errp, QERR_DEVICE_IN_USE, device);
766
759
goto delete_and_fail;
769
if (!bdrv_is_read_only(states->old_bs) &&
770
bdrv_is_inserted(states->old_bs)) {
762
if (!bdrv_is_read_only(states->old_bs)) {
772
763
if (bdrv_flush(states->old_bs)) {
773
764
error_set(errp, QERR_IO_ERROR);
774
765
goto delete_and_fail;
778
snapshot_file = dev_info->snapshot_file;
780
769
flags = states->old_bs->open_flags;
782
if (!dev_info->has_format) {
785
format = dev_info->format;
788
drv = bdrv_find_format(format);
790
error_set(errp, QERR_INVALID_BLOCK_FORMAT, format);
791
goto delete_and_fail;
794
proto_drv = bdrv_find_protocol(snapshot_file);
771
proto_drv = bdrv_find_protocol(new_image_file);
795
772
if (!proto_drv) {
796
773
error_set(errp, QERR_INVALID_BLOCK_FORMAT, format);
797
774
goto delete_and_fail;
800
777
/* create new image w/backing file */
801
ret = bdrv_img_create(snapshot_file, format,
802
states->old_bs->filename,
803
drv->format_name, NULL, -1, flags);
805
error_set(errp, QERR_OPEN_FILE_FAILED, snapshot_file);
806
goto delete_and_fail;
778
if (mode != NEW_IMAGE_MODE_EXISTING) {
779
ret = bdrv_img_create(new_image_file, format,
780
states->old_bs->filename,
781
states->old_bs->drv->format_name,
784
error_set(errp, QERR_OPEN_FILE_FAILED, new_image_file);
785
goto delete_and_fail;
809
789
/* We will manually add the backing_hd field to the bs later */
810
790
states->new_bs = bdrv_new("");
811
ret = bdrv_open(states->new_bs, snapshot_file,
791
ret = bdrv_open(states->new_bs, new_image_file,
812
792
flags | BDRV_O_NO_BACKING, drv);
814
error_set(errp, QERR_OPEN_FILE_FAILED, snapshot_file);
794
error_set(errp, QERR_OPEN_FILE_FAILED, new_image_file);
815
795
goto delete_and_fail;
1130
ret = stream_start(bs, base_bs, base, block_stream_cb, bs);
1134
error_set(errp, QERR_DEVICE_IN_USE, device);
1137
error_set(errp, QERR_NOT_SUPPORTED);
1111
stream_start(bs, base_bs, base, has_speed ? speed : 0,
1112
block_stream_cb, bs, &local_err);
1113
if (error_is_set(&local_err)) {
1114
error_propagate(errp, local_err);
1142
1118
/* Grab a reference so hotplug does not delete the BlockDriverState from