losetup: use loop-control to explicitly ask for device
Now we use LOOP_CTL_GET_FREE ioctl to ask for free device, for example losetup -f foo.img Unfortunately, losetup(8) allows to ask for specified device losetup /dev/loop100 foo.img and in this case we assume that the device already exists in the system. This is incorrect, we should be able to use loop-control LOOP_CTL_ADD ioctl to ask for the specified device. Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
777519226d
commit
3cb2413b02
|
@ -149,6 +149,7 @@ extern void loopcxt_enable_debug(struct loopdev_cxt *lc, int enable);
|
|||
extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device)
|
||||
__attribute__ ((warn_unused_result));
|
||||
extern int loopcxt_has_device(struct loopdev_cxt *lc);
|
||||
extern int loopcxt_add_device(struct loopdev_cxt *lc);
|
||||
extern char *loopcxt_strdup_device(struct loopdev_cxt *lc);
|
||||
extern const char *loopcxt_get_device(struct loopdev_cxt *lc);
|
||||
extern struct sysfs_cxt *loopcxt_get_sysfs(struct loopdev_cxt *lc);
|
||||
|
|
|
@ -1297,6 +1297,36 @@ int loopcxt_delete_device(struct loopdev_cxt *lc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int loopcxt_add_device(struct loopdev_cxt *lc)
|
||||
{
|
||||
int rc = -EINVAL;
|
||||
int ctl, nr = -1;
|
||||
const char *p, *dev = loopcxt_get_device(lc);
|
||||
|
||||
if (!dev)
|
||||
goto done;
|
||||
|
||||
if (!(lc->flags & LOOPDEV_FL_CONTROL)) {
|
||||
rc = -ENOSYS;
|
||||
goto done;
|
||||
}
|
||||
|
||||
p = strrchr(dev, '/');
|
||||
if (!p || (sscanf(p, "/loop%d", &nr) != 1 && sscanf(p, "/%d", &nr) != 1)
|
||||
|| nr < 0)
|
||||
goto done;
|
||||
|
||||
ctl = open(_PATH_DEV_LOOPCTL, O_RDWR|O_CLOEXEC);
|
||||
if (ctl >= 0) {
|
||||
DBG(lc, loopdev_debug("add_device %d", nr));
|
||||
rc = ioctl(ctl, LOOP_CTL_ADD, nr);
|
||||
close(ctl);
|
||||
}
|
||||
done:
|
||||
DBG(lc, loopdev_debug("add_device done [rc=%d]", rc));
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that LOOP_CTL_GET_FREE ioctl is supported since kernel 3.1. In older
|
||||
* kernels we have to check all loop devices to found unused one.
|
||||
|
|
|
@ -641,6 +641,8 @@ int main(int argc, char **argv)
|
|||
{
|
||||
int hasdev = loopcxt_has_device(&lc);
|
||||
|
||||
if (hasdev && !is_loopdev(loopcxt_get_device(&lc)))
|
||||
loopcxt_add_device(&lc);
|
||||
do {
|
||||
const char *errpre;
|
||||
|
||||
|
|
Loading…
Reference in New Issue