From 1d52bdf7b6e534e1b58ba31fc610c77112aa49e3 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Wed, 3 Feb 2016 00:41:14 +0100 Subject: [PATCH] move and rename mount_entry_create_aufs_dirs() - The function mount_entry_create_aufs_dirs() moves from conf.c to lxcaufs.{c,h} where it belongs. - In accordance with the "aufs_" prefix naming scheme for functions associated with lxcaufs.{c,h} mount_entry_create_aufs_dirs() becomes aufs_mkdir(). - Add aufs_get_rootfs() which returns the rootfs for an aufs lxc.rootfs. Signed-off-by: Christian Brauner --- src/lxc/bdev/lxcaufs.c | 99 ++++++++++++++++++++++++++++++++++++++++++ src/lxc/bdev/lxcaufs.h | 18 ++++++++ src/lxc/conf.c | 70 +++-------------------------- 3 files changed, 122 insertions(+), 65 deletions(-) diff --git a/src/lxc/bdev/lxcaufs.c b/src/lxc/bdev/lxcaufs.c index 408f6a385..4224ce802 100644 --- a/src/lxc/bdev/lxcaufs.c +++ b/src/lxc/bdev/lxcaufs.c @@ -30,6 +30,7 @@ #include "bdev.h" #include "log.h" +#include "lxcaufs.h" #include "lxcrsync.h" #include "utils.h" @@ -312,3 +313,101 @@ int aufs_umount(struct bdev *bdev) return -22; return umount(bdev->dest); } + +char *aufs_get_rootfs(const char *rootfs_path, size_t *rootfslen) +{ + char *rootfsdir = NULL; + char *s1 = NULL; + char *s2 = NULL; + char *s3 = NULL; + + if (!rootfs_path || !rootfslen) + return NULL; + + s1 = strdup(rootfs_path); + if (!s1) + return NULL; + + if ((s2 = strstr(s1, ":/"))) { + s2 = s2 + 1; + if ((s3 = strstr(s2, ":/"))) + *s3 = '\0'; + rootfsdir = strdup(s2); + if (!rootfsdir) { + free(s1); + return NULL; + } + } + + if (!rootfsdir) + rootfsdir = s1; + else + free(s1); + + *rootfslen = strlen(rootfsdir); + + return rootfsdir; +} + +int aufs_mkdir(const struct mntent *mntent, const struct lxc_rootfs *rootfs, + const char *lxc_name, const char *lxc_path) +{ + char lxcpath[MAXPATHLEN]; + char *rootfsdir = NULL; + char *scratch = NULL; + char *tmp = NULL; + char *upperdir = NULL; + char **opts = NULL; + int fret = -1; + int ret = 0; + size_t arrlen = 0; + size_t i; + size_t len = 0; + size_t rootfslen = 0; + + /* Since we use all of these to check whether the user has given us a + * sane absolute path to create the directories needed for overlay + * lxc.mount.entry entries we consider any of these missing fatal. */ + if (!rootfs || !rootfs->path || !lxc_name || !lxc_path) + goto err; + + opts = lxc_string_split(mntent->mnt_opts, ','); + if (opts) + arrlen = lxc_array_len((void **)opts); + else + goto err; + + for (i = 0; i < arrlen; i++) { + if (strstr(opts[i], "br=") && (strlen(opts[i]) > (len = strlen("br=")))) + tmp = opts[i] + len; + } + if (!tmp) + goto err; + + upperdir = strtok_r(tmp, ":=", &scratch); + if (!upperdir) + goto err; + + ret = snprintf(lxcpath, MAXPATHLEN, "%s/%s", lxc_path, lxc_name); + if (ret < 0 || ret >= MAXPATHLEN) + goto err; + + rootfsdir = aufs_get_rootfs(rootfs->path, &rootfslen); + if (!rootfsdir) + goto err; + + /* We neither allow users to create upperdirs outside the containerdir + * nor inside the rootfs. The latter might be debatable. */ + if ((strncmp(upperdir, lxcpath, strlen(lxcpath)) == 0) && (strncmp(upperdir, rootfsdir, rootfslen) != 0)) + if (mkdir_p(upperdir, 0755) < 0) { + WARN("Failed to create upperdir"); + } + + fret = 0; + +err: + free(rootfsdir); + lxc_free_array((void **)opts, free); + return fret; +} + diff --git a/src/lxc/bdev/lxcaufs.h b/src/lxc/bdev/lxcaufs.h index e259ee2b1..4746980db 100644 --- a/src/lxc/bdev/lxcaufs.h +++ b/src/lxc/bdev/lxcaufs.h @@ -27,6 +27,12 @@ #define _GNU_SOURCE #include +#if IS_BIONIC +#include <../include/lxcmntent.h> +#else +#include +#endif + /* defined in bdev.h */ struct bdev; @@ -49,4 +55,16 @@ int aufs_detect(const char *path); int aufs_mount(struct bdev *bdev); int aufs_umount(struct bdev *bdev); +/* + * Get rootfs path for aufs backed containers. Allocated memory must be freed + * by caller. + */ +char *aufs_get_rootfs(const char *rootfs_path, size_t *rootfslen); + +/* + * Create directories for aufs mounts. + */ +int aufs_mkdir(const struct mntent *mntent, const struct lxc_rootfs *rootfs, + const char *lxc_name, const char *lxc_path); + #endif /* __LXC_AUFS_H */ diff --git a/src/lxc/conf.c b/src/lxc/conf.c index a32513dea..41e9ef83d 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -20,6 +20,8 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#define _GNU_SOURCE #include "config.h" #include @@ -36,6 +38,7 @@ #include #include #include + #ifdef HAVE_STATVFS #include #endif @@ -72,6 +75,7 @@ #include "log.h" #include "caps.h" /* for lxc_caps_last_cap() */ #include "bdev/bdev.h" +#include "bdev/lxcaufs.h" #include "bdev/lxcoverlay.h" #include "cgroup.h" #include "lxclock.h" @@ -1726,70 +1730,6 @@ static void cull_mntent_opt(struct mntent *mntent) } } -static int mount_entry_create_aufs_dirs(const struct mntent *mntent, - const struct lxc_rootfs *rootfs, - const char *lxc_name, - const char *lxc_path) -{ - char lxcpath[MAXPATHLEN]; - char *rootfsdir = NULL; - char *scratch = NULL; - char *tmp = NULL; - char *upperdir = NULL; - char **opts = NULL; - int fret = -1; - int ret = 0; - size_t arrlen = 0; - size_t i; - size_t len = 0; - size_t rootfslen = 0; - - /* Since we use all of these to check whether the user has given us a - * sane absolute path to create the directories needed for overlay - * lxc.mount.entry entries we consider any of these missing fatal. */ - if (!rootfs || !rootfs->path || !lxc_name || !lxc_path) - goto err; - - opts = lxc_string_split(mntent->mnt_opts, ','); - if (opts) - arrlen = lxc_array_len((void **)opts); - else - goto err; - - for (i = 0; i < arrlen; i++) { - if (strstr(opts[i], "br=") && (strlen(opts[i]) > (len = strlen("br=")))) - tmp = opts[i] + len; - } - if (!tmp) - goto err; - - upperdir = strtok_r(tmp, ":=", &scratch); - if (!upperdir) - goto err; - - ret = snprintf(lxcpath, MAXPATHLEN, "%s/%s", lxc_path, lxc_name); - if (ret < 0 || ret >= MAXPATHLEN) - goto err; - - rootfsdir = ovl_get_rootfs(rootfs->path, &rootfslen); - if (!rootfsdir) - goto err; - - /* We neither allow users to create upperdirs outside the containerdir - * nor inside the rootfs. The latter might be debatable. */ - if ((strncmp(upperdir, lxcpath, strlen(lxcpath)) == 0) && (strncmp(upperdir, rootfsdir, rootfslen) != 0)) - if (mkdir_p(upperdir, 0755) < 0) { - WARN("Failed to create upperdir"); - } - - fret = 0; - -err: - free(rootfsdir); - lxc_free_array((void **)opts, free); - return fret; -} - static int mount_entry_create_dir_file(const struct mntent *mntent, const char* path, const struct lxc_rootfs *rootfs, const char *lxc_name, const char *lxc_path) @@ -1802,7 +1742,7 @@ static int mount_entry_create_dir_file(const struct mntent *mntent, if (ovl_mkdir(mntent, rootfs, lxc_name, lxc_path) < 0) return -1; } else if (strncmp(mntent->mnt_type, "aufs", 4) == 0) { - if (mount_entry_create_aufs_dirs(mntent, rootfs, lxc_name, lxc_path) < 0) + if (aufs_mkdir(mntent, rootfs, lxc_name, lxc_path) < 0) return -1; } -- 2.47.2