mirror of https://github.com/xqemu/xqemu.git
scsi-disk: bdrv_attach_dev() for empty CD-ROM
If no drive=... option is passed (for an empty drive), we don't only lack the BlockBackend normally created by parse_drive(), but we also need to manually call blk_attach_dev(). This fixes at least a segfault when unplugging such devices, the bug that they didn't show up in query-block, and probably some more problems. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
947231ad3b
commit
83b4fe0ed5
|
@ -2384,9 +2384,14 @@ static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
|
||||||
static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
|
static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
|
||||||
{
|
{
|
||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!dev->conf.blk) {
|
if (!dev->conf.blk) {
|
||||||
|
/* Anonymous BlockBackend for an empty drive. As we put it into
|
||||||
|
* dev->conf, qdev takes care of detaching on unplug. */
|
||||||
dev->conf.blk = blk_new(0, BLK_PERM_ALL);
|
dev->conf.blk = blk_new(0, BLK_PERM_ALL);
|
||||||
|
ret = blk_attach_dev(dev->conf.blk, &dev->qdev);
|
||||||
|
assert(ret == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
s->qdev.blocksize = 2048;
|
s->qdev.blocksize = 2048;
|
||||||
|
|
Loading…
Reference in New Issue