[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/12] nbd: register named exports
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 10/12] nbd: register named exports |
Date: |
Wed, 19 Sep 2012 15:49:54 +0200 |
Add an API to register and find named exports.
Signed-off-by: Paolo Bonzini <address@hidden>
---
nbd.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
nbd.h | 4 ++++
2 file modificati, 53 inserzioni(+)
diff --git a/nbd.c b/nbd.c
index 2e9de70..2d2221c 100644
--- a/nbd.c
+++ b/nbd.c
@@ -93,13 +93,17 @@ struct NBDExport {
void (*close)(NBDExport *exp);
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);
@@ -740,6 +744,39 @@ 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)
+{
+ if (exp->name == name) {
+ return;
+ }
+
+ nbd_export_get(exp);
+ if (exp->name != NULL) {
+ g_free(exp->name);
+ exp->name = NULL;
+ QTAILQ_REMOVE(&exports, exp, next);
+ nbd_export_put(exp);
+ }
+ if (name != NULL) {
+ nbd_export_get(exp);
+ exp->name = g_strdup(name);
+ QTAILQ_INSERT_TAIL(&exports, exp, next);
+ }
+ nbd_export_put(exp);
+}
+
void nbd_export_close(NBDExport *exp)
{
NBDClient *client, *next;
@@ -765,6 +802,8 @@ void nbd_export_put(NBDExport *exp)
}
if (--exp->refcount == 0) {
+ assert(exp->name == NULL);
+
if (exp->close) {
exp->close(exp);
}
@@ -780,6 +819,16 @@ void nbd_export_put(NBDExport *exp)
}
}
+void nbd_export_close_all(void)
+{
+ NBDExport *exp, *next;
+
+ QTAILQ_FOREACH_SAFE(exp, &exports, next, next) {
+ nbd_export_close(exp);
+ nbd_export_set_name(exp, NULL);
+ }
+}
+
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 895820b..f0edb9c 100644
--- a/nbd.h
+++ b/nbd.h
@@ -85,6 +85,10 @@ void nbd_export_close(NBDExport *exp);
void nbd_export_get(NBDExport *exp);
void nbd_export_put(NBDExport *exp);
+NBDExport *nbd_export_find(const char *name);
+void nbd_export_set_name(NBDExport *exp, const char *name);
+void nbd_export_close_all(void);
+
NBDClient *nbd_client_new(NBDExport *exp, int csock,
void (*close)(NBDClient *));
void nbd_client_close(NBDClient *client);
--
1.7.12
- [Qemu-devel] [PATCH 01/12] nbd: add more constants, (continued)
- [Qemu-devel] [PATCH 01/12] nbd: add more constants, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 03/12] nbd: do not close BlockDriverState in nbd_export_close, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 02/12] nbd: pass NBDClient to nbd_send_negotiate, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 04/12] nbd: make refcount interface public, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 05/12] nbd: do not leak nbd_trip coroutines when a connection is torn down, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 06/12] nbd: add reference counting to NBDExport, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 08/12] nbd: add notification for closing an NBDExport, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 11/12] nbd: negotiate with named exports, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 07/12] nbd: track clients into NBDExport, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 09/12] qemu-nbd: rewrite termination conditions to use a state machine, Paolo Bonzini, 2012/09/19
- [Qemu-devel] [PATCH 10/12] nbd: register named exports,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 12/12] nbd: add nbd_export_get_blockdev, Paolo Bonzini, 2012/09/19
- Re: [Qemu-devel] [PULL 00/12] NBD patches for 2012-09-22, Anthony Liguori, 2012/09/25