Commit a14bf84f by Serge Hallyn

Merge pull request #724 from brauner/2015-12-12/split_bdev_into_modules

split bdev into modules
parents fbc617e8 5c484f79
...@@ -6,7 +6,9 @@ pkginclude_HEADERS = \ ...@@ -6,7 +6,9 @@ pkginclude_HEADERS = \
noinst_HEADERS = \ noinst_HEADERS = \
arguments.h \ arguments.h \
attach.h \ attach.h \
bdev.h \ bdev/bdev.h \
bdev/lxc-btrfs.h \
bdev/overlay.h \
caps.h \ caps.h \
cgroup.h \ cgroup.h \
conf.h \ conf.h \
...@@ -16,7 +18,6 @@ noinst_HEADERS = \ ...@@ -16,7 +18,6 @@ noinst_HEADERS = \
list.h \ list.h \
log.h \ log.h \
lxc.h \ lxc.h \
lxc-btrfs.h \
lxclock.h \ lxclock.h \
monitor.h \ monitor.h \
namespace.h \ namespace.h \
...@@ -60,7 +61,7 @@ endif ...@@ -60,7 +61,7 @@ endif
liblxc_so_SOURCES = \ liblxc_so_SOURCES = \
arguments.c arguments.h \ arguments.c arguments.h \
bdev.c bdev.h lxc-btrfs.h \ bdev/bdev.c bdev/bdev.h bdev/overlay.c bdev/overlay.h bdev/lxc-btrfs.h \
commands.c commands.h \ commands.c commands.h \
start.c start.h \ start.c start.h \
execute.c \ execute.c \
......
...@@ -27,11 +27,11 @@ ...@@ -27,11 +27,11 @@
* aufs, dir, raw, btrfs, overlayfs, aufs, lvm, loop, zfs, nbd (qcow2, raw, vdi, qed) * aufs, dir, raw, btrfs, overlayfs, aufs, lvm, loop, zfs, nbd (qcow2, raw, vdi, qed)
*/ */
#include "config.h"
#include <stdint.h> #include <stdint.h>
#include <lxc/lxccontainer.h> #include <lxc/lxccontainer.h>
#include <sys/mount.h> #include <sys/mount.h>
#include "config.h"
/* define constants if the kernel/glibc headers don't define them */ /* define constants if the kernel/glibc headers don't define them */
#ifndef MS_DIRSYNC #ifndef MS_DIRSYNC
...@@ -97,8 +97,6 @@ struct bdev { ...@@ -97,8 +97,6 @@ struct bdev {
int nbd_idx; int nbd_idx;
}; };
char *overlay_getlower(char *p);
bool bdev_is_dir(struct lxc_conf *conf, const char *path); bool bdev_is_dir(struct lxc_conf *conf, const char *path);
bool bdev_can_backup(struct lxc_conf *conf); bool bdev_can_backup(struct lxc_conf *conf);
......
/*
* lxc: linux Container library
*
* (C) Copyright IBM Corp. 2007, 2008
*
* Authors:
* Daniel Lezcano <daniel.lezcano at free.fr>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __LXC_OVERLAY_H
#define __LXC_OVERLAY_H
#include <grp.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#if IS_BIONIC
#include <../include/lxcmntent.h>
#else
#include <mntent.h>
#endif
/* defined in bdev.h */
struct bdev;
/* defined in lxccontainer.h */
struct bdev_specs;
/* defined conf.h */
struct lxc_conf;
/* defined in conf.h */
struct lxc_rootfs;
/*
* Functions associated with an overlay bdev struct.
*/
int ovl_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
const char *cname, const char *oldpath, const char *lxcpath,
int snap, uint64_t newsize, struct lxc_conf *conf);
int ovl_create(struct bdev *bdev, const char *dest, const char *n,
struct bdev_specs *specs);
int ovl_destroy(struct bdev *orig);
int ovl_detect(const char *path);
int ovl_mount(struct bdev *bdev);
int ovl_umount(struct bdev *bdev);
/*
* To be called from lxcapi_clone() in lxccontainer.c: When we clone a container
* with overlay lxc.mount.entry entries we need to update absolute paths for
* upper- and workdir. This update is done in two locations:
* lxc_conf->unexpanded_config and lxc_conf->mount_list. Both updates are done
* independent of each other since lxc_conf->mountlist may container more mount
* entries (e.g. from other included files) than lxc_conf->unexpanded_config .
*/
int ovl_update_abs_paths(struct lxc_conf *lxc_conf, const char *lxc_path,
const char *lxc_name, const char *newpath,
const char *newname);
/*
* To be called from functions in lxccontainer.c: Get lower directory for
* overlay rootfs.
*/
char *ovl_getlower(char *p);
/*
* Get rootfs path for overlay backed containers. Allocated memory must be freed
* by caller.
*/
char *ovl_get_rootfs(const char *rootfs_path, size_t *rootfslen);
/*
* Create upper- and workdirs for overlay mounts.
*/
int ovl_mkdir(const struct mntent *mntent, const struct lxc_rootfs *rootfs,
const char *lxc_name, const char *lxc_path);
#endif /* __LXC_OVERLAY_H */
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include "list.h" #include "list.h"
#include "conf.h" #include "conf.h"
#include "utils.h" #include "utils.h"
#include "bdev.h" #include "bdev/bdev.h"
#include "log.h" #include "log.h"
#include "cgroup.h" #include "cgroup.h"
#include "start.h" #include "start.h"
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
#include "list.h" #include "list.h"
#include "conf.h" #include "conf.h"
#include "utils.h" #include "utils.h"
#include "bdev.h" #include "bdev/bdev.h"
#include "log.h" #include "log.h"
#include "cgroup.h" #include "cgroup.h"
#include "start.h" #include "start.h"
......
...@@ -71,7 +71,8 @@ ...@@ -71,7 +71,8 @@
#include "conf.h" #include "conf.h"
#include "log.h" #include "log.h"
#include "caps.h" /* for lxc_caps_last_cap() */ #include "caps.h" /* for lxc_caps_last_cap() */
#include "bdev.h" #include "bdev/bdev.h"
#include "bdev/overlay.h"
#include "cgroup.h" #include "cgroup.h"
#include "lxclock.h" #include "lxclock.h"
#include "namespace.h" #include "namespace.h"
...@@ -1815,107 +1816,6 @@ static void cull_mntent_opt(struct mntent *mntent) ...@@ -1815,107 +1816,6 @@ static void cull_mntent_opt(struct mntent *mntent)
} }
} }
static char *ovl_get_rootfs_dir(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;
}
static int mount_entry_create_overlay_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 *upperdir = NULL;
char *workdir = NULL;
char **opts = NULL;
int fret = -1;
int ret = 0;
size_t arrlen = 0;
size_t dirlen = 0;
size_t i;
size_t len = 0;
size_t rootfslen = 0;
if (!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], "upperdir=") && (strlen(opts[i]) > (len = strlen("upperdir="))))
upperdir = opts[i] + len;
else if (strstr(opts[i], "workdir=") && (strlen(opts[i]) > (len = strlen("workdir="))))
workdir = opts[i] + len;
}
ret = snprintf(lxcpath, MAXPATHLEN, "%s/%s", lxc_path, lxc_name);
if (ret < 0 || ret >= MAXPATHLEN)
goto err;
rootfsdir = ovl_get_rootfs_dir(rootfs->path, &rootfslen);
if (!rootfsdir)
goto err;
dirlen = strlen(lxcpath);
/* We neither allow users to create upperdirs and workdirs outside the
* containerdir nor inside the rootfs. The latter might be debatable. */
if (upperdir)
if ((strncmp(upperdir, lxcpath, dirlen) == 0) && (strncmp(upperdir, rootfsdir, rootfslen) != 0))
if (mkdir_p(upperdir, 0755) < 0) {
WARN("Failed to create upperdir");
}
if (workdir)
if ((strncmp(workdir, lxcpath, dirlen) == 0) && (strncmp(workdir, rootfsdir, rootfslen) != 0))
if (mkdir_p(workdir, 0755) < 0) {
WARN("Failed to create workdir");
}
fret = 0;
err:
free(rootfsdir);
lxc_free_array((void **)opts, free);
return fret;
}
static int mount_entry_create_aufs_dirs(const struct mntent *mntent, static int mount_entry_create_aufs_dirs(const struct mntent *mntent,
const struct lxc_rootfs *rootfs, const struct lxc_rootfs *rootfs,
const char *lxc_name, const char *lxc_name,
...@@ -1958,7 +1858,7 @@ static int mount_entry_create_aufs_dirs(const struct mntent *mntent, ...@@ -1958,7 +1858,7 @@ static int mount_entry_create_aufs_dirs(const struct mntent *mntent,
if (ret < 0 || ret >= MAXPATHLEN) if (ret < 0 || ret >= MAXPATHLEN)
goto err; goto err;
rootfsdir = ovl_get_rootfs_dir(rootfs->path, &rootfslen); rootfsdir = ovl_get_rootfs(rootfs->path, &rootfslen);
if (!rootfsdir) if (!rootfsdir)
goto err; goto err;
...@@ -1987,7 +1887,7 @@ static int mount_entry_create_dir_file(const struct mntent *mntent, ...@@ -1987,7 +1887,7 @@ static int mount_entry_create_dir_file(const struct mntent *mntent,
FILE *pathfile = NULL; FILE *pathfile = NULL;
if (strncmp(mntent->mnt_type, "overlay", 7) == 0) { if (strncmp(mntent->mnt_type, "overlay", 7) == 0) {
if (mount_entry_create_overlay_dirs(mntent, rootfs, lxc_name, lxc_path) < 0) if (ovl_mkdir(mntent, rootfs, lxc_name, lxc_path) < 0)
return -1; return -1;
} else if (strncmp(mntent->mnt_type, "aufs", 4) == 0) { } else if (strncmp(mntent->mnt_type, "aufs", 4) == 0) {
if (mount_entry_create_aufs_dirs(mntent, rootfs, lxc_name, lxc_path) < 0) if (mount_entry_create_aufs_dirs(mntent, rootfs, lxc_name, lxc_path) < 0)
...@@ -2623,7 +2523,7 @@ void restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf) ...@@ -2623,7 +2523,7 @@ void restore_phys_nics_to_netns(int netnsfd, struct lxc_conf *conf)
{ {
int i, ret, oldfd; int i, ret, oldfd;
char path[MAXPATHLEN]; char path[MAXPATHLEN];
char ifname[IFNAMSIZ]; char ifname[IFNAMSIZ];
if (netnsfd < 0) if (netnsfd < 0)
return; return;
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#include "config.h" #include "config.h"
#include "bdev.h" #include "bdev/bdev.h"
#include "cgroup.h" #include "cgroup.h"
#include "conf.h" #include "conf.h"
#include "commands.h" #include "commands.h"
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
#include "conf.h" #include "conf.h"
#include "state.h" #include "state.h"
#include "utils.h" #include "utils.h"
#include "bdev.h" #include "bdev/bdev.h"
#ifndef HAVE_GETSUBOPT #ifndef HAVE_GETSUBOPT
#include <../include/getsubopt.h> #include <../include/getsubopt.h>
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "lxc.h" #include "lxc.h"
#include "log.h" #include "log.h"
#include "bdev.h" #include "bdev/bdev.h"
#include "arguments.h" #include "arguments.h"
#include "utils.h" #include "utils.h"
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "lxc.h" #include "lxc.h"
#include "log.h" #include "log.h"
#include "bdev.h" #include "bdev/bdev.h"
#include "arguments.h" #include "arguments.h"
#include "utils.h" #include "utils.h"
......
...@@ -19,48 +19,46 @@ ...@@ -19,48 +19,46 @@
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
#include <sys/mman.h>
#include <assert.h> #include <assert.h>
#include <stdarg.h> #include <dirent.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mount.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <sched.h> #include <grp.h>
#include <dirent.h>
#include <sched.h>
#include <arpa/inet.h>
#include <libgen.h> #include <libgen.h>
#include <pthread.h>
#include <sched.h>
#include <stdarg.h>
#include <stdint.h> #include <stdint.h>
#include <grp.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/mman.h>
#include <sys/mount.h>
#include <sys/syscall.h> #include <sys/syscall.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <lxc/lxccontainer.h> #include "attach.h"
#include <lxc/version.h> #include "bdev/bdev.h"
#include <lxc/network.h> #include "bdev/overlay.h"
#include "cgroup.h"
#include "config.h"
#include "lxc.h"
#include "state.h"
#include "conf.h" #include "conf.h"
#include "config.h"
#include "commands.h"
#include "confile.h" #include "confile.h"
#include "console.h" #include "console.h"
#include "cgroup.h"
#include "commands.h"
#include "criu.h" #include "criu.h"
#include "log.h" #include "log.h"
#include "bdev.h" #include "lxc.h"
#include "utils.h" #include "lxccontainer.h"
#include "attach.h" #include "lxclock.h"
#include "monitor.h" #include "monitor.h"
#include "namespace.h" #include "namespace.h"
#include "network.h" #include "network.h"
#include "lxclock.h"
#include "sync.h" #include "sync.h"
#include "state.h"
#include "utils.h"
#include "version.h"
#if HAVE_IFADDRS_H #if HAVE_IFADDRS_H
#include <ifaddrs.h> #include <ifaddrs.h>
...@@ -1095,9 +1093,9 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool need_ ...@@ -1095,9 +1093,9 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool need_
* the template * the template
*/ */
if (strncmp(src, "overlayfs:", 10) == 0) if (strncmp(src, "overlayfs:", 10) == 0)
src = overlay_getlower(src+10); src = ovl_getlower(src+10);
if (strncmp(src, "aufs:", 5) == 0) if (strncmp(src, "aufs:", 5) == 0)
src = overlay_getlower(src+5); src = ovl_getlower(src+5);
bdev = bdev_init(c->lxc_conf, src, c->lxc_conf->rootfs.mount, NULL); bdev = bdev_init(c->lxc_conf, src, c->lxc_conf->rootfs.mount, NULL);
if (!bdev) { if (!bdev) {
...@@ -2997,102 +2995,6 @@ static int create_file_dirname(char *path, struct lxc_conf *conf) ...@@ -2997,102 +2995,6 @@ static int create_file_dirname(char *path, struct lxc_conf *conf)
return ret; return ret;
} }
/* When we clone a container with overlay lxc.mount.entry entries we need to
* update absolute paths for upper- and workdir. This update is done in two
* locations: lxc_conf->unexpanded_config and lxc_conf->mount_list. Both updates
* are done independent of each other since lxc_conf->mountlist may container
* more mount entries (e.g. from other included files) than
* lxc_conf->unexpanded_config . */
static int update_ovl_paths(struct lxc_conf *lxc_conf, const char *lxc_path,
const char *lxc_name, const char *newpath,
const char *newname)
{
char new_upper[MAXPATHLEN];
char new_work[MAXPATHLEN];
char old_upper[MAXPATHLEN];
char old_work[MAXPATHLEN];
char *cleanpath = NULL;
int i;
int fret = -1;
int ret = 0;
struct lxc_list *iterator;
const char *ovl_dirs[] = {"br", "upperdir", "workdir"};
cleanpath = strdup(newpath);
if (!cleanpath)
goto err;
remove_trailing_slashes(cleanpath);
/* We have to update lxc_conf->unexpanded_config separately from
* lxc_conf->mount_list. */
for (i = 0; i < sizeof(ovl_dirs) / sizeof(ovl_dirs[0]); i++) {
if (!clone_update_unexp_ovl_paths(lxc_conf, lxc_path, newpath,
lxc_name, newname,
ovl_dirs[i]))
goto err;
}
ret = snprintf(old_work, MAXPATHLEN, "workdir=%s/%s", lxc_path, lxc_name);
if (ret < 0 || ret >= MAXPATHLEN)
goto err;
ret = snprintf(new_work, MAXPATHLEN, "workdir=%s/%s", cleanpath, newname);
if (ret < 0 || ret >= MAXPATHLEN)
goto err;
lxc_list_for_each(iterator, &lxc_conf->mount_list) {
char *mnt_entry = NULL;
char *new_mnt_entry = NULL;
char *tmp = NULL;
char *tmp_mnt_entry = NULL;
mnt_entry = iterator->elem;
if (strstr(mnt_entry, "overlay"))
tmp = "upperdir";
else if (strstr(mnt_entry, "aufs"))
tmp = "br";
if (!tmp)
continue;
ret = snprintf(old_upper, MAXPATHLEN, "%s=%s/%s", tmp, lxc_path, lxc_name);
if (ret < 0 || ret >= MAXPATHLEN)
goto err;
ret = snprintf(new_upper, MAXPATHLEN, "%s=%s/%s", tmp, cleanpath, newname);
if (ret < 0 || ret >= MAXPATHLEN)
goto err;
if (strstr(mnt_entry, old_upper)) {
tmp_mnt_entry = lxc_string_replace(old_upper, new_upper, mnt_entry);
}
if (strstr(mnt_entry, old_work)) {
if (tmp_mnt_entry)
new_mnt_entry = lxc_string_replace(old_work, new_work, tmp_mnt_entry);
else
new_mnt_entry = lxc_string_replace(old_work, new_work, mnt_entry);
}
if (new_mnt_entry) {
free(iterator->elem);
iterator->elem = strdup(new_mnt_entry);
} else if (tmp_mnt_entry) {
free(iterator->elem);
iterator->elem = strdup(tmp_mnt_entry);
}
free(new_mnt_entry);
free(tmp_mnt_entry);
}
fret = 0;
err:
free(cleanpath);
return fret;
}
static struct lxc_container *do_lxcapi_clone(struct lxc_container *c, const char *newname, static struct lxc_container *do_lxcapi_clone(struct lxc_container *c, const char *newname,
const char *lxcpath, int flags, const char *lxcpath, int flags,
const char *bdevtype, const char *bdevdata, uint64_t newsize, const char *bdevtype, const char *bdevdata, uint64_t newsize,
...@@ -3223,7 +3125,7 @@ static struct lxc_container *do_lxcapi_clone(struct lxc_container *c, const char ...@@ -3223,7 +3125,7 @@ static struct lxc_container *do_lxcapi_clone(struct lxc_container *c, const char
} }
// update absolute paths for overlay mount directories // update absolute paths for overlay mount directories
if (update_ovl_paths(c2->lxc_conf, c->config_path, c->name, lxcpath, newname) < 0) if (ovl_update_abs_paths(c2->lxc_conf, c->config_path, c->name, lxcpath, newname) < 0)
goto out; goto out;
// We've now successfully created c2's storage, so clear it out if we // We've now successfully created c2's storage, so clear it out if we
......
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
#include "namespace.h" #include "namespace.h"
#include "lxcseccomp.h" #include "lxcseccomp.h"
#include "caps.h" #include "caps.h"
#include "bdev.h" #include "bdev/bdev.h"
#include "lsm/lsm.h" #include "lsm/lsm.h"
#include "lxclock.h" #include "lxclock.h"
......
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