Unverified Commit 23eb8575 by Christian Brauner Committed by Stéphane Graber

dir: improvements

parent 8f2896da
...@@ -39,12 +39,12 @@ int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, ...@@ -39,12 +39,12 @@ int dir_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,
int snap, uint64_t newsize, struct lxc_conf *conf) int snap, uint64_t newsize, struct lxc_conf *conf)
{ {
char *src_no_prefix;
int ret; int ret;
size_t len; size_t len;
if (snap) { if (snap) {
ERROR("directories cannot be snapshotted. Try aufs or " ERROR("Directories cannot be snapshotted");
"overlayfs.");
return -1; return -1;
} }
...@@ -53,17 +53,25 @@ int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, ...@@ -53,17 +53,25 @@ int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 4 + 3; len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 4 + 3;
new->src = malloc(len); new->src = malloc(len);
if (!new->src) if (!new->src) {
ERROR("Failed to allocate memory");
return -1; return -1;
}
ret = snprintf(new->src, len, "dir:%s/%s/rootfs", lxcpath, cname); ret = snprintf(new->src, len, "dir:%s/%s/rootfs", lxcpath, cname);
if (ret < 0 || (size_t)ret >= len) if (ret < 0 || (size_t)ret >= len) {
ERROR("Failed to create string");
return -1; return -1;
}
new->dest = strdup(new->src + 4); src_no_prefix = lxc_storage_get_path(new->src, new->type);
if (!new->dest) new->dest = strdup(src_no_prefix);
if (!new->dest) {
ERROR("Failed to duplicate string \"%s\"", new->src);
return -1; return -1;
}
TRACE("Created new path \"%s\" for dir storage driver", new->dest);
return 0; return 0;
} }
...@@ -83,40 +91,45 @@ int dir_create(struct bdev *bdev, const char *dest, const char *n, ...@@ -83,40 +91,45 @@ int dir_create(struct bdev *bdev, const char *dest, const char *n,
len += strlen(src) + 1; len += strlen(src) + 1;
bdev->src = malloc(len); bdev->src = malloc(len);
if (!bdev->src) if (!bdev->src) {
ERROR("Failed to allocate memory");
return -1; return -1;
}
ret = snprintf(bdev->src, len, "dir:%s", src); ret = snprintf(bdev->src, len, "dir:%s", src);
if (ret < 0 || (size_t)ret >= len) if (ret < 0 || (size_t)ret >= len) {
ERROR("Failed to create string");
return -1; return -1;
}
bdev->dest = strdup(dest); bdev->dest = strdup(dest);
if (!bdev->dest) if (!bdev->dest) {
return -1; ERROR("Failed to duplicate string \"%s\"", dest);
ret = mkdir_p(src, 0755);
if (ret < 0) {
ERROR("Failed to create %s", src);
return -1; return -1;
} }
ret = mkdir_p(bdev->dest, 0755); ret = mkdir_p(dest, 0755);
if (ret < 0) { if (ret < 0) {
ERROR("Failed to create %s", bdev->dest); ERROR("Failed to create directory \"%s\"", dest);
return -1; return -1;
} }
TRACE("Created directory \"%s\"", dest);
return 0; return 0;
} }
int dir_destroy(struct bdev *orig) int dir_destroy(struct bdev *orig)
{ {
int ret;
char *src; char *src;
src = lxc_storage_get_path(orig->src, orig->src); src = lxc_storage_get_path(orig->src, orig->src);
if (lxc_rmdir_onedev(src, NULL) < 0) ret = lxc_rmdir_onedev(src, NULL);
if (ret < 0) {
ERROR("Failed to delete \"%s\"", src);
return -1; return -1;
}
return 0; return 0;
} }
...@@ -133,10 +146,9 @@ int dir_detect(const char *path) ...@@ -133,10 +146,9 @@ int dir_detect(const char *path)
int dir_mount(struct bdev *bdev) int dir_mount(struct bdev *bdev)
{ {
unsigned long mntflags;
char *src, *mntdata;
int ret; int ret;
unsigned long mflags; unsigned long mflags, mntflags;
char *src, *mntdata;
if (strcmp(bdev->type, "dir")) if (strcmp(bdev->type, "dir"))
return -22; return -22;
...@@ -144,7 +156,9 @@ int dir_mount(struct bdev *bdev) ...@@ -144,7 +156,9 @@ int dir_mount(struct bdev *bdev)
if (!bdev->src || !bdev->dest) if (!bdev->src || !bdev->dest)
return -22; return -22;
if (parse_mntopts(bdev->mntopts, &mntflags, &mntdata) < 0) { ret = parse_mntopts(bdev->mntopts, &mntflags, &mntdata);
if (ret < 0) {
ERROR("Failed to parse mount options \"%s\"", bdev->mntopts);
free(mntdata); free(mntdata);
return -22; return -22;
} }
...@@ -154,13 +168,19 @@ int dir_mount(struct bdev *bdev) ...@@ -154,13 +168,19 @@ int dir_mount(struct bdev *bdev)
ret = mount(src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, ret = mount(src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags,
mntdata); mntdata);
if ((0 == ret) && (mntflags & MS_RDONLY)) { if ((0 == ret) && (mntflags & MS_RDONLY)) {
DEBUG("remounting %s on %s with readonly options", DEBUG("Remounting \"%s\" on \"%s\" readonly",
src ? src : "(none)", bdev->dest ? bdev->dest : "(none)"); src ? src : "(none)", bdev->dest ? bdev->dest : "(none)");
mflags = add_required_remount_flags( mflags = add_required_remount_flags(src, bdev->dest, MS_BIND | MS_REC | mntflags | MS_REMOUNT);
src, bdev->dest, MS_BIND | MS_REC | mntflags | MS_REMOUNT);
ret = mount(src, bdev->dest, "bind", mflags, mntdata); ret = mount(src, bdev->dest, "bind", mflags, mntdata);
} }
if (ret < 0) {
SYSERROR("Failed to mount \"%s\" on \"%s\"", src, bdev->dest);
free(mntdata);
return -1;
}
TRACE("Mounted \"%s\" on \"%s\"", src, bdev->dest);
free(mntdata); free(mntdata);
return ret; return ret;
} }
......
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