mirror of https://github.com/xemu-project/xemu.git
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:
parent
7860a380ac
commit
ee0a19ec2a
49
nbd.c
49
nbd.c
|
@ -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
4
nbd.h
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue