block: make BlockConf size props 32bit and accept size suffixes
Convert all size-related properties in BlockConf to 32bit. This will accommodate bigger block sizes (in a followup patch). This also allows to make them all accept size suffixes, either via DEFINE_PROP_BLOCKSIZE or via DEFINE_PROP_SIZE32. Also, since min_io_size is exposed to the guest by scsi and virtio-blk devices as an uint16_t in units of logical blocks, introduce an additional check in blkconf_blocksizes to prevent its silent truncation. Signed-off-by: Roman Kagan <rvkagan@yandex-team.ru> Message-Id: <20200528225516.1676602-7-rvkagan@yandex-team.ru> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
645b55d1c2
commit
4f44bbc5bb
@ -96,6 +96,16 @@ bool blkconf_blocksizes(BlockConf *conf, Error **errp)
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* all devices which support min_io_size (scsi and virtio-blk) expose it to
|
||||
* the guest as a uint16_t in units of logical blocks
|
||||
*/
|
||||
if (conf->min_io_size / conf->logical_block_size > UINT16_MAX) {
|
||||
error_setg(errp, "min_io_size must not exceed %u logical blocks",
|
||||
UINT16_MAX);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!QEMU_IS_ALIGNED(conf->opt_io_size, conf->logical_block_size)) {
|
||||
error_setg(errp,
|
||||
"opt_io_size must be a multiple of logical_block_size");
|
||||
|
@ -782,7 +782,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
Property *prop = opaque;
|
||||
uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
|
||||
uint64_t value;
|
||||
Error *local_err = NULL;
|
||||
|
||||
@ -821,7 +821,7 @@ const PropertyInfo qdev_prop_blocksize = {
|
||||
.name = "size",
|
||||
.description = "A power of two between " MIN_BLOCK_SIZE_STR
|
||||
" and " MAX_BLOCK_SIZE_STR,
|
||||
.get = get_uint16,
|
||||
.get = get_uint32,
|
||||
.set = set_blocksize,
|
||||
.set_default_value = set_default_value_uint,
|
||||
};
|
||||
|
@ -18,9 +18,9 @@
|
||||
|
||||
typedef struct BlockConf {
|
||||
BlockBackend *blk;
|
||||
uint16_t physical_block_size;
|
||||
uint16_t logical_block_size;
|
||||
uint16_t min_io_size;
|
||||
uint32_t physical_block_size;
|
||||
uint32_t logical_block_size;
|
||||
uint32_t min_io_size;
|
||||
uint32_t opt_io_size;
|
||||
int32_t bootindex;
|
||||
uint32_t discard_granularity;
|
||||
@ -51,9 +51,9 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
|
||||
_conf.logical_block_size), \
|
||||
DEFINE_PROP_BLOCKSIZE("physical_block_size", _state, \
|
||||
_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, \
|
||||
DEFINE_PROP_SIZE32("min_io_size", _state, _conf.min_io_size, 0), \
|
||||
DEFINE_PROP_SIZE32("opt_io_size", _state, _conf.opt_io_size, 0), \
|
||||
DEFINE_PROP_SIZE32("discard_granularity", _state, \
|
||||
_conf.discard_granularity, -1), \
|
||||
DEFINE_PROP_ON_OFF_AUTO("write-cache", _state, _conf.wce, \
|
||||
ON_OFF_AUTO_AUTO), \
|
||||
|
@ -200,7 +200,7 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
|
||||
#define DEFINE_PROP_SIZE32(_n, _s, _f, _d) \
|
||||
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size32, uint32_t)
|
||||
#define DEFINE_PROP_BLOCKSIZE(_n, _s, _f) \
|
||||
DEFINE_PROP_UNSIGNED(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t)
|
||||
DEFINE_PROP_UNSIGNED(_n, _s, _f, 0, qdev_prop_blocksize, uint32_t)
|
||||
#define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
|
||||
DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
|
||||
#define DEFINE_PROP_OFF_AUTO_PCIBAR(_n, _s, _f, _d) \
|
||||
|
Loading…
Reference in New Issue
Block a user