mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 11:39:53 +00:00
pc-bios/s390-ccw/virtio-blkdev: Simplify/fix virtio_ipl_disk_is_valid()
The s390-ccw bios fails to boot if the boot disk is a virtio-blk disk with a sector size of 4096. For example: dasdfmt -b 4096 -d cdl -y -p -M quick /dev/dasdX fdasd -a /dev/dasdX install a guest onto /dev/dasdX1 using virtio-blk qemu-system-s390x -nographic -hda /dev/dasdX1 The bios then bails out with: ! Cannot read block 0 ! Looking at virtio_ipl_disk_is_valid() and especially the function virtio_disk_is_scsi(), it does not really make sense that we expect only such a limited disk geometry (like a block size of 512) for our boot disks. Let's relax the check and allow everything that remotely looks like a sane disk. Message-Id: <20220704111903.62400-5-thuth@redhat.com> Reviewed-by: Eric Farman <farman@linux.ibm.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
422865f667
commit
bbf615f7b7
@ -166,46 +166,19 @@ void virtio_assume_eckd(void)
|
||||
virtio_eckd_sectors_for_block_size(vdev->config.blk.blk_size);
|
||||
}
|
||||
|
||||
bool virtio_disk_is_scsi(void)
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
if (vdev->guessed_disk_nature == VIRTIO_GDN_SCSI) {
|
||||
return true;
|
||||
}
|
||||
switch (vdev->senseid.cu_model) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
return (vdev->config.blk.geometry.heads == 255)
|
||||
&& (vdev->config.blk.geometry.sectors == 63)
|
||||
&& (virtio_get_block_size() == VIRTIO_SCSI_BLOCK_SIZE);
|
||||
case VIRTIO_ID_SCSI:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool virtio_disk_is_eckd(void)
|
||||
{
|
||||
VDev *vdev = virtio_get_device();
|
||||
const int block_size = virtio_get_block_size();
|
||||
|
||||
if (vdev->guessed_disk_nature == VIRTIO_GDN_DASD) {
|
||||
return true;
|
||||
}
|
||||
switch (vdev->senseid.cu_model) {
|
||||
case VIRTIO_ID_BLOCK:
|
||||
return (vdev->config.blk.geometry.heads == 15)
|
||||
&& (vdev->config.blk.geometry.sectors ==
|
||||
virtio_eckd_sectors_for_block_size(block_size));
|
||||
case VIRTIO_ID_SCSI:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool virtio_ipl_disk_is_valid(void)
|
||||
{
|
||||
return virtio_disk_is_scsi() || virtio_disk_is_eckd();
|
||||
int blksize = virtio_get_block_size();
|
||||
VDev *vdev = virtio_get_device();
|
||||
|
||||
if (vdev->guessed_disk_nature == VIRTIO_GDN_SCSI ||
|
||||
vdev->guessed_disk_nature == VIRTIO_GDN_DASD) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return (vdev->senseid.cu_model == VIRTIO_ID_BLOCK ||
|
||||
vdev->senseid.cu_model == VIRTIO_ID_SCSI) &&
|
||||
blksize >= 512 && blksize <= 4096;
|
||||
}
|
||||
|
||||
int virtio_get_block_size(void)
|
||||
|
@ -186,8 +186,6 @@ void virtio_assume_scsi(void);
|
||||
void virtio_assume_eckd(void);
|
||||
void virtio_assume_iso9660(void);
|
||||
|
||||
extern bool virtio_disk_is_scsi(void);
|
||||
extern bool virtio_disk_is_eckd(void);
|
||||
extern bool virtio_ipl_disk_is_valid(void);
|
||||
extern int virtio_get_block_size(void);
|
||||
extern uint8_t virtio_get_heads(void);
|
||||
|
Loading…
Reference in New Issue
Block a user