]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
loop-util: add API to refresh loopback device size and opening existing loopback...
authorLennart Poettering <lennart@poettering.net>
Mon, 31 Dec 2018 15:56:14 +0000 (16:56 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Dec 2019 09:05:38 +0000 (10:05 +0100)
src/shared/loop-util.c
src/shared/loop-util.h

index 9c1d8a391051c66f1c2d69876d1fa7db3b3001dc..150029400db614f1ebe84527d0723cdaa966a7c6 100644 (file)
@@ -157,3 +157,53 @@ void loop_device_relinquish(LoopDevice *d) {
 
         d->relinquished = true;
 }
+
+int loop_device_open(const char *loop_path, int open_flags, LoopDevice **ret) {
+        _cleanup_close_ int loop_fd = -1;
+        _cleanup_free_ char *p = NULL;
+        struct stat st;
+        LoopDevice *d;
+
+        assert(loop_path);
+        assert(ret);
+
+        loop_fd = open(loop_path, O_CLOEXEC|O_NONBLOCK|O_NOCTTY|open_flags);
+        if (loop_fd < 0)
+                return -errno;
+
+        if (fstat(loop_fd, &st) < 0)
+                return -errno;
+
+        if (!S_ISBLK(st.st_mode))
+                return -ENOTBLK;
+
+        p = strdup(loop_path);
+        if (!p)
+                return -ENOMEM;
+
+        d = new(LoopDevice, 1);
+        if (!d)
+                return -ENOMEM;
+
+        *d = (LoopDevice) {
+                .fd = TAKE_FD(loop_fd),
+                .nr = -1,
+                .node = TAKE_PTR(p),
+                .relinquished = true, /* It's not ours, don't try to destroy it when this object is freed */
+        };
+
+        *ret = d;
+        return d->fd;
+}
+
+int loop_device_refresh_size(LoopDevice *d) {
+        assert(d);
+
+        if (d->fd < 0)
+                return -EBADF;
+
+        if (ioctl(d->fd, LOOP_SET_CAPACITY) < 0)
+                return -errno;
+
+        return 0;
+}
index c881a43cdc2cdddd484fdab5be430c800456e95a..80a114f9d996ade50023c222814a4eb43f13fe90 100644 (file)
@@ -16,8 +16,11 @@ struct LoopDevice {
 
 int loop_device_make(int fd, int open_flags, uint32_t loop_flags, LoopDevice **ret);
 int loop_device_make_by_path(const char *path, int open_flags, uint32_t loop_flags, LoopDevice **ret);
+int loop_device_open(const char *loop_path, int open_flags, LoopDevice **ret);
 
 LoopDevice* loop_device_unref(LoopDevice *d);
 DEFINE_TRIVIAL_CLEANUP_FUNC(LoopDevice*, loop_device_unref);
 
 void loop_device_relinquish(LoopDevice *d);
+
+int loop_device_refresh_size(LoopDevice *d);