mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
Prevent an oops in Dom0 that occurs when a CD device, specified as one
of the 'hardrives' in the 'disk=' line of a para-virtualized guest's def file, has no media when the guest is started. The oops occurs in vbd.c when vbd_size() is called from connect() (in xenbus.c) and the vbd pointer is really an error code that comes from the failed open that occurred in vbd_create(). Based on a patch from Ross Maxfield at Novell. Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
fc1bbeb091
commit
4eabcb748c
1 file changed
+8
-5
@@ -55,6 +55,7 @@ int vbd_create(blkif_t *blkif, blkif_vdev_t handle, unsigned major,
|
||||
unsigned minor, int readonly)
|
||||
{
|
||||
struct vbd *vbd;
|
||||
struct block_device *bdev;
|
||||
|
||||
vbd = &blkif->vbd;
|
||||
vbd->handle = handle;
|
||||
@@ -63,15 +64,17 @@ int vbd_create(blkif_t *blkif, blkif_vdev_t handle, unsigned major,
|
||||
|
||||
vbd->pdevice = MKDEV(major, minor);
|
||||
|
||||
vbd->bdev = open_by_devnum(
|
||||
vbd->pdevice,
|
||||
vbd->readonly ? FMODE_READ : FMODE_WRITE);
|
||||
if (IS_ERR(vbd->bdev)) {
|
||||
DPRINTK("vbd_creat: device %08x doesn't exist.\n",
|
||||
bdev = open_by_devnum(vbd->pdevice,
|
||||
vbd->readonly ? FMODE_READ : FMODE_WRITE);
|
||||
|
||||
if (IS_ERR(bdev)) {
|
||||
DPRINTK("vbd_creat: device %08x could not be opened.\n",
|
||||
vbd->pdevice);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
vbd->bdev = bdev;
|
||||
|
||||
if (vbd->bdev->bd_disk == NULL) {
|
||||
DPRINTK("vbd_creat: device %08x doesn't exist.\n",
|
||||
vbd->pdevice);
|
||||
|
||||