qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V3 2/2] virtio-block: support auto-sensing of bl


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] [PATCH V3 2/2] virtio-block: support auto-sensing of block sizes
Date: Tue, 12 Feb 2013 16:47:44 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

On Fri, Feb 08, 2013 at 03:52:35PM +0100, Einar Lueck wrote:
> @@ -22,6 +25,26 @@ void blkconf_serial(BlockConf *conf, char **serial)
>      }
>  }
>  
> +void blkconf_blocksizes(BlockConf *conf)
> +{
> +    int block_size;
> +
> +    if (!conf->physical_block_size) {
> +        if (bdrv_ioctl(conf->bs, BLKPBSZGET, &block_size) == 0) {

#ifdef __linux__

> +           conf->physical_block_size = (uint16_t) block_size;

4 spaces for indentation.

> +        } else {
> +            conf->physical_block_size = BLOCK_PROPERTY_STD_BLKSIZE;
> +        }
> +    }
> +    if (!conf->logical_block_size) {
> +        if (bdrv_ioctl(conf->bs, BLKSSZGET, &block_size) == 0) {
> +            conf->logical_block_size = (uint16_t) block_size;
> +        } else {
> +            conf->logical_block_size = BLOCK_PROPERTY_STD_BLKSIZE;
> +        }
> +    }
> +}
> +
>  int blkconf_geometry(BlockConf *conf, int *ptrans,
>                       unsigned cyls_max, unsigned heads_max, unsigned 
> secs_max)
>  {
> diff --git a/hw/block-common.h b/hw/block-common.h
> index bb808f7..d593128 100644
> --- a/hw/block-common.h
> +++ b/hw/block-common.h
> @@ -40,18 +40,23 @@ static inline unsigned int 
> get_physical_block_exp(BlockConf *conf)
>      return exp;
>  }
>  
> -#define DEFINE_BLOCK_PROPERTIES(_state, _conf)                          \
> +#define BLOCK_PROPERTY_STD_BLKSIZE 512
> +#define DEFINE_BLOCK_PROPERTIES_EXTENDED(_state, _conf, _blksize)       \

Detecting the underlying block size is a generally useful configuration
option.  This should not be s390-specific, so no need to rename
DEFINE_BLOCK_PROPERTIES().

If you set the default to 0 then QEMU will do extra ioctls.  Perhaps
BlockDriverState needs a function to probe block sizes.  This way
block/raw-posix.c could do the probing only on hdev (host block
devices).

> diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
> index a8a31f5..73b6da0 100644
> --- a/hw/qdev-properties.c
> +++ b/hw/qdev-properties.c
> @@ -650,7 +650,9 @@ static void set_blocksize(Object *obj, Visitor *v, void 
> *opaque,
>          error_propagate(errp, local_err);
>          return;
>      }
> -    if (value < min || value > max) {
> +
> +    /* value == 0 indicates that block size should be sensed later on */
> +    if ((value < min || value > max) && value > 0) {
>          error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
>                    dev->id?:"", name, (int64_t)value, min, max);
>          return;

In the current patch this allows through the 0 value.  Since the patch
only adds a blkconf_blocksizes() call to hw/virtio-blk.c, who knows what
will happen to ide/scsi/etc -drives that are configured with 0.

We need to make sure that 0 is really handled for all emulated storage
controllers.

> diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
> index 34913ee..cd25712 100644
> --- a/hw/virtio-blk.c
> +++ b/hw/virtio-blk.c
> @@ -654,6 +654,7 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, 
> VirtIOBlkConf *blk)
>      }
>  
>      blkconf_serial(&blk->conf, &blk->serial);
> +    blkconf_blocksizes(&blk->conf);

Shouldn't be virtio-specific, all -drives should be able to autodetect
block size.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]