[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] uninit drive if drive_init failed
From: |
Wen Congyang |
Subject: |
[Qemu-devel] [PATCH] uninit drive if drive_init failed |
Date: |
Wed, 16 Feb 2011 10:30:08 +0800 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100413 Fedora/3.0.4-2.fc13 Thunderbird/3.0.4 |
steps to reproduce this bug:
1. virsh attach-disk domain --source imagefile --target sdb --sourcetype file
--driver qemu --subdriver qcow2
error: Failed to attach disk
error: operation failed: adding
scsi-disk,bus=scsi0.0,scsi-id=1,drive=drive-scsi0-0-1,id=scsi0-0-1 device
failed: Property 'scsi-disk.drive' can't find value 'drive-scsi0-0-1'
2. virsh attach-disk domain --source imagefile --target sdb --sourcetype file
--driver qemu --subdriver raw
error: Failed to attach disk
error: operation failed: adding
scsi-disk,bus=scsi0.0,scsi-id=1,drive=drive-scsi0-0-1,id=scsi0-0-1 device
failed: Property 'scsi-disk.drive' can't find value 'drive-scsi0-0-1'
The format of disk image file is raw.
If we run comand 2 only, we will attach the disk successfully.
The reason of this bug is that: we do not remove dinfo from drives and
dinfo->bdrv from bdrv_states
if we open the disk image file failed.
Signed-off-by: Wen Congyang <address@hidden>
---
blockdev.c | 11 +++++++++--
1 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 1333a4e..03cc000 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -527,7 +527,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
} else if (ro == 1) {
if (type != IF_SCSI && type != IF_VIRTIO && type != IF_FLOPPY && type
!= IF_NONE) {
error_report("readonly not supported by this bus type");
- return NULL;
+ goto cleanup;
}
}
@@ -537,12 +537,19 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
if (ret < 0) {
error_report("could not open disk image %s: %s",
file, strerror(-ret));
- return NULL;
+ goto cleanup;
}
if (bdrv_key_required(dinfo->bdrv))
autostart = 0;
return dinfo;
+
+cleanup:
+ bdrv_delete(dinfo->bdrv);
+ QTAILQ_REMOVE(&drives, dinfo, next);
+ qemu_free(dinfo->id);
+ qemu_free(dinfo);
+ return NULL;
}
void do_commit(Monitor *mon, const QDict *qdict)
--
1.7.1
- [Qemu-devel] [PATCH] uninit drive if drive_init failed,
Wen Congyang <=