ide scsi virtio-blk: Reject empty drives unless media is removable
Disks without media make no sense. For SCSI, a Linux guest kernel complains during boot. I didn't try other combinations. scsi-generic doesn't need the additional check, because it already requires bdrv_is_sg(), which fails without media. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									d75d25e34e
								
							
						
					
					
						commit
						98f28ad7a7
					
				@ -2630,6 +2630,10 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs,
 | 
				
			|||||||
        s->drive_kind = IDE_CD;
 | 
					        s->drive_kind = IDE_CD;
 | 
				
			||||||
        bdrv_set_change_cb(bs, cdrom_change_cb, s);
 | 
					        bdrv_set_change_cb(bs, cdrom_change_cb, s);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (!bdrv_is_inserted(s->bs)) {
 | 
				
			||||||
 | 
					            error_report("Device needs media, but drive is empty");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (bdrv_is_read_only(bs)) {
 | 
					        if (bdrv_is_read_only(bs)) {
 | 
				
			||||||
            error_report("Can't use a read-only drive");
 | 
					            error_report("Can't use a read-only drive");
 | 
				
			||||||
            return -1;
 | 
					            return -1;
 | 
				
			||||||
 | 
				
			|||||||
@ -1059,6 +1059,11 @@ static int scsi_disk_initfn(SCSIDevice *dev)
 | 
				
			|||||||
    s->bs = s->qdev.conf.bs;
 | 
					    s->bs = s->qdev.conf.bs;
 | 
				
			||||||
    is_cd = bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM;
 | 
					    is_cd = bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!is_cd && !bdrv_is_inserted(s->bs)) {
 | 
				
			||||||
 | 
					        error_report("Device needs media, but drive is empty");
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (bdrv_get_on_error(s->bs, 1) != BLOCK_ERR_REPORT) {
 | 
					    if (bdrv_get_on_error(s->bs, 1) != BLOCK_ERR_REPORT) {
 | 
				
			||||||
        error_report("Device doesn't support drive option rerror");
 | 
					        error_report("Device doesn't support drive option rerror");
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
 | 
				
			|||||||
@ -495,6 +495,10 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf)
 | 
				
			|||||||
        error_report("virtio-blk-pci: drive property not set");
 | 
					        error_report("virtio-blk-pci: drive property not set");
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (!bdrv_is_inserted(conf->bs)) {
 | 
				
			||||||
 | 
					        error_report("Device needs media, but drive is empty");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s = (VirtIOBlock *)virtio_common_init("virtio-blk", VIRTIO_ID_BLOCK,
 | 
					    s = (VirtIOBlock *)virtio_common_init("virtio-blk", VIRTIO_ID_BLOCK,
 | 
				
			||||||
                                          sizeof(struct virtio_blk_config),
 | 
					                                          sizeof(struct virtio_blk_config),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user