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:
Fam Zheng 2015-05-19 10:50:59 +00:00 committed by Paolo Bonzini
parent dae02ba55a
commit e4afbf4fb4
1 changed files with 17 additions and 4 deletions

View File

@ -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 */