Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
qemu-nbd: fix regression with qemu-nbd --fork run over ssh
Commit e6df58a
    Author: Hanna Reitz <hreitz@redhat.com>
    Date:   Wed May 8 23:18:18 2019 +0200
    qemu-nbd: Do not close stderr

has introduced an interesting regression. Original behavior of
    ssh somehost qemu-nbd /home/den/tmp/file -f raw --fork
was the following:
 * qemu-nbd was started as a daemon
 * the command execution is done and ssh exited with success

The patch has changed this behavior and 'ssh' command now hangs forever.

According to the normal specification of the daemon() call, we should
endup with STDERR pointing to /dev/null. That should be done at the
very end of the successful startup sequence when the pipe to the
bootstrap process (used for diagnostics) is no longer needed.

This could be achived in the same way as done for 'qemu-nbd -c' case.
That was commit 0eaf453, also fixing up e6df58a. STDOUT copying to
STDERR does the trick.

This also leads to proper 'ssh' connection closing which fixes my
original problem.

Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Eric Blake <eblake@redhat.com>
CC: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
CC: Hanna Reitz <hreitz@redhat.com>
CC: <qemu-stable@nongnu.org>
Message-ID: <20230717145544.194786-3-den@openvz.org>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit 5c56dd2)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
  • Loading branch information
Denis V. Lunev authored and Michael Tokarev committed Jul 25, 2023
1 parent 15fae37 commit a436ddc
Showing 1 changed file with 4 additions and 9 deletions.
13 changes: 4 additions & 9 deletions qemu-nbd.c
Expand Up @@ -274,6 +274,7 @@ static void *show_parts(void *arg)

struct NbdClientOpts {
char *device;
bool fork_process;
};

static void *nbd_client_thread(void *arg)
Expand Down Expand Up @@ -317,7 +318,7 @@ static void *nbd_client_thread(void *arg)
/* update partition table */
pthread_create(&show_parts_thread, NULL, show_parts, opts->device);

if (verbose) {
if (verbose && !opts->fork_process) {
fprintf(stderr, "NBD device %s is now connected to %s\n",
opts->device, srcpath);
} else {
Expand Down Expand Up @@ -579,7 +580,6 @@ int main(int argc, char **argv)
bool writethrough = false; /* Client will flush as needed. */
bool fork_process = false;
bool list = false;
int old_stderr = -1;
unsigned socket_activation;
const char *pid_file_name = NULL;
const char *selinux_label = NULL;
Expand Down Expand Up @@ -934,11 +934,6 @@ int main(int argc, char **argv)
} else if (pid == 0) {
close(stderr_fd[0]);

/* Remember parent's stderr if we will be restoring it. */
if (fork_process) {
old_stderr = dup(STDERR_FILENO);
}

ret = qemu_daemon(1, 0);

/* Temporarily redirect stderr to the parent's pipe... */
Expand Down Expand Up @@ -1127,6 +1122,7 @@ int main(int argc, char **argv)
int ret;
struct NbdClientOpts opts = {
.device = device,
.fork_process = fork_process,
};

ret = pthread_create(&client_thread, NULL, nbd_client_thread, &opts);
Expand Down Expand Up @@ -1155,8 +1151,7 @@ int main(int argc, char **argv)
}

if (fork_process) {
dup2(old_stderr, STDERR_FILENO);
close(old_stderr);
dup2(STDOUT_FILENO, STDERR_FILENO);
}

state = RUNNING;
Expand Down

0 comments on commit a436ddc

Please sign in to comment.