Browse Source
Move the constants from hw/core/qdev-properties.c to util/block-helpers.h so that knowledge of the min/max values is Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Coiby Xu <coiby.xu@gmail.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Acked-by: Eduardo Habkost <ehabkost@redhat.com> Message-id: 20200918080912.321299-5-coiby.xu@gmail.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>remotes/github/master
committed by
Stefan Hajnoczi
4 changed files with 71 additions and 26 deletions
@ -0,0 +1,46 @@ |
|||
/*
|
|||
* Block utility functions |
|||
* |
|||
* Copyright IBM, Corp. 2011 |
|||
* Copyright (c) 2020 Coiby Xu <coiby.xu@gmail.com> |
|||
* |
|||
* This work is licensed under the terms of the GNU GPL, version 2 or later. |
|||
* See the COPYING file in the top-level directory. |
|||
*/ |
|||
|
|||
#include "qemu/osdep.h" |
|||
#include "qapi/error.h" |
|||
#include "qapi/qmp/qerror.h" |
|||
#include "block-helpers.h" |
|||
|
|||
/**
|
|||
* check_block_size: |
|||
* @id: The unique ID of the object |
|||
* @name: The name of the property being validated |
|||
* @value: The block size in bytes |
|||
* @errp: A pointer to an area to store an error |
|||
* |
|||
* This function checks that the block size meets the following conditions: |
|||
* 1. At least MIN_BLOCK_SIZE |
|||
* 2. No larger than MAX_BLOCK_SIZE |
|||
* 3. A power of 2 |
|||
*/ |
|||
void check_block_size(const char *id, const char *name, int64_t value, |
|||
Error **errp) |
|||
{ |
|||
/* value of 0 means "unset" */ |
|||
if (value && (value < MIN_BLOCK_SIZE || value > MAX_BLOCK_SIZE)) { |
|||
error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, |
|||
id, name, value, MIN_BLOCK_SIZE, MAX_BLOCK_SIZE); |
|||
return; |
|||
} |
|||
|
|||
/* We rely on power-of-2 blocksizes for bitmasks */ |
|||
if ((value & (value - 1)) != 0) { |
|||
error_setg(errp, |
|||
"Property %s.%s doesn't take value '%" PRId64 |
|||
"', it's not a power of 2", |
|||
id, name, value); |
|||
return; |
|||
} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
#ifndef BLOCK_HELPERS_H |
|||
#define BLOCK_HELPERS_H |
|||
|
|||
#include "qemu/units.h" |
|||
|
|||
/* lower limit is sector size */ |
|||
#define MIN_BLOCK_SIZE INT64_C(512) |
|||
#define MIN_BLOCK_SIZE_STR "512 B" |
|||
/*
|
|||
* upper limit is arbitrary, 2 MiB looks sufficient for all sensible uses, and |
|||
* matches qcow2 cluster size limit |
|||
*/ |
|||
#define MAX_BLOCK_SIZE (2 * MiB) |
|||
#define MAX_BLOCK_SIZE_STR "2 MiB" |
|||
|
|||
void check_block_size(const char *id, const char *name, int64_t value, |
|||
Error **errp); |
|||
|
|||
#endif /* BLOCK_HELPERS_H */ |
|||
Loading…
Reference in new issue