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:
Max Reitz 2016-09-28 22:46:42 +02:00 committed by Kevin Wolf
parent a26ddb4396
commit ffb31e1da7
2 changed files with 18 additions and 1 deletions

View File

@ -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);

View File

@ -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