From: Christian Brauner Date: Sun, 4 Jun 2017 11:59:34 +0000 (+0200) Subject: bdev: "detect" loop file X-Git-Tag: lxc-2.1.0~103^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e009d5207431c60cc95a3d3c1fc6f698ab0a1a4;p=thirdparty%2Flxc.git bdev: "detect" loop file Signed-off-by: Christian Brauner --- diff --git a/src/lxc/bdev/bdev.c b/src/lxc/bdev/bdev.c index b1193f57a..f5d0f0eb3 100644 --- a/src/lxc/bdev/bdev.c +++ b/src/lxc/bdev/bdev.c @@ -854,12 +854,16 @@ static const struct bdev_type *get_bdev_by_name(const char *name) return NULL; } -static const struct bdev_type *bdev_query(struct lxc_conf *conf, const char *src) +static const struct bdev_type *bdev_query(struct lxc_conf *conf, + const char *src) { size_t i; - if (conf->rootfs.bdev_type) + if (conf->rootfs.bdev_type) { + DEBUG("config file specified rootfs type \"%s\"", + conf->rootfs.bdev_type); return get_bdev_by_name(conf->rootfs.bdev_type); + } for (i = 0; i < numbdevs; i++) { int r; @@ -870,6 +874,9 @@ static const struct bdev_type *bdev_query(struct lxc_conf *conf, const char *src if (i == numbdevs) return NULL; + + DEBUG("detected rootfs type \"%s\"", bdevs[i].name); + return &bdevs[i]; } diff --git a/src/lxc/bdev/lxcloop.c b/src/lxc/bdev/lxcloop.c index a4633e405..32f2f78cf 100644 --- a/src/lxc/bdev/lxcloop.c +++ b/src/lxc/bdev/lxcloop.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "bdev.h" @@ -157,8 +158,19 @@ int loop_destroy(struct bdev *orig) int loop_detect(const char *path) { + int ret; + struct stat s; + if (strncmp(path, "loop:", 5) == 0) return 1; + + ret = stat(path, &s); + if (ret < 0) + return 0; + + if (__S_ISTYPE(s.st_mode, S_IFREG)) + return 1; + return 0; } @@ -166,13 +178,19 @@ int loop_mount(struct bdev *bdev) { int ret, loopfd; char loname[MAXPATHLEN]; + char *src = bdev->src; if (strcmp(bdev->type, "loop")) return -22; + if (!bdev->src || !bdev->dest) return -22; - loopfd = lxc_prepare_loop_dev(bdev->src + 5, loname, LO_FLAGS_AUTOCLEAR); + /* skip prefix */ + if (!strncmp(bdev->src, "loop:", 5)) + src += 5; + + loopfd = lxc_prepare_loop_dev(src, loname, LO_FLAGS_AUTOCLEAR); if (loopfd < 0) return -1; DEBUG("prepared loop device \"%s\"", loname);