From 99543ca6a3c2f78e84c3c74addde3c7bfa89b1f7 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 5 Mar 2014 17:32:58 +0100 Subject: QMP: Relax __com.redhat_drive_add parameter checking RH-Author: Markus Armbruster Message-id: <1394040778-1544-2-git-send-email-armbru@redhat.com> Patchwork-id: 58021 O-Subject: [PATCH 7.0 qemu-kvm 1/1] QMP: Relax __com.redhat_drive_add parameter checking Bugzilla: 1057471 RH-Acked-by: Paolo Bonzini RH-Acked-by: Fam Zheng RH-Acked-by: Amos Kong RH-Acked-by: Kevin Wolf RH-Acked-by: Stefan Hajnoczi I/O throttling and many new features are unavailable with this command, because its parameter checking is overly restrictive. Relax it. The command was forward-ported from RHEL-6 (commit 75ad257). It provides access to drive_init() via QMP with the parameters restricted to a subset of the ones recognized by drive_init(). We did that because some parameters make sense only when configuring a frontend in addition to a backend, and the command doesn't do that. The parameter filtering is implemented as a whitelist. The forward-port neglected to update the whitelist for all the stuff that has changed since RHEL-6. Due to new features like driver-specific parameters, a whitelist is no longer convenient. Replace by a blacklist that contains exactly the drive_init() parameters that are already filtered out on RHEL-6. Signed-off-by: Markus Armbruster diff --git a/device-hotplug.c b/device-hotplug.c index 7d4dc92..c11eac8 100644 --- a/device-hotplug.c +++ b/device-hotplug.c @@ -82,13 +82,8 @@ err: static void check_parm(const char *key, QObject *obj, void *opaque) { - static const char *valid_keys[] = { - "id", "cyls", "heads", "secs", "trans", "media", "snapshot", - "file", "cache", "aio", "format", "serial", "rerror", "werror", - "readonly", "copy-on-read", -#ifdef CONFIG_BLOCK_IO_THROTTLING - "bps", "bps_rd", "bps_wr", "iops", "iops_rd", "iops_wr", -#endif + static const char *unwanted_keys[] = { + "bus", "unit", "index", "if", "boot", "addr", NULL }; @@ -99,14 +94,14 @@ static void check_parm(const char *key, QObject *obj, void *opaque) return; } - for (p = valid_keys; *p; p++) { + for (p = unwanted_keys; *p; p++) { if (!strcmp(key, *p)) { + qerror_report(QERR_INVALID_PARAMETER, key); + *stopped = 1; return; } } - qerror_report(QERR_INVALID_PARAMETER, key); - *stopped = 1; } int simple_drive_add(Monitor *mon, const QDict *qdict, QObject **ret_data)