qemu-nbd: Add --fork option
Using the --fork option, one can make qemu-nbd fork the worker process. The original process will exit on error of the worker or once the worker enters the main loop. Suggested-by: Sascha Silbe <silbe@linux.vnet.ibm.com> Signed-off-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
a26ddb4396
commit
ffb31e1da7
17
qemu-nbd.c
17
qemu-nbd.c
|
@ -48,6 +48,7 @@
|
||||||
#define QEMU_NBD_OPT_OBJECT 260
|
#define QEMU_NBD_OPT_OBJECT 260
|
||||||
#define QEMU_NBD_OPT_TLSCREDS 261
|
#define QEMU_NBD_OPT_TLSCREDS 261
|
||||||
#define QEMU_NBD_OPT_IMAGE_OPTS 262
|
#define QEMU_NBD_OPT_IMAGE_OPTS 262
|
||||||
|
#define QEMU_NBD_OPT_FORK 263
|
||||||
|
|
||||||
#define MBR_SIZE 512
|
#define MBR_SIZE 512
|
||||||
|
|
||||||
|
@ -92,6 +93,8 @@ static void usage(const char *name)
|
||||||
" passwords and/or encryption keys\n"
|
" passwords and/or encryption keys\n"
|
||||||
" -T, --trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
|
" -T, --trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
|
||||||
" specify tracing options\n"
|
" specify tracing options\n"
|
||||||
|
" --fork fork off the server process and exit the parent\n"
|
||||||
|
" once the server is running\n"
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
"Kernel NBD client support:\n"
|
"Kernel NBD client support:\n"
|
||||||
" -c, --connect=DEV connect FILE to the local NBD device DEV\n"
|
" -c, --connect=DEV connect FILE to the local NBD device DEV\n"
|
||||||
|
@ -503,6 +506,7 @@ int main(int argc, char **argv)
|
||||||
{ "tls-creds", required_argument, NULL, QEMU_NBD_OPT_TLSCREDS },
|
{ "tls-creds", required_argument, NULL, QEMU_NBD_OPT_TLSCREDS },
|
||||||
{ "image-opts", no_argument, NULL, QEMU_NBD_OPT_IMAGE_OPTS },
|
{ "image-opts", no_argument, NULL, QEMU_NBD_OPT_IMAGE_OPTS },
|
||||||
{ "trace", required_argument, NULL, 'T' },
|
{ "trace", required_argument, NULL, 'T' },
|
||||||
|
{ "fork", no_argument, NULL, QEMU_NBD_OPT_FORK },
|
||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
int ch;
|
int ch;
|
||||||
|
@ -524,6 +528,8 @@ int main(int argc, char **argv)
|
||||||
bool imageOpts = false;
|
bool imageOpts = false;
|
||||||
bool writethrough = true;
|
bool writethrough = true;
|
||||||
char *trace_file = NULL;
|
char *trace_file = NULL;
|
||||||
|
bool fork_process = false;
|
||||||
|
int old_stderr = -1;
|
||||||
|
|
||||||
/* The client thread uses SIGTERM to interrupt the server. A signal
|
/* The client thread uses SIGTERM to interrupt the server. A signal
|
||||||
* handler ensures that "qemu-nbd -v -c" exits with a nice status code.
|
* handler ensures that "qemu-nbd -v -c" exits with a nice status code.
|
||||||
|
@ -715,6 +721,9 @@ int main(int argc, char **argv)
|
||||||
g_free(trace_file);
|
g_free(trace_file);
|
||||||
trace_file = trace_opt_parse(optarg);
|
trace_file = trace_opt_parse(optarg);
|
||||||
break;
|
break;
|
||||||
|
case QEMU_NBD_OPT_FORK:
|
||||||
|
fork_process = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -774,7 +783,7 @@ int main(int argc, char **argv)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device && !verbose) {
|
if ((device && !verbose) || fork_process) {
|
||||||
int stderr_fd[2];
|
int stderr_fd[2];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -797,6 +806,7 @@ int main(int argc, char **argv)
|
||||||
ret = qemu_daemon(1, 0);
|
ret = qemu_daemon(1, 0);
|
||||||
|
|
||||||
/* Temporarily redirect stderr to the parent's pipe... */
|
/* Temporarily redirect stderr to the parent's pipe... */
|
||||||
|
old_stderr = dup(STDERR_FILENO);
|
||||||
dup2(stderr_fd[1], STDERR_FILENO);
|
dup2(stderr_fd[1], STDERR_FILENO);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("Failed to daemonize: %s", strerror(errno));
|
error_report("Failed to daemonize: %s", strerror(errno));
|
||||||
|
@ -960,6 +970,11 @@ int main(int argc, char **argv)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fork_process) {
|
||||||
|
dup2(old_stderr, STDERR_FILENO);
|
||||||
|
close(old_stderr);
|
||||||
|
}
|
||||||
|
|
||||||
state = RUNNING;
|
state = RUNNING;
|
||||||
do {
|
do {
|
||||||
main_loop_wait(false);
|
main_loop_wait(false);
|
||||||
|
|
|
@ -86,6 +86,8 @@ the new style NBD protocol negotiation
|
||||||
Enable mandatory TLS encryption for the server by setting the ID
|
Enable mandatory TLS encryption for the server by setting the ID
|
||||||
of the TLS credentials object previously created with the --object
|
of the TLS credentials object previously created with the --object
|
||||||
option.
|
option.
|
||||||
|
@item --fork
|
||||||
|
Fork off the server process and exit the parent once the server is running.
|
||||||
@item -v, --verbose
|
@item -v, --verbose
|
||||||
Display extra debugging information
|
Display extra debugging information
|
||||||
@item -h, --help
|
@item -h, --help
|
||||||
|
|
Loading…
Reference in New Issue