block: use Error in do_check_io_limits()

The do_check_io_limits() function returns false when I/O limits are
invalid but it doesn't set an Error to indicate why.  The two
do_check_io_limits() callers duplicate error reporting.  Solve this by
passing an Error pointer into do_check_io_limits().

Note that the two callers report slightly different errors: drive_init()
prints a custom error message while qmp_block_set_io_throttle() does
error_set(errp, QERR_INVALID_PARAMETER_COMBINATION).

QERR_INVALID_PARAMETER_COMBINATION is a generic error, see
include/qapi/qmp/qerror.h:

  #define QERR_INVALID_PARAMETER_COMBINATION \
    ERROR_CLASS_GENERIC_ERROR, "Invalid parameter combination"

Since it is generic we are not obliged to keep this error.  Switch to
the custom error message which contains more information.

This patch prepares for adding additional checks with their own error
messages to do_check_io_limits().  The next patch adds a new check.

Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2013-02-13 16:53:42 +01:00 committed by Kevin Wolf
parent 4db35162ea
commit c546194f26

View File

@ -255,7 +255,7 @@ static int parse_block_error_action(const char *buf, bool is_read)
} }
} }
static bool do_check_io_limits(BlockIOLimit *io_limits) static bool do_check_io_limits(BlockIOLimit *io_limits, Error **errp)
{ {
bool bps_flag; bool bps_flag;
bool iops_flag; bool iops_flag;
@ -269,6 +269,8 @@ static bool do_check_io_limits(BlockIOLimit *io_limits)
&& ((io_limits->iops[BLOCK_IO_LIMIT_READ] != 0) && ((io_limits->iops[BLOCK_IO_LIMIT_READ] != 0)
|| (io_limits->iops[BLOCK_IO_LIMIT_WRITE] != 0)); || (io_limits->iops[BLOCK_IO_LIMIT_WRITE] != 0));
if (bps_flag || iops_flag) { if (bps_flag || iops_flag) {
error_setg(errp, "bps(iops) and bps_rd/bps_wr(iops_rd/iops_wr) "
"cannot be used at the same time");
return false; return false;
} }
@ -297,6 +299,7 @@ DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType block_default_type)
int snapshot = 0; int snapshot = 0;
bool copy_on_read; bool copy_on_read;
int ret; int ret;
Error *error = NULL;
translation = BIOS_ATA_TRANSLATION_AUTO; translation = BIOS_ATA_TRANSLATION_AUTO;
media = MEDIA_DISK; media = MEDIA_DISK;
@ -427,9 +430,9 @@ DriveInfo *drive_init(QemuOpts *opts, BlockInterfaceType block_default_type)
io_limits.iops[BLOCK_IO_LIMIT_WRITE] = io_limits.iops[BLOCK_IO_LIMIT_WRITE] =
qemu_opt_get_number(opts, "iops_wr", 0); qemu_opt_get_number(opts, "iops_wr", 0);
if (!do_check_io_limits(&io_limits)) { if (!do_check_io_limits(&io_limits, &error)) {
error_report("bps(iops) and bps_rd/bps_wr(iops_rd/iops_wr) " error_report("%s", error_get_pretty(error));
"cannot be used at the same time"); error_free(error);
return NULL; return NULL;
} }
@ -975,8 +978,7 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
io_limits.iops[BLOCK_IO_LIMIT_READ] = iops_rd; io_limits.iops[BLOCK_IO_LIMIT_READ] = iops_rd;
io_limits.iops[BLOCK_IO_LIMIT_WRITE]= iops_wr; io_limits.iops[BLOCK_IO_LIMIT_WRITE]= iops_wr;
if (!do_check_io_limits(&io_limits)) { if (!do_check_io_limits(&io_limits, errp)) {
error_set(errp, QERR_INVALID_PARAMETER_COMBINATION);
return; return;
} }