]> git.proxmox.com Git - mirror_lxc.git/commitdiff
storage: exit() => _exit(). when exec is failed, child process needs to use _exit()
author2xsec <dh48.jeong@samsung.com>
Mon, 20 Aug 2018 01:41:50 +0000 (10:41 +0900)
committer2xsec <dh48.jeong@samsung.com>
Mon, 20 Aug 2018 01:41:50 +0000 (10:41 +0900)
Signed-off-by: 2xsec <dh48.jeong@samsung.com>
src/lxc/storage/nbd.c

index 771bd9e3ec72dc0957c83bf44892cb1702509b24..4c3ff51efae4afe4586ba294e5c53383bba4d8d5 100644 (file)
@@ -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;
 }