From: 2xsec Date: Mon, 20 Aug 2018 01:41:50 +0000 (+0900) Subject: storage: exit() => _exit(). when exec is failed, child process needs to use _exit() X-Git-Tag: lxc-3.1.0~146^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2c70300ad8a77c560c615c676912ff2d0e613393;p=thirdparty%2Flxc.git storage: exit() => _exit(). when exec is failed, child process needs to use _exit() Signed-off-by: 2xsec --- diff --git a/src/lxc/storage/nbd.c b/src/lxc/storage/nbd.c index 771bd9e3e..4c3ff51ef 100644 --- a/src/lxc/storage/nbd.c +++ b/src/lxc/storage/nbd.c @@ -48,8 +48,8 @@ struct nbd_attach_data { const char *path; }; -static bool clone_attach_nbd(const char *nbd, const char *path); 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 void nbd_detach(const char *path); static int nbd_get_partition(const char *src); @@ -69,16 +69,21 @@ bool attach_nbd(char *src, struct lxc_conf *conf) p = strchr(orig, ':'); if (p) *p = '\0'; + while (1) { sprintf(path, "/dev/nbd%d", i); + if (!file_exists(path)) return false; + if (nbd_busy(i)) { i++; continue; } + if (!clone_attach_nbd(path, orig)) return false; + conf->nbd_idx = i; return true; } @@ -152,10 +157,10 @@ int nbd_mount(struct lxc_storage *bdev) } /* It might take awhile for the partition files to show up */ - if (partition) { + if (partition) if (!wait_for_partition(path)) return -2; - } + ret = mount_unknown_fs(path, bdev->dest, bdev->mntopts); if (ret < 0) ERROR("Error mounting %s", bdev->src); @@ -178,6 +183,7 @@ bool requires_nbd(const char *path) { if (strncmp(path, "nbd:", 4) == 0) return true; + return false; } @@ -226,6 +232,7 @@ static int do_attach_nbd(void *d) exit(0); } else if (fdsi.ssi_signo == SIGCHLD) { int status; + /* If qemu-nbd fails, or is killed by a signal, * then exit */ while (waitpid(-1, &status, WNOHANG) > 0) { @@ -240,12 +247,13 @@ static int do_attach_nbd(void *d) } close(sfd); + if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1) WARN("Warning: unblocking signals for nbd watcher"); execlp("qemu-nbd", "qemu-nbd", "-c", nbd, path, (char *)NULL); SYSERROR("Error executing qemu-nbd"); - exit(1); + _exit(1); } 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); if (pid < 0) return false; + return true; } @@ -270,6 +279,7 @@ static bool nbd_busy(int idx) ret = snprintf(path, 100, "/sys/block/nbd%d/pid", idx); if (ret < 0 || ret >= 100) return true; + return file_exists(path); } @@ -282,15 +292,17 @@ static void nbd_detach(const char *path) SYSERROR("Error forking to detach nbd"); return; } + if (pid) { ret = wait_for_pid(pid); if (ret < 0) ERROR("nbd disconnect returned an error"); return; } + execlp("qemu-nbd", "qemu-nbd", "-d", path, (char *)NULL); SYSERROR("Error executing qemu-nbd"); - exit(1); + _exit(1); } /* @@ -303,24 +315,31 @@ static int nbd_get_partition(const char *src) char *p = strchr(src, ':'); if (!p) return 0; + p = strchr(p+1, ':'); if (!p) return 0; + p++; + if (*p < '1' || *p > '9') return 0; + return *p - '0'; } static bool wait_for_partition(const char *path) { int count = 0; + while (count < 5) { if (file_exists(path)) return true; + sleep(1); count++; } + ERROR("Device %s did not show up after 5 seconds", path); return false; }