From: Wolfgang Bumiller Date: Fri, 3 Jul 2015 12:10:17 +0000 (+0200) Subject: Use /dev/loop-control if it exists X-Git-Tag: lxc-1.1.3~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6731fcae9cb0e8fdb7a3474c650a7e600884055;p=thirdparty%2Flxc.git Use /dev/loop-control if it exists Loop devices can be added on the fly when needed, they're not always created beforehand. The loop-control device can be used to find and allocate the next available number instead of going through the /dev directory contents (which is now only a fallback mechanism). Signed-off-by: Wolfgang Bumiller --- diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c index 520652c72..5540b49f2 100644 --- a/src/lxc/bdev.c +++ b/src/lxc/bdev.c @@ -1868,7 +1868,7 @@ static int loop_detect(const char *path) return 0; } -static int find_free_loopdev(int *retfd, char *namep) +static int find_free_loopdev_no_control(int *retfd, char *namep) { struct dirent dirent, *direntp; struct loop_info64 lo; @@ -1908,6 +1908,26 @@ static int find_free_loopdev(int *retfd, char *namep) return 0; } +static int find_free_loopdev(int *retfd, char *namep) +{ + int rc, fd = -1; + int ctl = open("/dev/loop-control", O_RDWR); + if (ctl < 0) + return find_free_loopdev_no_control(retfd, namep); + rc = ioctl(ctl, LOOP_CTL_GET_FREE); + if (rc >= 0) { + snprintf(namep, 100, "/dev/loop%d", rc); + fd = open(namep, O_RDWR); + } + close(ctl); + if (fd == -1) { + ERROR("No loop device found"); + return -1; + } + *retfd = fd; + return 0; +} + static int loop_mount(struct bdev *bdev) { int lfd, ffd = -1, ret = -1;