From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38211) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T60o7-0005Ye-Ve for qemu-devel@nongnu.org; Mon, 27 Aug 2012 11:00:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T60o1-0005cn-PT for qemu-devel@nongnu.org; Mon, 27 Aug 2012 11:00:51 -0400 Received: from mail-ee0-f45.google.com ([74.125.83.45]:65213) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T60o1-0005aJ-J4 for qemu-devel@nongnu.org; Mon, 27 Aug 2012 11:00:45 -0400 Received: by mail-ee0-f45.google.com with SMTP id e53so1535403eek.4 for ; Mon, 27 Aug 2012 08:00:45 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 27 Aug 2012 17:00:18 +0200 Message-Id: <1346079626-16386-6-git-send-email-pbonzini@redhat.com> In-Reply-To: <1346079626-16386-1-git-send-email-pbonzini@redhat.com> References: <1346079626-16386-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [RFC PATCH 05/13] nbd: register named exports List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, stefanha@gmail.com Add an API to register and find named exports. Signed-off-by: Paolo Bonzini --- nbd.c | 38 ++++++++++++++++++++++++++++++++++++++ nbd.h | 3 +++ 2 file modificati, 41 inserzioni(+) diff --git a/nbd.c b/nbd.c index f6eaea3..1249548 100644 --- a/nbd.c +++ b/nbd.c @@ -90,13 +90,17 @@ struct NBDRequest { struct NBDExport { BlockDriverState *bs; + char *name; off_t dev_offset; off_t size; uint32_t nbdflags; QTAILQ_HEAD(, NBDClient) clients; QSIMPLEQ_HEAD(, NBDRequest) requests; + QTAILQ_ENTRY(NBDExport) next; }; +static QTAILQ_HEAD(, NBDExport) exports = QTAILQ_HEAD_INITIALIZER(exports); + struct NBDClient { int refcount; void (*close)(NBDClient *client); @@ -724,6 +728,27 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset, return exp; } +NBDExport *nbd_export_find(const char *name) +{ + NBDExport *exp; + QTAILQ_FOREACH(exp, &exports, next) { + if (strcmp(name, exp->name) == 0) { + return exp; + } + } + + return NULL; +} + +void nbd_export_set_name(NBDExport *exp, const char *name) +{ + assert(exp->name == NULL); + assert(!nbd_export_find(name)); + + exp->name = g_strdup(name); + QTAILQ_INSERT_TAIL(&exports, exp, next); +} + void nbd_export_close(NBDExport *exp) { while (!QTAILQ_EMPTY(&exp->clients)) { @@ -738,10 +763,23 @@ void nbd_export_close(NBDExport *exp) g_free(first); } + if (exp->name) { + QTAILQ_REMOVE(&exports, exp, next); + g_free(exp->name); + } + bdrv_close(exp->bs); g_free(exp); } +void nbd_export_close_all(void) +{ + while (!QTAILQ_EMPTY(&exports)) { + NBDExport *export = QTAILQ_FIRST(&exports); + nbd_export_close(export); + } +} + static int nbd_can_read(void *opaque); static void nbd_read(void *opaque); static void nbd_restart_write(void *opaque); diff --git a/nbd.h b/nbd.h index 6305d68..88ca324 100644 --- a/nbd.h +++ b/nbd.h @@ -80,7 +80,10 @@ typedef struct NBDClient NBDClient; NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset, off_t size, uint32_t nbdflags); +NBDExport *nbd_export_find(const char *name); +void nbd_export_set_name(NBDExport *exp, const char *name); void nbd_export_close(NBDExport *exp); +void nbd_export_close_all(void); NBDClient *nbd_client_new(NBDExport *exp, int csock, void (*close)(NBDClient *)); -- 1.7.11.2