Commit 645b55d1 authored by Roman Kagan's avatar Roman Kagan Committed by Kevin Wolf
Browse files

qdev-properties: make blocksize accept size suffixes



It appears convenient to be able to specify physical_block_size and
logical_block_size using common size suffixes.

Teach the blocksize property setter to interpret them.  Also express the
upper and lower limits in the respective units.

Signed-off-by: default avatarRoman Kagan <rvkagan@yandex-team.ru>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Message-Id: <20200528225516.1676602-6-rvkagan@yandex-team.ru>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 914e74cd
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include "qapi/visitor.h"
#include "chardev/char.h"
#include "qemu/uuid.h"
#include "qemu/units.h"

void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
                                  Error **errp)
@@ -771,17 +772,18 @@ const PropertyInfo qdev_prop_size32 = {

/* lower limit is sector size */
#define MIN_BLOCK_SIZE          512
#define MIN_BLOCK_SIZE_STR      stringify(MIN_BLOCK_SIZE)
#define MIN_BLOCK_SIZE_STR      "512 B"
/* upper limit is the max power of 2 that fits in uint16_t */
#define MAX_BLOCK_SIZE          32768
#define MAX_BLOCK_SIZE_STR      stringify(MAX_BLOCK_SIZE)
#define MAX_BLOCK_SIZE          (32 * KiB)
#define MAX_BLOCK_SIZE_STR      "32 KiB"

static void set_blocksize(Object *obj, Visitor *v, const char *name,
                          void *opaque, Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    Property *prop = opaque;
    uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop);
    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
    uint64_t value;
    Error *local_err = NULL;

    if (dev->realized) {
@@ -789,7 +791,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
        return;
    }

    visit_type_uint16(v, name, &value, &local_err);
    visit_type_size(v, name, &value, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
@@ -797,7 +799,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
    /* value of 0 means "unset" */
    if (value && (value < MIN_BLOCK_SIZE || value > MAX_BLOCK_SIZE)) {
        error_setg(errp,
                   "Property %s.%s doesn't take value %" PRIu16
                   "Property %s.%s doesn't take value %" PRIu64
                   " (minimum: " MIN_BLOCK_SIZE_STR
                   ", maximum: " MAX_BLOCK_SIZE_STR ")",
                   dev->id ? : "", name, value);
@@ -816,7 +818,7 @@ static void set_blocksize(Object *obj, Visitor *v, const char *name,
}

const PropertyInfo qdev_prop_blocksize = {
    .name  = "uint16",
    .name  = "size",
    .description = "A power of two between " MIN_BLOCK_SIZE_STR
                   " and " MAX_BLOCK_SIZE_STR,
    .get   = get_uint16,