diff options
Diffstat (limited to 'tools/virtiofsd/fuse_virtio.c')
-rw-r--r-- | tools/virtiofsd/fuse_virtio.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/tools/virtiofsd/fuse_virtio.c b/tools/virtiofsd/fuse_virtio.c index 7e2711b504..635f87756a 100644 --- a/tools/virtiofsd/fuse_virtio.c +++ b/tools/virtiofsd/fuse_virtio.c @@ -638,18 +638,21 @@ int virtio_loop(struct fuse_session *se) return 0; } -int virtio_session_mount(struct fuse_session *se) +static int fv_create_listen_socket(struct fuse_session *se) { struct sockaddr_un un; mode_t old_umask; + /* Nothing to do if fd is already initialized */ + if (se->vu_listen_fd >= 0) { + return 0; + } + if (strlen(se->vu_socket_path) >= sizeof(un.sun_path)) { fuse_log(FUSE_LOG_ERR, "Socket path too long\n"); return -1; } - se->fd = -1; - /* * Create the Unix socket to communicate with qemu * based on QEMU's vhost-user-bridge @@ -682,15 +685,31 @@ int virtio_session_mount(struct fuse_session *se) return -1; } + se->vu_listen_fd = listen_sock; + return 0; +} + +int virtio_session_mount(struct fuse_session *se) +{ + int ret; + + ret = fv_create_listen_socket(se); + if (ret < 0) { + return ret; + } + + se->fd = -1; + fuse_log(FUSE_LOG_INFO, "%s: Waiting for vhost-user socket connection...\n", __func__); - int data_sock = accept(listen_sock, NULL, NULL); + int data_sock = accept(se->vu_listen_fd, NULL, NULL); if (data_sock == -1) { fuse_log(FUSE_LOG_ERR, "vhost socket accept: %m\n"); - close(listen_sock); + close(se->vu_listen_fd); return -1; } - close(listen_sock); + close(se->vu_listen_fd); + se->vu_listen_fd = -1; fuse_log(FUSE_LOG_INFO, "%s: Received vhost-user socket connection\n", __func__); |