All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marcelo Tosatti <mtosatti@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: Marcelo Tosatti <mtosatti@redhat.com>,
	qemu-devel <qemu-devel@nongnu.org>
Subject: [Qemu-devel] [patch 03/19] qemu: dynamic drive/drive_opt index allocation
Date: Tue, 10 Feb 2009 18:30:54 -0200	[thread overview]
Message-ID: <20090210203206.847585554@emt.localdomain> (raw)
In-Reply-To: 20090210203051.064692466@emt.localdomain

[-- Attachment #1: dynamic-drive-and-opt-index --]
[-- Type: text/plain, Size: 3713 bytes --]

Dynamically allocate drive options and drive table index, to reuse
indexes when devices are removed.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: trunk/sysemu.h
===================================================================
--- trunk.orig/sysemu.h
+++ trunk/sysemu.h
@@ -134,6 +134,7 @@ typedef struct DriveInfo {
     BlockInterfaceType type;
     int bus;
     int unit;
+    int used;
     BlockInterfaceErrorAction onerror;
     char serial[21];
 } DriveInfo;
Index: trunk/vl.c
===================================================================
--- trunk.orig/vl.c
+++ trunk/vl.c
@@ -246,6 +246,7 @@ static int nb_drives_opt;
 static struct drive_opt {
     const char *file;
     char opt[1024];
+    int used;
 } drives_opt[MAX_DRIVES];
 
 static CPUState *cur_cpu;
@@ -2135,22 +2136,50 @@ static int bt_parse(const char *opt)
 #define MTD_ALIAS "if=mtd"
 #define SD_ALIAS "index=0,if=sd"
 
+static int drive_opt_get_free_idx(void)
+{
+    int index;
+
+    for (index = 0; index < MAX_DRIVES; index++)
+        if (!drives_opt[index].used) {
+            drives_opt[index].used = 1;
+            return index;
+        }
+
+    return -1;
+}
+
+static int drive_get_free_idx(void)
+{
+    int index;
+
+    for (index = 0; index < MAX_DRIVES; index++)
+        if (!drives_table[index].used) {
+            drives_table[index].used = 1;
+            return index;
+        }
+
+    return -1;
+}
+
 static int drive_add(const char *file, const char *fmt, ...)
 {
     va_list ap;
+    int index = drive_opt_get_free_idx();
 
-    if (nb_drives_opt >= MAX_DRIVES) {
+    if (nb_drives_opt >= MAX_DRIVES || index == -1) {
         fprintf(stderr, "qemu: too many drives\n");
         exit(1);
     }
 
-    drives_opt[nb_drives_opt].file = file;
+    drives_opt[index].file = file;
     va_start(ap, fmt);
-    vsnprintf(drives_opt[nb_drives_opt].opt,
+    vsnprintf(drives_opt[index].opt,
               sizeof(drives_opt[0].opt), fmt, ap);
     va_end(ap);
 
-    return nb_drives_opt++;
+    nb_drives_opt++;
+    return index;
 }
 
 int drive_get_index(BlockInterfaceType type, int bus, int unit)
@@ -2159,10 +2188,11 @@ int drive_get_index(BlockInterfaceType t
 
     /* seek interface, bus and unit */
 
-    for (index = 0; index < nb_drives; index++)
+    for (index = 0; index < MAX_DRIVES; index++)
         if (drives_table[index].type == type &&
 	    drives_table[index].bus == bus &&
-	    drives_table[index].unit == unit)
+	    drives_table[index].unit == unit &&
+	    drives_table[index].used)
         return index;
 
     return -1;
@@ -2227,6 +2257,7 @@ static int drive_init(struct drive_opt *
     int index;
     int cache;
     int bdrv_flags, onerror;
+    int drives_table_idx;
     char *str = arg->opt;
     static const char * const params[] = { "bus", "unit", "if", "index",
                                            "cyls", "heads", "secs", "trans",
@@ -2501,11 +2532,12 @@ static int drive_init(struct drive_opt *
         snprintf(buf, sizeof(buf), "%s%s%i",
                  devname, mediastr, unit_id);
     bdrv = bdrv_new(buf);
-    drives_table[nb_drives].bdrv = bdrv;
-    drives_table[nb_drives].type = type;
-    drives_table[nb_drives].bus = bus_id;
-    drives_table[nb_drives].unit = unit_id;
-    drives_table[nb_drives].onerror = onerror;
+    drives_table_idx = drive_get_free_idx();
+    drives_table[drives_table_idx].bdrv = bdrv;
+    drives_table[drives_table_idx].type = type;
+    drives_table[drives_table_idx].bus = bus_id;
+    drives_table[drives_table_idx].unit = unit_id;
+    drives_table[drives_table_idx].onerror = onerror;
     strncpy(drives_table[nb_drives].serial, serial, sizeof(serial));
     nb_drives++;
 

-- 

  parent reply	other threads:[~2009-02-10 20:47 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-10 20:30 [Qemu-devel] [patch 00/19] acpi pci hotplug Marcelo Tosatti
2009-02-10 20:30 ` [Qemu-devel] [patch 01/19] qemu: add pci helper functions Marcelo Tosatti
2009-02-10 20:30 ` [Qemu-devel] [patch 02/19] qemu: return PCIDevice on net device init and record devfn Marcelo Tosatti
2009-02-10 20:30 ` Marcelo Tosatti [this message]
2009-02-10 20:30 ` [Qemu-devel] [patch 04/19] qemu: dynamic nic info index allocation Marcelo Tosatti
2009-02-10 20:30 ` [Qemu-devel] [patch 05/19] qemu: drive removal support Marcelo Tosatti
2009-02-10 20:30 ` [Qemu-devel] [patch 06/19] qemu: record devfn on block driver instance Marcelo Tosatti
2009-02-10 20:30 ` [Qemu-devel] [patch 07/19] qemu: move drives_opt for external use Marcelo Tosatti
2009-02-10 20:30 ` [Qemu-devel] [patch 08/19] qemu: net/drive add/remove tweaks Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 09/19] qemu: add net_client_uninit / qemu_find_vlan_client Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 10/19] qemu: add cpu_unregister_io_memory and make io mem table index dynamic Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 11/19] qemu: add qemu_free_irqs Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 12/19] qemu: add pci_unregister_device Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 13/19] qemu: warn if PCI region is not power of two Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 14/19] qemu: LSI SCSI and e1000 unregister callbacks Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 15/19] qemu: zero ioport_opaque on isa_unassign_ioport Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 16/19] qemu: initialize hot add system / acpi gpe Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 17/19] qemu: pci hotplug GPE support Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 18/19] From: Markus Armbruster <armbru@pond.sub.org> Marcelo Tosatti
2009-02-10 20:31 ` [Qemu-devel] [patch 19/19] qemu: PCI device, disk and host network hot-add / hot-remove Marcelo Tosatti
2009-02-11  2:26   ` [Qemu-devel] " Anthony Liguori
2009-02-11 15:00     ` Marcelo Tosatti
2009-02-11 15:32       ` Avi Kivity
2009-02-11 12:42 ` [Qemu-devel] [patch 00/19] acpi pci hotplug Markus Armbruster
2009-02-11 15:19 ` [Qemu-devel] " Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090210203206.847585554@emt.localdomain \
    --to=mtosatti@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.