提交 f1ef5555 编写于 作者: P Paolo Bonzini 提交者: Kevin Wolf

qemu-nbd: fix socket creation race

Now that the client and server are in the same process, there is
no need to race on the creation of the socket.  We can open the
listening socket before starting the client thread.

This avoids that "qemu-nbd -v -c" prints this once before connecting
successfully to the socket:

    connect(unix:/var/lock/qemu-nbd-nbd0): No such file or directory
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 c1f8fdc3
......@@ -205,10 +205,7 @@ static void *nbd_client_thread(void *arg)
do {
sock = unix_socket_outgoing(sockpath);
if (sock == -1) {
if (errno != ENOENT && errno != ECONNREFUSED) {
goto out;
}
sleep(1); /* wait parent */
goto out;
}
} while (sock == -1);
......@@ -480,8 +477,6 @@ int main(int argc, char **argv)
err(EXIT_FAILURE, "Could not find partition %d", partition);
if (device) {
int ret;
/* Open before spawning new threads. In the future, we may
* drop privileges after opening.
*/
......@@ -494,15 +489,6 @@ int main(int argc, char **argv)
sockpath = g_malloc(128);
snprintf(sockpath, 128, SOCKET_PATH, basename(device));
}
ret = pthread_create(&client_thread, NULL, nbd_client_thread, &fd);
if (ret != 0) {
errx(EXIT_FAILURE, "Failed to create client thread: %s",
strerror(ret));
}
} else {
/* Shut up GCC warnings. */
memset(&client_thread, 0, sizeof(client_thread));
}
sharing_fds = g_malloc((shared + 1) * sizeof(int));
......@@ -515,6 +501,20 @@ int main(int argc, char **argv)
if (sharing_fds[0] == -1)
return 1;
if (device) {
int ret;
ret = pthread_create(&client_thread, NULL, nbd_client_thread, &fd);
if (ret != 0) {
errx(EXIT_FAILURE, "Failed to create client thread: %s",
strerror(ret));
}
} else {
/* Shut up GCC warnings. */
memset(&client_thread, 0, sizeof(client_thread));
}
max_fd = sharing_fds[0];
nb_fds++;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册