Skip to content

Commit

Permalink
qemu-nbd: define struct NbdClientOpts when HAVE_NBD_DEVICE is not def…
Browse files Browse the repository at this point in the history
…ined

This patch also drops definition of some locals in main() to avoid
useless data copy.

Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Eric Blake <eblake@redhat.com>
CC: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Message-ID: <20230906093210.339585-3-den@openvz.org>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
  • Loading branch information
Denis V. Lunev authored and ebblake committed Sep 8, 2023
1 parent b4bbdf5 commit 3484f67
Showing 1 changed file with 27 additions and 33 deletions.
60 changes: 27 additions & 33 deletions qemu-nbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,12 @@ static int qemu_nbd_client_list(SocketAddress *saddr, QCryptoTLSCreds *tls,
}


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

#if HAVE_NBD_DEVICE
static void *show_parts(void *arg)
{
Expand All @@ -271,12 +277,6 @@ static void *show_parts(void *arg)
return NULL;
}

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

static void *nbd_client_thread(void *arg)
{
struct NbdClientOpts *opts = arg;
Expand Down Expand Up @@ -519,7 +519,6 @@ int main(int argc, char **argv)
const char *bindto = NULL;
const char *port = NULL;
char *sockpath = NULL;
char *device = NULL;
QemuOpts *sn_opts = NULL;
const char *sn_id_or_name = NULL;
const char *sopt = "hVb:o:p:rsnc:dvk:e:f:tl:x:T:D:AB:L";
Expand Down Expand Up @@ -582,16 +581,16 @@ int main(int argc, char **argv)
const char *tlshostname = NULL;
bool imageOpts = false;
bool writethrough = false; /* Client will flush as needed. */
bool verbose = false;
bool fork_process = false;
bool list = false;
unsigned socket_activation;
const char *pid_file_name = NULL;
const char *selinux_label = NULL;
BlockExportOptions *export_opts;
#if HAVE_NBD_DEVICE
struct NbdClientOpts opts;
#endif
struct NbdClientOpts opts = {
.fork_process = false,
.verbose = false,
.device = NULL,
};

#ifdef CONFIG_POSIX
os_setup_early_signal_handling();
Expand Down Expand Up @@ -719,7 +718,7 @@ int main(int argc, char **argv)
disconnect = true;
break;
case 'c':
device = optarg;
opts.device = optarg;
break;
case 'e':
if (qemu_strtoi(optarg, NULL, 0, &shared) < 0 ||
Expand Down Expand Up @@ -750,7 +749,7 @@ int main(int argc, char **argv)
}
break;
case 'v':
verbose = true;
opts.verbose = true;
break;
case 'V':
version(argv[0]);
Expand Down Expand Up @@ -782,7 +781,7 @@ int main(int argc, char **argv)
tlsauthz = optarg;
break;
case QEMU_NBD_OPT_FORK:
fork_process = true;
opts.fork_process = true;
break;
case 'L':
list = true;
Expand All @@ -802,12 +801,12 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}
if (export_name || export_description || dev_offset ||
device || disconnect || fmt || sn_id_or_name || bitmaps ||
opts.device || disconnect || fmt || sn_id_or_name || bitmaps ||
alloc_depth || seen_aio || seen_discard || seen_cache) {
error_report("List mode is incompatible with per-device settings");
exit(EXIT_FAILURE);
}
if (fork_process) {
if (opts.fork_process) {
error_report("List mode is incompatible with forking");
exit(EXIT_FAILURE);
}
Expand All @@ -832,7 +831,8 @@ int main(int argc, char **argv)
}
} else {
/* Using socket activation - check user didn't use -p etc. */
const char *err_msg = socket_activation_validate_opts(device, sockpath,
const char *err_msg = socket_activation_validate_opts(opts.device,
sockpath,
bindto, port,
selinux_label,
list);
Expand All @@ -850,7 +850,7 @@ int main(int argc, char **argv)
}

if (tlscredsid) {
if (device) {
if (opts.device) {
error_report("TLS is not supported with a host device");
exit(EXIT_FAILURE);
}
Expand Down Expand Up @@ -880,7 +880,7 @@ int main(int argc, char **argv)

if (selinux_label) {
#ifdef CONFIG_SELINUX
if (sockpath == NULL && device == NULL) {
if (sockpath == NULL && opts.device == NULL) {
error_report("--selinux-label is not permitted without --socket");
exit(EXIT_FAILURE);
}
Expand All @@ -897,7 +897,7 @@ int main(int argc, char **argv)
}

#if !HAVE_NBD_DEVICE
if (disconnect || device) {
if (disconnect || opts.device) {
error_report("Kernel /dev/nbdN support not available");
exit(EXIT_FAILURE);
}
Expand All @@ -919,7 +919,7 @@ int main(int argc, char **argv)
}
#endif

if ((device && !verbose) || fork_process) {
if ((opts.device && !opts.verbose) || opts.fork_process) {
#ifndef WIN32
g_autoptr(GError) err = NULL;
int stderr_fd[2];
Expand Down Expand Up @@ -1002,9 +1002,9 @@ int main(int argc, char **argv)
#endif /* WIN32 */
}

if (device != NULL && sockpath == NULL) {
if (opts.device != NULL && sockpath == NULL) {
sockpath = g_malloc(128);
snprintf(sockpath, 128, SOCKET_PATH, basename(device));
snprintf(sockpath, 128, SOCKET_PATH, basename(opts.device));
}

server = qio_net_listener_new();
Expand Down Expand Up @@ -1145,15 +1145,9 @@ int main(int argc, char **argv)
blk_exp_add(export_opts, &error_fatal);
qapi_free_BlockExportOptions(export_opts);

if (device) {
if (opts.device) {
#if HAVE_NBD_DEVICE
int ret;
opts = (struct NbdClientOpts) {
.device = device,
.fork_process = fork_process,
.verbose = verbose,
};

ret = pthread_create(&client_thread, NULL, nbd_client_thread, &opts);
if (ret != 0) {
error_report("Failed to create client thread: %s", strerror(ret));
Expand All @@ -1179,7 +1173,7 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}

if (fork_process) {
if (opts.fork_process) {
if (dup2(STDOUT_FILENO, STDERR_FILENO) < 0) {
error_report("Could not release pipe to parent: %s",
strerror(errno));
Expand All @@ -1203,7 +1197,7 @@ int main(int argc, char **argv)

qemu_opts_del(sn_opts);

if (device) {
if (opts.device) {
void *ret;
pthread_join(client_thread, &ret);
exit(ret != NULL);
Expand Down

0 comments on commit 3484f67

Please sign in to comment.