|  | /* | 
|  | * 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; | 
|  | } | 
|  | } |