This value is used currently for virtio-blk only.  It was defined
as uint16_t before, which is the same as in kernel<=>user interface
(in virtio_blk.h, struct virtio_blk_config).  But the problem is
that in kernel<=>user interface the units are sectors (which is
usually 512 bytes or more), while in qemu it is in bytes.  However,
for, say, md raid5 arrays, it is typical to have actual min_io_size
of a host device to be large.  For example, for raid5 device of
3 drives with 64Kb chunk size, that value will be 128Kb, which does
not fit in a uint16_t anymore.

Increase the value size from 16bits to 32bits for now.

But apparently, the kernel<=>user interface needs to be fixed too
(while it is much more difficult due to compatibility issues),
because even with 512byte units, the 16bit value there will overflow
too with quite normal MD RAID configuration.

Signed-off-by: Michael Tokarev <>
 block.h |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/block.h b/block.h
index f163e54..cd5ae79 100644
--- a/block.h
+++ b/block.h
@@ -425,7 +425,7 @@ typedef struct BlockConf {
     BlockDriverState *bs;
     uint16_t physical_block_size;
     uint16_t logical_block_size;
-    uint16_t min_io_size;
+    uint32_t min_io_size;
     uint32_t opt_io_size;
     int32_t bootindex;
     uint32_t discard_granularity;
@@ -450,7 +450,7 @@ static inline unsigned int get_physical_block_exp(BlockConf 
                           _conf.logical_block_size, 512),               \
     DEFINE_PROP_BLOCKSIZE("physical_block_size", _state,                \
                           _conf.physical_block_size, 512),              \
-    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0),  \
+    DEFINE_PROP_UINT32("min_io_size", _state, _conf.min_io_size, 0),  \
     DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0),    \
     DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1),        \
     DEFINE_PROP_UINT32("discard_granularity", _state, \

Reply via email to