From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MRMj5-0002Yg-Pn for qemu-devel@nongnu.org; Thu, 16 Jul 2009 04:54:03 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MRMj0-0002VW-NB for qemu-devel@nongnu.org; Thu, 16 Jul 2009 04:54:03 -0400 Received: from [199.232.76.173] (port=34961 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MRMj0-0002VQ-GU for qemu-devel@nongnu.org; Thu, 16 Jul 2009 04:53:58 -0400 Received: from mx2.redhat.com ([66.187.237.31]:52501) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MRMiz-0006Yk-SC for qemu-devel@nongnu.org; Thu, 16 Jul 2009 04:53:58 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6G8rvZU009654 for ; Thu, 16 Jul 2009 04:53:57 -0400 From: Gerd Hoffmann Date: Thu, 16 Jul 2009 10:53:47 +0200 Message-Id: <1247734428-17757-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1247734428-17757-1-git-send-email-kraxel@redhat.com> References: <1247734428-17757-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH v2 2/3] add support for drive ids. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann -drive accepts the new id= now, allowing to explicitely name your drives. They will show up with that name in "info block" if specified, otherwise the existing namimg scheme is used to autogenerate one. There is also a new function to lookup drives by name. Not used yet. The plan is to link disk drivers and drives using the drive id instead of passing around pointers to BlockDriveState. Signed-off-by: Gerd Hoffmann --- sysemu.h | 2 ++ vl.c | 50 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/sysemu.h b/sysemu.h index 36d6aaa..1f7532a 100644 --- a/sysemu.h +++ b/sysemu.h @@ -160,6 +160,7 @@ typedef enum { typedef struct DriveInfo { BlockDriverState *bdrv; + char *id; const char *devaddr; BlockInterfaceType type; int bus; @@ -177,6 +178,7 @@ typedef struct DriveInfo { extern TAILQ_HEAD(drivelist, DriveInfo) drives; extern DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit); +extern DriveInfo *drive_get_by_id(char *id); extern int drive_get_max_bus(BlockInterfaceType type); extern void drive_uninit(BlockDriverState *bdrv); extern void drive_remove(int index); diff --git a/vl.c b/vl.c index 4dae7ad..fc321ae 100644 --- a/vl.c +++ b/vl.c @@ -1919,6 +1919,18 @@ DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit) return NULL; } +DriveInfo *drive_get_by_id(char *id) +{ + DriveInfo *dinfo; + + TAILQ_FOREACH(dinfo, &drives, next) { + if (strcmp(id, dinfo->id)) + continue; + return dinfo; + } + return NULL; +} + int drive_get_max_bus(BlockInterfaceType type) { int max_bus; @@ -1988,7 +2000,6 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, enum { MEDIA_DISK, MEDIA_CDROM } media; int bus_id, unit_id; int cyls, heads, secs, translation; - BlockDriverState *bdrv; BlockDriver *drv = NULL; QEMUMachine *machine = opaque; int max_devs; @@ -2002,7 +2013,7 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, "cyls", "heads", "secs", "trans", "media", "snapshot", "file", "cache", "format", "serial", - "werror", "addr", + "werror", "addr", "name", NULL }; *fatal_error = 1; @@ -2278,17 +2289,20 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, /* init */ - if (type == IF_IDE || type == IF_SCSI) - mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd"; - if (max_devs) - snprintf(buf, sizeof(buf), "%s%i%s%i", - devname, bus_id, mediastr, unit_id); - else - snprintf(buf, sizeof(buf), "%s%s%i", - devname, mediastr, unit_id); - bdrv = bdrv_new(buf); dinfo = qemu_mallocz(sizeof(*dinfo)); - dinfo->bdrv = bdrv; + if (!get_param_value(buf, sizeof(buf), "id", str)) { + /* no name supplied -> create one */ + if (type == IF_IDE || type == IF_SCSI) + mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd"; + if (max_devs) + snprintf(buf, sizeof(buf), "%s%i%s%i", + devname, bus_id, mediastr, unit_id); + else + snprintf(buf, sizeof(buf), "%s%s%i", + devname, mediastr, unit_id); + } + dinfo->id = qemu_strdup(buf); + dinfo->bdrv = bdrv_new(dinfo->id); dinfo->devaddr = devaddr; dinfo->type = type; dinfo->bus = bus_id; @@ -2305,12 +2319,12 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, switch(media) { case MEDIA_DISK: if (cyls != 0) { - bdrv_set_geometry_hint(bdrv, cyls, heads, secs); - bdrv_set_translation_hint(bdrv, translation); + bdrv_set_geometry_hint(dinfo->bdrv, cyls, heads, secs); + bdrv_set_translation_hint(dinfo->bdrv, translation); } break; case MEDIA_CDROM: - bdrv_set_type_hint(bdrv, BDRV_TYPE_CDROM); + bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_CDROM); break; } break; @@ -2318,7 +2332,7 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, /* FIXME: This isn't really a floppy, but it's a reasonable approximation. */ case IF_FLOPPY: - bdrv_set_type_hint(bdrv, BDRV_TYPE_FLOPPY); + bdrv_set_type_hint(dinfo->bdrv, BDRV_TYPE_FLOPPY); break; case IF_PFLASH: case IF_MTD: @@ -2340,12 +2354,12 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, bdrv_flags |= BDRV_O_NOCACHE; else if (cache == 2) /* write-back */ bdrv_flags |= BDRV_O_CACHE_WB; - if (bdrv_open2(bdrv, file, bdrv_flags, drv) < 0) { + if (bdrv_open2(dinfo->bdrv, file, bdrv_flags, drv) < 0) { fprintf(stderr, "qemu: could not open disk image %s\n", file); return NULL; } - if (bdrv_key_required(bdrv)) + if (bdrv_key_required(dinfo->bdrv)) autostart = 0; *fatal_error = 0; return dinfo; -- 1.6.2.5