Merge pull request #1134 from brauner/2016-08-16/load_correct_ovl_module

bdev: use correct overlay module name
This commit is contained in:
Stéphane Graber 2016-08-16 22:56:43 +02:00 committed by GitHub
commit 91e7dd57a0

View File

@ -39,6 +39,7 @@
lxc_log_define(lxcoverlay, lxc); lxc_log_define(lxcoverlay, lxc);
static char *ovl_name; static char *ovl_name;
static char *ovl_version[] = {"overlay", "overlayfs"};
/* defined in lxccontainer.c: needs to become common helper */ /* defined in lxccontainer.c: needs to become common helper */
extern char *dir_new_path(char *src, const char *oldname, const char *name, extern char *dir_new_path(char *src, const char *oldname, const char *name,
@ -49,6 +50,9 @@ static int ovl_do_rsync(struct bdev *orig, struct bdev *new,
struct lxc_conf *conf); struct lxc_conf *conf);
static int ovl_rsync(struct rsync_data *data); static int ovl_rsync(struct rsync_data *data);
static int ovl_rsync_wrapper(void *data); static int ovl_rsync_wrapper(void *data);
static int ovl_remount_on_enodev(const char *lower, const char *target,
const char *name, unsigned long mountflags,
const void *options);
int ovl_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, int ovl_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
const char *cname, const char *oldpath, const char *lxcpath, const char *cname, const char *oldpath, const char *lxcpath,
@ -408,23 +412,28 @@ int ovl_mount(struct bdev *bdev)
return -1; return -1;
} }
// mount without workdir option for overlayfs before v21 /* Assume we need a workdir as we are on a overlay version >= v22. */
ret = mount(lower, bdev->dest, ovl_name, MS_MGC_VAL | mntflags, options); ret = ovl_remount_on_enodev(lower, bdev->dest, ovl_name,
MS_MGC_VAL | mntflags, options_work);
if (ret < 0) { if (ret < 0) {
INFO("overlayfs: error mounting %s onto %s options %s. retry with workdir", INFO("Overlayfs: Error mounting %s onto %s with options %s. "
lower, bdev->dest, options); "Retrying without workdir: %s.",
lower, bdev->dest, options_work, strerror(errno));
// retry with workdir option for overlayfs v22 and higher /* Assume we cannot use a workdir as we are on a version <= v21. */
ret = mount(lower, bdev->dest, ovl_name, MS_MGC_VAL | mntflags, options_work); ret = ovl_remount_on_enodev(lower, bdev->dest, ovl_name,
MS_MGC_VAL | mntflags, options);
if (ret < 0) if (ret < 0)
SYSERROR("overlayfs: error mounting %s onto %s options %s", SYSERROR("Overlayfs: Error mounting %s onto %s with "
lower, bdev->dest, options_work); "options %s: %s.",
lower, bdev->dest, options,
strerror(errno));
else else
INFO("overlayfs: mounted %s onto %s options %s", INFO("Overlayfs: Mounted %s onto %s with options %s.",
lower, bdev->dest, options_work); lower, bdev->dest, options);
} else { } else {
INFO("overlayfs: mounted %s onto %s options %s", INFO("Overlayfs: Mounted %s onto %s with options %s.", lower,
lower, bdev->dest, options); bdev->dest, options_work);
} }
return ret; return ret;
} }
@ -652,6 +661,20 @@ err:
return fret; return fret;
} }
static int ovl_remount_on_enodev(const char *lower, const char *target,
const char *name, unsigned long mountflags,
const void *options)
{
int ret;
ret = mount(lower, target, ovl_name, MS_MGC_VAL | mountflags, options);
if (ret < 0 && errno == ENODEV) /* Try other module name. */
ret = mount(lower, target,
ovl_name == ovl_version[0] ? ovl_version[1]
: ovl_version[0],
MS_MGC_VAL | mountflags, options);
return ret;
}
static int ovl_rsync(struct rsync_data *data) static int ovl_rsync(struct rsync_data *data)
{ {
int ret; int ret;
@ -700,7 +723,7 @@ static int ovl_rsync(struct rsync_data *data)
static char *ovl_detect_name(void) static char *ovl_detect_name(void)
{ {
char *v = "overlayfs"; char *v = ovl_version[0];
char *line = NULL; char *line = NULL;
size_t len = 0; size_t len = 0;
FILE *f = fopen("/proc/filesystems", "r"); FILE *f = fopen("/proc/filesystems", "r");
@ -708,8 +731,8 @@ static char *ovl_detect_name(void)
return v; return v;
while (getline(&line, &len, f) != -1) { while (getline(&line, &len, f) != -1) {
if (strcmp(line, "nodev\toverlay\n") == 0) { if (strcmp(line, "nodev\toverlayfs\n") == 0) {
v = "overlay"; v = ovl_version[1];
break; break;
} }
} }