mirror of https://github.com/xemu-project/xemu.git
qemu-nbd: Switch to qemu_set_fd_handler
Achieved by: - Remembering the server fd with a global variable, in order to access it from nbd_client_closed. - Checking nbd_can_accept() and updating server_fd handler whenever client connects or disconnects. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <1432032670-15124-3-git-send-email-famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
dae02ba55a
commit
e4afbf4fb4
21
qemu-nbd.c
21
qemu-nbd.c
|
@ -53,6 +53,7 @@ static int persistent = 0;
|
||||||
static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
|
static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state;
|
||||||
static int shared = 1;
|
static int shared = 1;
|
||||||
static int nb_fds;
|
static int nb_fds;
|
||||||
|
static int server_fd;
|
||||||
|
|
||||||
static void usage(const char *name)
|
static void usage(const char *name)
|
||||||
{
|
{
|
||||||
|
@ -340,7 +341,7 @@ out:
|
||||||
return (void *) EXIT_FAILURE;
|
return (void *) EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nbd_can_accept(void *opaque)
|
static int nbd_can_accept(void)
|
||||||
{
|
{
|
||||||
return nb_fds < shared;
|
return nb_fds < shared;
|
||||||
}
|
}
|
||||||
|
@ -351,19 +352,21 @@ static void nbd_export_closed(NBDExport *exp)
|
||||||
state = TERMINATED;
|
state = TERMINATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nbd_update_server_fd_handler(int fd);
|
||||||
|
|
||||||
static void nbd_client_closed(NBDClient *client)
|
static void nbd_client_closed(NBDClient *client)
|
||||||
{
|
{
|
||||||
nb_fds--;
|
nb_fds--;
|
||||||
if (nb_fds == 0 && !persistent && state == RUNNING) {
|
if (nb_fds == 0 && !persistent && state == RUNNING) {
|
||||||
state = TERMINATE;
|
state = TERMINATE;
|
||||||
}
|
}
|
||||||
|
nbd_update_server_fd_handler(server_fd);
|
||||||
qemu_notify_event();
|
qemu_notify_event();
|
||||||
nbd_client_put(client);
|
nbd_client_put(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nbd_accept(void *opaque)
|
static void nbd_accept(void *opaque)
|
||||||
{
|
{
|
||||||
int server_fd = (uintptr_t) opaque;
|
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
socklen_t addr_len = sizeof(addr);
|
socklen_t addr_len = sizeof(addr);
|
||||||
|
|
||||||
|
@ -380,12 +383,22 @@ static void nbd_accept(void *opaque)
|
||||||
|
|
||||||
if (nbd_client_new(exp, fd, nbd_client_closed)) {
|
if (nbd_client_new(exp, fd, nbd_client_closed)) {
|
||||||
nb_fds++;
|
nb_fds++;
|
||||||
|
nbd_update_server_fd_handler(server_fd);
|
||||||
} else {
|
} else {
|
||||||
shutdown(fd, 2);
|
shutdown(fd, 2);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nbd_update_server_fd_handler(int fd)
|
||||||
|
{
|
||||||
|
if (nbd_can_accept()) {
|
||||||
|
qemu_set_fd_handler(fd, nbd_accept, NULL, (void *)(uintptr_t)fd);
|
||||||
|
} else {
|
||||||
|
qemu_set_fd_handler(fd, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
|
@ -761,8 +774,8 @@ int main(int argc, char **argv)
|
||||||
memset(&client_thread, 0, sizeof(client_thread));
|
memset(&client_thread, 0, sizeof(client_thread));
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_set_fd_handler2(fd, nbd_can_accept, nbd_accept, NULL,
|
server_fd = fd;
|
||||||
(void *)(uintptr_t)fd);
|
nbd_update_server_fd_handler(fd);
|
||||||
|
|
||||||
/* now when the initialization is (almost) complete, chdir("/")
|
/* now when the initialization is (almost) complete, chdir("/")
|
||||||
* to free any busy filesystems */
|
* to free any busy filesystems */
|
||||||
|
|
Loading…
Reference in New Issue