Unverified Commit 87a70c57 by Christian Brauner Committed by GitHub

Merge pull request #2550 from 2xsec/bugfix

storage: exit() => _exit()
parents de206187 75457df5
...@@ -48,8 +48,8 @@ struct nbd_attach_data { ...@@ -48,8 +48,8 @@ struct nbd_attach_data {
const char *path; const char *path;
}; };
static bool clone_attach_nbd(const char *nbd, const char *path);
static int do_attach_nbd(void *d); static int do_attach_nbd(void *d);
static bool clone_attach_nbd(const char *nbd, const char *path);
static bool nbd_busy(int idx); static bool nbd_busy(int idx);
static void nbd_detach(const char *path); static void nbd_detach(const char *path);
static int nbd_get_partition(const char *src); static int nbd_get_partition(const char *src);
...@@ -69,16 +69,21 @@ bool attach_nbd(char *src, struct lxc_conf *conf) ...@@ -69,16 +69,21 @@ bool attach_nbd(char *src, struct lxc_conf *conf)
p = strchr(orig, ':'); p = strchr(orig, ':');
if (p) if (p)
*p = '\0'; *p = '\0';
while (1) { while (1) {
sprintf(path, "/dev/nbd%d", i); sprintf(path, "/dev/nbd%d", i);
if (!file_exists(path)) if (!file_exists(path))
return false; return false;
if (nbd_busy(i)) { if (nbd_busy(i)) {
i++; i++;
continue; continue;
} }
if (!clone_attach_nbd(path, orig)) if (!clone_attach_nbd(path, orig))
return false; return false;
conf->nbd_idx = i; conf->nbd_idx = i;
return true; return true;
} }
...@@ -152,10 +157,10 @@ int nbd_mount(struct lxc_storage *bdev) ...@@ -152,10 +157,10 @@ int nbd_mount(struct lxc_storage *bdev)
} }
/* It might take awhile for the partition files to show up */ /* It might take awhile for the partition files to show up */
if (partition) { if (partition)
if (!wait_for_partition(path)) if (!wait_for_partition(path))
return -2; return -2;
}
ret = mount_unknown_fs(path, bdev->dest, bdev->mntopts); ret = mount_unknown_fs(path, bdev->dest, bdev->mntopts);
if (ret < 0) if (ret < 0)
ERROR("Error mounting %s", bdev->src); ERROR("Error mounting %s", bdev->src);
...@@ -178,6 +183,7 @@ bool requires_nbd(const char *path) ...@@ -178,6 +183,7 @@ bool requires_nbd(const char *path)
{ {
if (strncmp(path, "nbd:", 4) == 0) if (strncmp(path, "nbd:", 4) == 0)
return true; return true;
return false; return false;
} }
...@@ -226,6 +232,7 @@ static int do_attach_nbd(void *d) ...@@ -226,6 +232,7 @@ static int do_attach_nbd(void *d)
exit(0); exit(0);
} else if (fdsi.ssi_signo == SIGCHLD) { } else if (fdsi.ssi_signo == SIGCHLD) {
int status; int status;
/* If qemu-nbd fails, or is killed by a signal, /* If qemu-nbd fails, or is killed by a signal,
* then exit */ * then exit */
while (waitpid(-1, &status, WNOHANG) > 0) { while (waitpid(-1, &status, WNOHANG) > 0) {
...@@ -240,12 +247,13 @@ static int do_attach_nbd(void *d) ...@@ -240,12 +247,13 @@ static int do_attach_nbd(void *d)
} }
close(sfd); close(sfd);
if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1) if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
WARN("Warning: unblocking signals for nbd watcher"); WARN("Warning: unblocking signals for nbd watcher");
execlp("qemu-nbd", "qemu-nbd", "-c", nbd, path, (char *)NULL); execlp("qemu-nbd", "qemu-nbd", "-c", nbd, path, (char *)NULL);
SYSERROR("Error executing qemu-nbd"); SYSERROR("Error executing qemu-nbd");
exit(1); _exit(1);
} }
static bool clone_attach_nbd(const char *nbd, const char *path) static bool clone_attach_nbd(const char *nbd, const char *path)
...@@ -259,6 +267,7 @@ static bool clone_attach_nbd(const char *nbd, const char *path) ...@@ -259,6 +267,7 @@ static bool clone_attach_nbd(const char *nbd, const char *path)
pid = lxc_clone(do_attach_nbd, &data, CLONE_NEWPID); pid = lxc_clone(do_attach_nbd, &data, CLONE_NEWPID);
if (pid < 0) if (pid < 0)
return false; return false;
return true; return true;
} }
...@@ -270,6 +279,7 @@ static bool nbd_busy(int idx) ...@@ -270,6 +279,7 @@ static bool nbd_busy(int idx)
ret = snprintf(path, 100, "/sys/block/nbd%d/pid", idx); ret = snprintf(path, 100, "/sys/block/nbd%d/pid", idx);
if (ret < 0 || ret >= 100) if (ret < 0 || ret >= 100)
return true; return true;
return file_exists(path); return file_exists(path);
} }
...@@ -282,15 +292,17 @@ static void nbd_detach(const char *path) ...@@ -282,15 +292,17 @@ static void nbd_detach(const char *path)
SYSERROR("Error forking to detach nbd"); SYSERROR("Error forking to detach nbd");
return; return;
} }
if (pid) { if (pid) {
ret = wait_for_pid(pid); ret = wait_for_pid(pid);
if (ret < 0) if (ret < 0)
ERROR("nbd disconnect returned an error"); ERROR("nbd disconnect returned an error");
return; return;
} }
execlp("qemu-nbd", "qemu-nbd", "-d", path, (char *)NULL); execlp("qemu-nbd", "qemu-nbd", "-d", path, (char *)NULL);
SYSERROR("Error executing qemu-nbd"); SYSERROR("Error executing qemu-nbd");
exit(1); _exit(1);
} }
/* /*
...@@ -303,24 +315,31 @@ static int nbd_get_partition(const char *src) ...@@ -303,24 +315,31 @@ static int nbd_get_partition(const char *src)
char *p = strchr(src, ':'); char *p = strchr(src, ':');
if (!p) if (!p)
return 0; return 0;
p = strchr(p+1, ':'); p = strchr(p+1, ':');
if (!p) if (!p)
return 0; return 0;
p++; p++;
if (*p < '1' || *p > '9') if (*p < '1' || *p > '9')
return 0; return 0;
return *p - '0'; return *p - '0';
} }
static bool wait_for_partition(const char *path) static bool wait_for_partition(const char *path)
{ {
int count = 0; int count = 0;
while (count < 5) { while (count < 5) {
if (file_exists(path)) if (file_exists(path))
return true; return true;
sleep(1); sleep(1);
count++; count++;
} }
ERROR("Device %s did not show up after 5 seconds", path); ERROR("Device %s did not show up after 5 seconds", path);
return false; return false;
} }
...@@ -37,25 +37,8 @@ ...@@ -37,25 +37,8 @@
lxc_log_define(lxc_wait, lxc); lxc_log_define(lxc_wait, lxc);
static int my_checker(const struct lxc_arguments *args) static int my_parser(struct lxc_arguments *args, int c, char *arg);
{ static int my_checker(const struct lxc_arguments *args);
if (!args->states) {
ERROR("Missing state option to wait for");
return -1;
}
return 0;
}
static int my_parser(struct lxc_arguments *args, int c, char *arg)
{
switch (c) {
case 's': args->states = optarg; break;
case 't': args->timeout = atol(optarg); break;
}
return 0;
}
static const struct option my_longopts[] = { static const struct option my_longopts[] = {
{"state", required_argument, 0, 's'}, {"state", required_argument, 0, 's'},
...@@ -80,9 +63,35 @@ Options :\n\ ...@@ -80,9 +63,35 @@ Options :\n\
.options = my_longopts, .options = my_longopts,
.parser = my_parser, .parser = my_parser,
.checker = my_checker, .checker = my_checker,
.log_priority = "ERROR",
.log_file = "none",
.timeout = -1, .timeout = -1,
}; };
static int my_parser(struct lxc_arguments *args, int c, char *arg)
{
switch (c) {
case 's':
args->states = optarg;
break;
case 't':
args->timeout = atol(optarg);
break;
}
return 0;
}
static int my_checker(const struct lxc_arguments *args)
{
if (!args->states) {
ERROR("Missing state option to wait for");
return -1;
}
return 0;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct lxc_container *c; struct lxc_container *c;
...@@ -91,8 +100,6 @@ int main(int argc, char *argv[]) ...@@ -91,8 +100,6 @@ int main(int argc, char *argv[])
if (lxc_arguments_parse(&my_args, argc, argv)) if (lxc_arguments_parse(&my_args, argc, argv))
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
/* Only create log if explicitly instructed */
if (my_args.log_file || my_args.log_priority) {
log.name = my_args.name; log.name = my_args.name;
log.file = my_args.log_file; log.file = my_args.log_file;
log.level = my_args.log_priority; log.level = my_args.log_priority;
...@@ -102,7 +109,6 @@ int main(int argc, char *argv[]) ...@@ -102,7 +109,6 @@ int main(int argc, char *argv[])
if (lxc_log_init(&log)) if (lxc_log_init(&log))
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
}
c = lxc_container_new(my_args.name, my_args.lxcpath[0]); c = lxc_container_new(my_args.name, my_args.lxcpath[0]);
if (!c) if (!c)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment