]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
bdev: record output from mkfs.*
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 4 Jun 2017 16:01:41 +0000 (18:01 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 5 Jun 2017 17:17:11 +0000 (19:17 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/bdev/bdev.c
src/lxc/bdev/bdev.h
src/lxc/bdev/lxcloop.c
src/lxc/bdev/lxclvm.c
src/lxc/bdev/lxcrbd.c

index 87df7127ca47270b2fd28e87cd2c4824dec064fc..91eb42a0a38adf83920562efe5849cf629af9d04 100644 (file)
@@ -736,24 +736,31 @@ int detect_fs(struct bdev *bdev, char *type, int len)
        exit(1);
 }
 
-int do_mkfs(const char *path, const char *fstype)
+int do_mkfs_exec_wrapper(void *args)
 {
-       pid_t pid;
+       int ret;
+       char *mkfs;
+       char **data = args;
+       /* strlen("mkfs.")
+        * +
+        * strlen(data[0])
+        * +
+        * \0
+        */
+       size_t len = 5 + strlen(data[0]) + 1;
 
-       if ((pid = fork()) < 0) {
-               ERROR("error forking");
+       mkfs = malloc(len);
+       if (!mkfs)
                return -1;
-       }
-       if (pid > 0)
-               return wait_for_pid(pid);
 
-       // If the file is not a block device, we don't want mkfs to ask
-       // us about whether to proceed.
-       if (null_stdfds() < 0)
-               exit(EXIT_FAILURE);
+       ret = snprintf(mkfs, len, "mkfs.%s", data[0]);
+       if (ret < 0 || (size_t)ret >= len)
+               return -1;
 
-       execlp("mkfs", "mkfs", "-t", fstype, path, (char *)NULL);
-       exit(EXIT_FAILURE);
+       TRACE("executing \"%s %s\"", mkfs, data[1]);
+       execlp(mkfs, mkfs, data[1], (char *)NULL);
+       SYSERROR("failed to run \"%s %s \"", mkfs, data[1]);
+       return -1;
 }
 
 /*
index f14a365b6a203a86658347f771bb0c1f096e7d61..1caf3ae72de096042c9fec493732a0a8db75bca9 100644 (file)
@@ -131,7 +131,7 @@ int bdev_destroy_wrapper(void *data);
  */
 int blk_getsize(struct bdev *bdev, uint64_t *size);
 int detect_fs(struct bdev *bdev, char *type, int len);
-int do_mkfs(const char *path, const char *fstype);
+int do_mkfs_exec_wrapper(void *args);
 int is_blktype(struct bdev *b);
 int mount_unknown_fs(const char *rootfs, const char *target,
                const char *options);
index 32f2f78cf39ae101a505243b36ca7a680b9a0328..65d49525debd8fffa05024e778cc2dcac077fa2d 100644 (file)
@@ -191,8 +191,10 @@ int loop_mount(struct bdev *bdev)
                src += 5;
 
        loopfd = lxc_prepare_loop_dev(src, loname, LO_FLAGS_AUTOCLEAR);
-       if (loopfd < 0)
+       if (loopfd < 0) {
+               ERROR("failed to prepare loop device for loop file \"%s\"", src);
                return -1;
+       }
        DEBUG("prepared loop device \"%s\"", loname);
 
        ret = mount_unknown_fs(loname, bdev->dest, bdev->mntopts);
@@ -224,6 +226,9 @@ int loop_umount(struct bdev *bdev)
 static int do_loop_create(const char *path, uint64_t size, const char *fstype)
 {
        int fd, ret;
+       const char *cmd_args[2] = {fstype, path};
+       char cmd_output[MAXPATHLEN];
+
        // create the new loopback file.
        fd = creat(path, S_IRUSR|S_IWUSR);
        if (fd < 0)
@@ -245,11 +250,10 @@ static int do_loop_create(const char *path, uint64_t size, const char *fstype)
        }
 
        // create an fs in the loopback file
-       if (do_mkfs(path, fstype) < 0) {
-               ERROR("Error creating filesystem type %s on %s", fstype,
-                       path);
+       ret = run_command(cmd_output, sizeof(cmd_output), do_mkfs_exec_wrapper,
+                         (void *)cmd_args);
+       if (ret < 0)
                return -1;
-       }
 
        return 0;
 }
index bcd8be8f4e7ac9f7c5250a445c58dd100662c90b..35c5c92f3ae35cf032312050044c8b7b231c7fb1 100644 (file)
@@ -282,6 +282,8 @@ int lvm_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
        char fstype[100];
        uint64_t size = newsize;
        int len, ret;
+       const char *cmd_args[2];
+       char cmd_output[MAXPATHLEN];
 
        if (!orig->src || !orig->dest)
                return -1;
@@ -348,11 +350,14 @@ int lvm_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
                        ERROR("Error creating new lvm blockdev");
                        return -1;
                }
-               if (do_mkfs(new->src, fstype) < 0) {
-                       ERROR("Error creating filesystem type %s on %s", fstype,
-                               new->src);
+
+               cmd_args[0] = fstype;
+               cmd_args[1] = new->src;
+               // create an fs in the loopback file
+               ret = run_command(cmd_output, sizeof(cmd_output),
+                                 do_mkfs_exec_wrapper, (void *)cmd_args);
+               if (ret < 0)
                        return -1;
-               }
        }
 
        return 0;
@@ -378,6 +383,8 @@ int lvm_create(struct bdev *bdev, const char *dest, const char *n,
        const char *vg, *thinpool, *fstype, *lv = n;
        uint64_t sz;
        int ret, len;
+       const char *cmd_args[2];
+       char cmd_output[MAXPATHLEN];
 
        if (!specs)
                return -1;
@@ -416,11 +423,14 @@ int lvm_create(struct bdev *bdev, const char *dest, const char *n,
        fstype = specs->fstype;
        if (!fstype)
                fstype = DEFAULT_FSTYPE;
-       if (do_mkfs(bdev->src, fstype) < 0) {
-               ERROR("Error creating filesystem type %s on %s", fstype,
-                       bdev->src);
+
+       cmd_args[0] = fstype;
+       cmd_args[1] = bdev->src;
+       ret = run_command(cmd_output, sizeof(cmd_output), do_mkfs_exec_wrapper,
+                         (void *)cmd_args);
+       if (ret < 0)
                return -1;
-       }
+
        if (!(bdev->dest = strdup(dest)))
                return -1;
 
index 8e3a452b7d7490f6e57a01eefa47220ec0ca8d76..b6abb75e49a55958db1ba440bdcf326c25dd4dec 100644 (file)
@@ -51,6 +51,8 @@ int rbd_create(struct bdev *bdev, const char *dest, const char *n,
        int ret, len;
        char sz[24];
        pid_t pid;
+       const char *cmd_args[2];
+       char cmd_output[MAXPATHLEN];
 
        if (!specs)
                return -1;
@@ -104,11 +106,13 @@ int rbd_create(struct bdev *bdev, const char *dest, const char *n,
        if (!fstype)
                fstype = DEFAULT_FSTYPE;
 
-       if (do_mkfs(bdev->src, fstype) < 0) {
-               ERROR("Error creating filesystem type %s on %s", fstype,
-                       bdev->src);
+       cmd_args[0] = fstype;
+       cmd_args[1] = bdev->src;
+       ret = run_command(cmd_output, sizeof(cmd_output), do_mkfs_exec_wrapper,
+                         (void *)cmd_args);
+       if (ret < 0)
                return -1;
-       }
+
        if (!(bdev->dest = strdup(dest)))
                return -1;