From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, kraxel@redhat.com, hch@lst.de
Subject: [Qemu-devel] [PATCH 6/8] scsi: Split qdev "scsi-disk" into "scsi-hd" and "scsi-cd"
Date: Tue, 6 Jul 2010 14:37:47 +0200 [thread overview]
Message-ID: <1278419869-26126-7-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1278419869-26126-1-git-send-email-armbru@redhat.com>
Disk vs. CD needs to be in qdev, because it belongs to the drive's
guest part.
Keep scsi-disk for backward compatibility.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
hw/scsi-disk.c | 117 +++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 91 insertions(+), 26 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index f43f2d0..ebefcba 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -67,6 +67,7 @@ struct SCSIDiskState
QEMUBH *bh;
char *version;
char *serial;
+ int is_cd;
};
static SCSIDiskReq *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun)
@@ -339,7 +340,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
return -1;
}
- if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
+ if (s->is_cd) {
outbuf[buflen++] = 5;
} else {
outbuf[buflen++] = 0;
@@ -452,7 +453,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
return buflen;
}
- if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
+ if (s->is_cd) {
outbuf[0] = 5;
outbuf[1] = 0x80;
memcpy(&outbuf[16], "QEMU CD-ROM ", 16);
@@ -566,7 +567,7 @@ static int mode_sense_page(SCSIRequest *req, int page, uint8_t *p)
return 20;
case 0x2a: /* CD Capabilities and Mechanical Status page. */
- if (bdrv_get_type_hint(bdrv) != BDRV_TYPE_CDROM)
+ if (!s->is_cd)
return 0;
p[0] = 0x2a;
p[1] = 0x14;
@@ -755,7 +756,7 @@ static int scsi_disk_emulate_command(SCSIRequest *req, uint8_t *outbuf)
goto illegal_request;
break;
case START_STOP:
- if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM && (req->cmd.buf[4] & 2)) {
+ if (s->is_cd && (req->cmd.buf[4] & 2)) {
/* load/eject medium */
bdrv_eject(s->bs, !(req->cmd.buf[4] & 1));
}
@@ -1046,10 +1047,9 @@ static void scsi_destroy(SCSIDevice *dev)
blockdev_mark_auto_del(s->qdev.conf.bs);
}
-static int scsi_disk_initfn(SCSIDevice *dev)
+static int scsi_initfn(SCSIDevice *dev, int is_cd)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
- int is_cd;
DriveInfo *dinfo;
if (!s->qdev.conf.bs) {
@@ -1057,7 +1057,7 @@ static int scsi_disk_initfn(SCSIDevice *dev)
return -1;
}
s->bs = s->qdev.conf.bs;
- is_cd = bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM;
+ s->is_cd = is_cd;
if (!is_cd && !bdrv_is_inserted(s->bs)) {
error_report("Device needs media, but drive is empty");
@@ -1097,28 +1097,93 @@ static int scsi_disk_initfn(SCSIDevice *dev)
return 0;
}
-static SCSIDeviceInfo scsi_disk_info = {
- .qdev.name = "scsi-disk",
- .qdev.desc = "virtual scsi disk or cdrom",
- .qdev.size = sizeof(SCSIDiskState),
- .qdev.reset = scsi_disk_reset,
- .init = scsi_disk_initfn,
- .destroy = scsi_destroy,
- .send_command = scsi_send_command,
- .read_data = scsi_read_data,
- .write_data = scsi_write_data,
- .cancel_io = scsi_cancel_io,
- .get_buf = scsi_get_buf,
- .qdev.props = (Property[]) {
- DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
- DEFINE_PROP_STRING("ver", SCSIDiskState, version),
- DEFINE_PROP_STRING("serial", SCSIDiskState, serial),
- DEFINE_PROP_END_OF_LIST(),
- },
+static int scsi_hd_initfn(SCSIDevice *dev)
+{
+ return scsi_initfn(dev, 0);
+}
+
+static int scsi_cd_initfn(SCSIDevice *dev)
+{
+ return scsi_initfn(dev, 1);
+}
+
+static int scsi_disk_initfn(SCSIDevice *dev)
+{
+ int is_cd;
+
+ if (!dev->conf.bs) {
+ is_cd = 0; /* will die in scsi_initfn() */
+ } else {
+ is_cd = bdrv_get_type_hint(dev->conf.bs) == BDRV_TYPE_CDROM;
+ }
+
+ return scsi_initfn(dev, is_cd);
+}
+
+static SCSIDeviceInfo scsi_disk_info[] = {
+ {
+ .qdev.name = "scsi-hd",
+ .qdev.desc = "virtual scsi disk",
+ .qdev.size = sizeof(SCSIDiskState),
+ .qdev.reset = scsi_disk_reset,
+ .init = scsi_hd_initfn,
+ .destroy = scsi_destroy,
+ .send_command = scsi_send_command,
+ .read_data = scsi_read_data,
+ .write_data = scsi_write_data,
+ .cancel_io = scsi_cancel_io,
+ .get_buf = scsi_get_buf,
+ .qdev.props = (Property[]) {
+ DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
+ DEFINE_PROP_STRING("ver", SCSIDiskState, version),
+ DEFINE_PROP_STRING("serial", SCSIDiskState, serial),
+ DEFINE_PROP_END_OF_LIST(),
+ }
+ },{
+ .qdev.name = "scsi-cd",
+ .qdev.desc = "virtual scsi cdrom",
+ .qdev.size = sizeof(SCSIDiskState),
+ .qdev.reset = scsi_disk_reset,
+ .init = scsi_cd_initfn,
+ .destroy = scsi_destroy,
+ .send_command = scsi_send_command,
+ .read_data = scsi_read_data,
+ .write_data = scsi_write_data,
+ .cancel_io = scsi_cancel_io,
+ .get_buf = scsi_get_buf,
+ .qdev.props = (Property[]) {
+ DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
+ DEFINE_PROP_STRING("ver", SCSIDiskState, version),
+ DEFINE_PROP_STRING("serial", SCSIDiskState, serial),
+ DEFINE_PROP_END_OF_LIST(),
+ },
+ },{
+ .qdev.name = "scsi-disk", /* legacy -device scsi-disk */
+ .qdev.desc = "virtual scsi disk or cdrom (legacy)",
+ .qdev.size = sizeof(SCSIDiskState),
+ .qdev.reset = scsi_disk_reset,
+ .init = scsi_disk_initfn,
+ .destroy = scsi_destroy,
+ .send_command = scsi_send_command,
+ .read_data = scsi_read_data,
+ .write_data = scsi_write_data,
+ .cancel_io = scsi_cancel_io,
+ .get_buf = scsi_get_buf,
+ .qdev.props = (Property[]) {
+ DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
+ DEFINE_PROP_STRING("ver", SCSIDiskState, version),
+ DEFINE_PROP_STRING("serial", SCSIDiskState, serial),
+ DEFINE_PROP_END_OF_LIST(),
+ }
+ }
};
static void scsi_disk_register_devices(void)
{
- scsi_qdev_register(&scsi_disk_info);
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(scsi_disk_info); i++) {
+ scsi_qdev_register(&scsi_disk_info[i]);
+ }
}
device_init(scsi_disk_register_devices)
--
1.6.6.1
next prev parent reply other threads:[~2010-07-06 12:37 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-06 12:37 [Qemu-devel] [PATCH 0/8] Split ide-drive and scsi-disk qdevs, and more Markus Armbruster
2010-07-06 12:37 ` [Qemu-devel] [PATCH 1/8] virtio-pci: Check for virtio_blk_init() failure Markus Armbruster
2010-07-07 1:32 ` [Qemu-devel] " Christoph Hellwig
2010-07-06 12:37 ` [Qemu-devel] [PATCH 2/8] virtio-blk: Fix virtio-blk-s390 to require drive Markus Armbruster
2010-07-07 1:32 ` [Qemu-devel] " Christoph Hellwig
2010-07-06 12:37 ` [Qemu-devel] [PATCH 3/8] ide scsi virtio-blk: Reject empty drives unless media is removable Markus Armbruster
2010-07-07 1:33 ` [Qemu-devel] " Christoph Hellwig
2010-07-06 12:37 ` [Qemu-devel] [PATCH 4/8] block QMP: Drop query-block member "type" (type= in info block) Markus Armbruster
2010-07-06 16:39 ` [Qemu-devel] " Kevin Wolf
2010-07-06 16:45 ` Daniel P. Berrange
2010-07-07 1:33 ` Christoph Hellwig
2010-07-06 12:37 ` [Qemu-devel] [PATCH 5/8] ide: Split qdev "ide-drive" into "ide-hd" and "ide-cd" Markus Armbruster
2010-07-07 1:35 ` [Qemu-devel] " Christoph Hellwig
2010-07-07 10:19 ` Kevin Wolf
2010-07-06 12:37 ` Markus Armbruster [this message]
2010-07-07 1:37 ` [Qemu-devel] Re: [PATCH 6/8] scsi: Split qdev "scsi-disk" into "scsi-hd" and "scsi-cd" Christoph Hellwig
2010-07-07 7:38 ` Kevin Wolf
2010-07-07 9:33 ` Markus Armbruster
2010-07-06 12:37 ` [Qemu-devel] [PATCH 7/8] blockdev: Store -drive option media in DriveInfo Markus Armbruster
2010-07-07 1:38 ` [Qemu-devel] " Christoph Hellwig
2010-07-06 12:37 ` [Qemu-devel] [PATCH 8/8] block: Remove type hint Markus Armbruster
2010-07-12 9:52 ` [Qemu-devel] Re: [PATCH 0/8] Split ide-drive and scsi-disk qdevs, and more Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1278419869-26126-7-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=hch@lst.de \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).