]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
loopdev: Implememt loopcxt_set_status()
authorStanislav Brabec <sbrabec@suse.cz>
Tue, 2 Aug 2016 17:57:56 +0000 (19:57 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 17 Aug 2016 10:49:06 +0000 (12:49 +0200)
Implement stand-alone loopcxt_set_status(). It allows manipulation with some
loop device parameters even if it is initialized.

Its function is limited by the kernel implementation, and only a small subset of
changes is allowed.

For more see linux/drivers/block/loop.c:loop_set_status()

Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
include/loopdev.h
lib/loopdev.c

index ed6ef2384d0004da4f48d603c8f5db370207dce8..953d2db89584d0c74725a4e3bbdc7594b431e67b 100644 (file)
@@ -164,6 +164,7 @@ extern int loopcxt_deinit_iterator(struct loopdev_cxt *lc);
 extern int loopcxt_next(struct loopdev_cxt *lc);
 
 extern int loopcxt_setup_device(struct loopdev_cxt *lc);
+extern int loopcxt_set_status(struct loopdev_cxt *lc);
 extern int loopcxt_delete_device(struct loopdev_cxt *lc);
 extern int loopcxt_set_capacity(struct loopdev_cxt *lc);
 extern int loopcxt_set_dio(struct loopdev_cxt *lc, unsigned long use_dio);
index 8bbde042592cefe75e31bacf230511c17817b531..b3941dd142c8ca88f8707f46ffd438da2ab78206 100644 (file)
@@ -1204,7 +1204,7 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd)
 }
 
 /*
- * @cl: context
+ * @lc: context
  *
  * Associate the current device (see loopcxt_{set,get}_device()) with
  * a file (see loopcxt_set_backing_file()).
@@ -1328,6 +1328,40 @@ err:
        return rc;
 }
 
+/*
+ * @lc: context
+ *
+ * Update status of the current device (see loopcxt_{set,get}_device()).
+ *
+ * Note that once initialized, kernel accepts only selected changes:
+ * LO_FLAGS_AUTOCLEAR and LO_FLAGS_PARTSCAN
+ * For more see linux/drivers/block/loop.c:loop_set_status()
+ *
+ * Returns: <0 on error, 0 on success.
+ */
+int loopcxt_set_status(struct loopdev_cxt *lc)
+{
+       int dev_fd, rc = -1;
+
+       errno = 0;
+       dev_fd = loopcxt_get_fd(lc);
+
+       if (dev_fd < 0) {
+               rc = -errno;
+               return rc;
+       }
+       DBG(SETUP, ul_debugobj(lc, "device open: OK"));
+
+       if (ioctl(dev_fd, LOOP_SET_STATUS64, &lc->info)) {
+               rc = -errno;
+               DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64 failed: %m"));
+               return rc;
+       }
+
+       DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64: OK"));
+       return 0;
+}
+
 int loopcxt_set_capacity(struct loopdev_cxt *lc)
 {
        int fd = loopcxt_get_fd(lc);