From f845f246b2701879e5f4c26a71f8e99f75c62aa2 Mon Sep 17 00:00:00 2001 From: John Snow Date: Tue, 7 Oct 2014 10:52:20 +0200 Subject: [PATCH 02/21] blockdev: Allow overriding if_max_dev property Message-id: <1412679144-17302-3-git-send-email-jsnow@redhat.com> Patchwork-id: 61598 O-Subject: [RHEV-7.1 qemu-kvm-rhev PATCH 2/6] blockdev: Allow overriding if_max_dev property Bugzilla: 946993 RH-Acked-by: Michael S. Tsirkin RH-Acked-by: Dr. David Alan Gilbert (git) RH-Acked-by: Markus Armbruster The if_max_devs table as in the past been an immutable default that controls the mapping of index => (bus,unit) for all boards and all HBAs for each interface type. Since adding this mapping information to the HBA device itself is currently unwieldly from the perspective of retrieving this information at option parsing time (e.g, within drive_new), we consider the alternative of marking the if_max_devs table mutable so that later configuration and initialization can adjust the mapping at will, but only up until a drive is added, at which point the mapping is finalized. Signed-off-by: John Snow Reviewed-by: Markus Armbruster Message-id: 1412187569-23452-3-git-send-email-jsnow@redhat.com Signed-off-by: Stefan Hajnoczi (cherry picked from commit 21dff8cf38d311a917ab33f19d5cea7696f0c354) Signed-off-by: John Snow Signed-off-by: Miroslav Rezanina --- blockdev.c | 26 +++++++++++++++++++++++++- include/sysemu/blockdev.h | 2 ++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/blockdev.c b/blockdev.c index 85e6a07..9943ad3 100644 --- a/blockdev.c +++ b/blockdev.c @@ -59,7 +59,7 @@ static const char *const if_name[IF_COUNT] = { [IF_XEN] = "xen", }; -static const int if_max_devs[IF_COUNT] = { +static int if_max_devs[IF_COUNT] = { /* * Do not change these numbers! They govern how drive option * index maps to unit and bus. That mapping is ABI. @@ -78,6 +78,30 @@ static const int if_max_devs[IF_COUNT] = { [IF_SCSI] = 7, }; +/** + * Boards may call this to offer board-by-board overrides + * of the default, global values. + */ +void override_max_devs(BlockInterfaceType type, int max_devs) +{ + DriveInfo *dinfo; + + if (max_devs <= 0) { + return; + } + + QTAILQ_FOREACH(dinfo, &drives, next) { + if (dinfo->type == type) { + fprintf(stderr, "Cannot override units-per-bus property of" + " the %s interface, because a drive of that type has" + " already been added.\n", if_name[type]); + g_assert_not_reached(); + } + } + + if_max_devs[type] = max_devs; +} + /* * We automatically delete the drive when a device using it gets * unplugged. Questionable feature, but we can't just drop it. diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h index 41fe5af..2a7b42d 100644 --- a/include/sysemu/blockdev.h +++ b/include/sysemu/blockdev.h @@ -46,6 +46,8 @@ struct DriveInfo { QTAILQ_ENTRY(DriveInfo) next; }; +void override_max_devs(BlockInterfaceType type, int max_devs); + DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit); bool drive_check_orphaned(void); DriveInfo *drive_get_by_index(BlockInterfaceType type, int index); -- 1.8.3.1