BlockConf: Call backend functions to detect geometry and blocksizes
geometry: hd_geometry_guess function autodetects the drive geometry. This patch adds a block backend call, that probes the backing device geometry. If the inner driver method is implemented and succeeds (currently only for DASDs), the blkconf_geometry will pass-through the backing device geometry. Otherwise will fallback to old logic. blocksize: This patch initializes blocksize properties to 0. In order to set the property a blkconf_blocksizes was introduced. If user didn't set physical or logical blocksize, it will retrieve its value from a driver (only succeeds for DASD), otherwise it will set default 512 value. The blkconf_blocksizes call was added to all users of BlkConf. Signed-off-by: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 1424087278-49393-6-git-send-email-tumanova@linux.vnet.ibm.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
f0272c4db2
commit
0eb28a4228
@ -25,6 +25,30 @@ void blkconf_serial(BlockConf *conf, char **serial)
|
||||
}
|
||||
}
|
||||
|
||||
void blkconf_blocksizes(BlockConf *conf)
|
||||
{
|
||||
BlockBackend *blk = conf->blk;
|
||||
BlockSizes blocksizes;
|
||||
int backend_ret;
|
||||
|
||||
backend_ret = blk_probe_blocksizes(blk, &blocksizes);
|
||||
/* fill in detected values if they are not defined via qemu command line */
|
||||
if (!conf->physical_block_size) {
|
||||
if (!backend_ret) {
|
||||
conf->physical_block_size = blocksizes.phys;
|
||||
} else {
|
||||
conf->physical_block_size = BDRV_SECTOR_SIZE;
|
||||
}
|
||||
}
|
||||
if (!conf->logical_block_size) {
|
||||
if (!backend_ret) {
|
||||
conf->logical_block_size = blocksizes.log;
|
||||
} else {
|
||||
conf->logical_block_size = BDRV_SECTOR_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void blkconf_geometry(BlockConf *conf, int *ptrans,
|
||||
unsigned cyls_max, unsigned heads_max, unsigned secs_max,
|
||||
Error **errp)
|
||||
|
@ -121,8 +121,16 @@ void hd_geometry_guess(BlockBackend *blk,
|
||||
int *ptrans)
|
||||
{
|
||||
int cylinders, heads, secs, translation;
|
||||
HDGeometry geo;
|
||||
|
||||
if (guess_disk_lchs(blk, &cylinders, &heads, &secs) < 0) {
|
||||
/* Try to probe the backing device geometry, otherwise fallback
|
||||
to the old logic. (as of 12/2014 probing only succeeds on DASDs) */
|
||||
if (blk_probe_geometry(blk, &geo) == 0) {
|
||||
*pcyls = geo.cylinders;
|
||||
*psecs = geo.sectors;
|
||||
*pheads = geo.heads;
|
||||
translation = BIOS_ATA_TRANSLATION_NONE;
|
||||
} else if (guess_disk_lchs(blk, &cylinders, &heads, &secs) < 0) {
|
||||
/* no LCHS guess: use a standard physical disk geometry */
|
||||
guess_chs_for_size(blk, pcyls, pheads, psecs);
|
||||
translation = hd_bios_chs_auto_trans(*pcyls, *pheads, *psecs);
|
||||
|
@ -765,6 +765,7 @@ static int nvme_init(PCIDevice *pci_dev)
|
||||
if (!n->serial) {
|
||||
return -1;
|
||||
}
|
||||
blkconf_blocksizes(&n->conf);
|
||||
|
||||
pci_conf = pci_dev->config;
|
||||
pci_conf[PCI_INTERRUPT_PIN] = 1;
|
||||
|
@ -893,6 +893,7 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
blkconf_blocksizes(&conf->conf);
|
||||
|
||||
virtio_init(vdev, "virtio-blk", VIRTIO_ID_BLOCK,
|
||||
sizeof(struct virtio_blk_config));
|
||||
|
@ -580,7 +580,8 @@ static void set_blocksize(Object *obj, Visitor *v, void *opaque,
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
if (value < min || value > max) {
|
||||
/* value of 0 means "unset" */
|
||||
if (value && (value < min || value > max)) {
|
||||
error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
|
||||
dev->id?:"", name, (int64_t)value, min, max);
|
||||
return;
|
||||
|
@ -163,6 +163,7 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
|
||||
return -1;
|
||||
}
|
||||
|
||||
blkconf_blocksizes(&dev->conf);
|
||||
if (dev->conf.logical_block_size != 512) {
|
||||
error_report("logical_block_size must be 512 for IDE");
|
||||
return -1;
|
||||
|
@ -2251,6 +2251,7 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
||||
}
|
||||
|
||||
blkconf_serial(&s->qdev.conf, &s->serial);
|
||||
blkconf_blocksizes(&s->qdev.conf);
|
||||
if (dev->type == TYPE_DISK) {
|
||||
blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, &err);
|
||||
if (err) {
|
||||
@ -2290,6 +2291,7 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
||||
static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
|
||||
{
|
||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
|
||||
blkconf_blocksizes(&s->qdev.conf);
|
||||
s->qdev.blocksize = s->qdev.conf.logical_block_size;
|
||||
s->qdev.type = TYPE_DISK;
|
||||
if (!s->product) {
|
||||
|
@ -611,6 +611,7 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
|
||||
}
|
||||
|
||||
blkconf_serial(&s->conf, &dev->serial);
|
||||
blkconf_blocksizes(&s->conf);
|
||||
|
||||
/*
|
||||
* Hack alert: this pretends to be a block device, but it's really
|
||||
|
@ -44,9 +44,9 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
|
||||
#define DEFINE_BLOCK_PROPERTIES(_state, _conf) \
|
||||
DEFINE_PROP_DRIVE("drive", _state, _conf.blk), \
|
||||
DEFINE_PROP_BLOCKSIZE("logical_block_size", _state, \
|
||||
_conf.logical_block_size, 512), \
|
||||
_conf.logical_block_size), \
|
||||
DEFINE_PROP_BLOCKSIZE("physical_block_size", _state, \
|
||||
_conf.physical_block_size, 512), \
|
||||
_conf.physical_block_size), \
|
||||
DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0), \
|
||||
DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0), \
|
||||
DEFINE_PROP_UINT32("discard_granularity", _state, \
|
||||
@ -63,6 +63,7 @@ void blkconf_serial(BlockConf *conf, char **serial);
|
||||
void blkconf_geometry(BlockConf *conf, int *trans,
|
||||
unsigned cyls_max, unsigned heads_max, unsigned secs_max,
|
||||
Error **errp);
|
||||
void blkconf_blocksizes(BlockConf *conf);
|
||||
|
||||
/* Hard disk geometry */
|
||||
|
||||
|
@ -149,8 +149,8 @@ extern PropertyInfo qdev_prop_arraylen;
|
||||
LostTickPolicy)
|
||||
#define DEFINE_PROP_BIOS_CHS_TRANS(_n, _s, _f, _d) \
|
||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_bios_chs_trans, int)
|
||||
#define DEFINE_PROP_BLOCKSIZE(_n, _s, _f, _d) \
|
||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_blocksize, uint16_t)
|
||||
#define DEFINE_PROP_BLOCKSIZE(_n, _s, _f) \
|
||||
DEFINE_PROP_DEFAULT(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t)
|
||||
#define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
|
||||
DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user