|
|
05ad79 |
diff -up util-linux-2.23.2/include/loopdev.h.kzak util-linux-2.23.2/include/loopdev.h
|
|
|
05ad79 |
--- util-linux-2.23.2/include/loopdev.h.kzak 2013-06-13 09:46:10.397650425 +0200
|
|
|
05ad79 |
+++ util-linux-2.23.2/include/loopdev.h 2014-01-14 11:11:48.427643690 +0100
|
|
|
05ad79 |
@@ -149,6 +149,7 @@ extern void loopcxt_enable_debug(struct
|
|
|
05ad79 |
extern int loopcxt_set_device(struct loopdev_cxt *lc, const char *device)
|
|
|
05ad79 |
__attribute__ ((warn_unused_result));
|
|
|
05ad79 |
extern int loopcxt_has_device(struct loopdev_cxt *lc);
|
|
|
05ad79 |
+extern int loopcxt_add_device(struct loopdev_cxt *lc);
|
|
|
05ad79 |
extern char *loopcxt_strdup_device(struct loopdev_cxt *lc);
|
|
|
05ad79 |
extern const char *loopcxt_get_device(struct loopdev_cxt *lc);
|
|
|
05ad79 |
extern struct sysfs_cxt *loopcxt_get_sysfs(struct loopdev_cxt *lc);
|
|
|
05ad79 |
diff -up util-linux-2.23.2/lib/loopdev.c.kzak util-linux-2.23.2/lib/loopdev.c
|
|
|
05ad79 |
--- util-linux-2.23.2/lib/loopdev.c.kzak 2013-07-30 11:19:20.143600300 +0200
|
|
|
05ad79 |
+++ util-linux-2.23.2/lib/loopdev.c 2014-01-14 11:11:48.428643700 +0100
|
|
|
05ad79 |
@@ -1298,6 +1298,36 @@ int loopcxt_delete_device(struct loopdev
|
|
|
05ad79 |
return 0;
|
|
|
05ad79 |
}
|
|
|
05ad79 |
|
|
|
05ad79 |
+int loopcxt_add_device(struct loopdev_cxt *lc)
|
|
|
05ad79 |
+{
|
|
|
05ad79 |
+ int rc = -EINVAL;
|
|
|
05ad79 |
+ int ctl, nr = -1;
|
|
|
05ad79 |
+ const char *p, *dev = loopcxt_get_device(lc);
|
|
|
05ad79 |
+
|
|
|
05ad79 |
+ if (!dev)
|
|
|
05ad79 |
+ goto done;
|
|
|
05ad79 |
+
|
|
|
05ad79 |
+ if (!(lc->flags & LOOPDEV_FL_CONTROL)) {
|
|
|
05ad79 |
+ rc = -ENOSYS;
|
|
|
05ad79 |
+ goto done;
|
|
|
05ad79 |
+ }
|
|
|
05ad79 |
+
|
|
|
05ad79 |
+ p = strrchr(dev, '/');
|
|
|
05ad79 |
+ if (!p || (sscanf(p, "/loop%d", &nr) != 1 && sscanf(p, "/%d", &nr) != 1)
|
|
|
05ad79 |
+ || nr < 0)
|
|
|
05ad79 |
+ goto done;
|
|
|
05ad79 |
+
|
|
|
05ad79 |
+ ctl = open(_PATH_DEV_LOOPCTL, O_RDWR|O_CLOEXEC);
|
|
|
05ad79 |
+ if (ctl >= 0) {
|
|
|
05ad79 |
+ DBG(lc, loopdev_debug("add_device %d", nr));
|
|
|
05ad79 |
+ rc = ioctl(ctl, LOOP_CTL_ADD, nr);
|
|
|
05ad79 |
+ close(ctl);
|
|
|
05ad79 |
+ }
|
|
|
05ad79 |
+done:
|
|
|
05ad79 |
+ DBG(lc, loopdev_debug("add_device done [rc=%d]", rc));
|
|
|
05ad79 |
+ return rc;
|
|
|
05ad79 |
+}
|
|
|
05ad79 |
+
|
|
|
05ad79 |
/*
|
|
|
05ad79 |
* Note that LOOP_CTL_GET_FREE ioctl is supported since kernel 3.1. In older
|
|
|
05ad79 |
* kernels we have to check all loop devices to found unused one.
|
|
|
05ad79 |
diff -up util-linux-2.23.2/sys-utils/losetup.c.kzak util-linux-2.23.2/sys-utils/losetup.c
|
|
|
05ad79 |
--- util-linux-2.23.2/sys-utils/losetup.c.kzak 2013-07-30 11:20:16.987117853 +0200
|
|
|
05ad79 |
+++ util-linux-2.23.2/sys-utils/losetup.c 2014-01-14 11:11:48.428643700 +0100
|
|
|
05ad79 |
@@ -600,6 +600,8 @@ int main(int argc, char **argv)
|
|
|
05ad79 |
{
|
|
|
05ad79 |
int hasdev = loopcxt_has_device(&lc);
|
|
|
05ad79 |
|
|
|
05ad79 |
+ if (hasdev && !is_loopdev(loopcxt_get_device(&lc)))
|
|
|
05ad79 |
+ loopcxt_add_device(&lc);
|
|
|
05ad79 |
do {
|
|
|
05ad79 |
const char *errpre;
|
|
|
05ad79 |
|