Commit edd7414a by Wolfgang Bumiller

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: 's avatarWolfgang Bumiller <w.bumiller@proxmox.com>
parent 814d049d
...@@ -1868,7 +1868,7 @@ static int loop_detect(const char *path) ...@@ -1868,7 +1868,7 @@ static int loop_detect(const char *path)
return 0; 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 dirent dirent, *direntp;
struct loop_info64 lo; struct loop_info64 lo;
...@@ -1908,6 +1908,26 @@ static int find_free_loopdev(int *retfd, char *namep) ...@@ -1908,6 +1908,26 @@ static int find_free_loopdev(int *retfd, char *namep)
return 0; 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) static int loop_mount(struct bdev *bdev)
{ {
int lfd, ffd = -1, ret = -1; int lfd, ffd = -1, ret = -1;
......
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