[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 6/7] qemu-nbd: fix socket creation race
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 6/7] qemu-nbd: fix socket creation race |
Date: |
Fri, 4 Nov 2011 15:51:23 +0100 |
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: Paolo Bonzini <address@hidden>
---
qemu-nbd.c | 30 +++++++++++++++---------------
1 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 7490008..20fe4b5 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -204,10 +204,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);
@@ -484,8 +481,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.
*/
@@ -498,15 +493,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));
@@ -519,6 +505,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++;
--
1.7.6.4
- [Qemu-devel] [PATCH 0/7] reorganize operation of "qemu-nbd -c" and fix it, Paolo Bonzini, 2011/11/04
- [Qemu-devel] [PATCH 1/7] nbd: treat EPIPE from NBD_DO_IT as success, Paolo Bonzini, 2011/11/04
- [Qemu-devel] [PATCH 3/7] qemu-nbd: rename socket variable, Paolo Bonzini, 2011/11/04
- [Qemu-devel] [PATCH 2/7] qemu-nbd: trap SIGTERM, Paolo Bonzini, 2011/11/04
- [Qemu-devel] [PATCH 5/7] qemu-nbd: print error messages from the daemon through a pipe, Paolo Bonzini, 2011/11/04
- [Qemu-devel] [PATCH 4/7] qemu-nbd: move client to a thread, Paolo Bonzini, 2011/11/04
- [Qemu-devel] [PATCH 7/7] qemu-nbd: open the block device after starting the client thread, Paolo Bonzini, 2011/11/04
- [Qemu-devel] [PATCH 6/7] qemu-nbd: fix socket creation race,
Paolo Bonzini <=
- Re: [Qemu-devel] [PATCH 0/7] reorganize operation of "qemu-nbd -c" and fix it, Kevin Wolf, 2011/11/08