nbd: register named exports

Add an API to register and find named exports.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2012-08-22 15:59:23 +02:00
parent 7860a380ac
commit ee0a19ec2a
2 changed files with 53 additions and 0 deletions

49
nbd.c
View File

@ -93,13 +93,17 @@ struct NBDExport {
void (*close)(NBDExport *exp); void (*close)(NBDExport *exp);
BlockDriverState *bs; BlockDriverState *bs;
char *name;
off_t dev_offset; off_t dev_offset;
off_t size; off_t size;
uint32_t nbdflags; uint32_t nbdflags;
QTAILQ_HEAD(, NBDClient) clients; QTAILQ_HEAD(, NBDClient) clients;
QSIMPLEQ_HEAD(, NBDRequest) requests; QSIMPLEQ_HEAD(, NBDRequest) requests;
QTAILQ_ENTRY(NBDExport) next;
}; };
static QTAILQ_HEAD(, NBDExport) exports = QTAILQ_HEAD_INITIALIZER(exports);
struct NBDClient { struct NBDClient {
int refcount; int refcount;
void (*close)(NBDClient *client); void (*close)(NBDClient *client);
@ -740,6 +744,39 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset,
return exp; 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) void nbd_export_close(NBDExport *exp)
{ {
NBDClient *client, *next; NBDClient *client, *next;
@ -765,6 +802,8 @@ void nbd_export_put(NBDExport *exp)
} }
if (--exp->refcount == 0) { if (--exp->refcount == 0) {
assert(exp->name == NULL);
if (exp->close) { if (exp->close) {
exp->close(exp); 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 int nbd_can_read(void *opaque);
static void nbd_read(void *opaque); static void nbd_read(void *opaque);
static void nbd_restart_write(void *opaque); static void nbd_restart_write(void *opaque);

4
nbd.h
View File

@ -85,6 +85,10 @@ void nbd_export_close(NBDExport *exp);
void nbd_export_get(NBDExport *exp); void nbd_export_get(NBDExport *exp);
void nbd_export_put(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, NBDClient *nbd_client_new(NBDExport *exp, int csock,
void (*close)(NBDClient *)); void (*close)(NBDClient *));
void nbd_client_close(NBDClient *client); void nbd_client_close(NBDClient *client);