]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
loop-util: allow refreshing offset
authorLennart Poettering <lennart@poettering.net>
Mon, 20 May 2019 14:15:22 +0000 (16:15 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Dec 2019 09:06:00 +0000 (10:06 +0100)
src/shared/loop-util.c
src/shared/loop-util.h

index 4bd89d37cbbaed85e3e7177373905756232b8f7c..b1d07fe708f3c76e665217fe96e4425fd1bb94bc 100644 (file)
@@ -208,13 +208,27 @@ int loop_device_open(const char *loop_path, int open_flags, LoopDevice **ret) {
         return d->fd;
 }
 
-int loop_device_refresh_size(LoopDevice *d) {
+int loop_device_refresh_size(LoopDevice *d, uint64_t offset, uint64_t size) {
+        struct loop_info64 info;
         assert(d);
 
         if (d->fd < 0)
                 return -EBADF;
 
-        if (ioctl(d->fd, LOOP_SET_CAPACITY) < 0)
+        if (ioctl(d->fd, LOOP_GET_STATUS64, &info) < 0)
+                return -errno;
+
+        if (size == UINT64_MAX && offset == UINT64_MAX)
+                return 0;
+        if (info.lo_sizelimit == size && info.lo_offset == offset)
+                return 0;
+
+        if (size != UINT64_MAX)
+                info.lo_sizelimit = size;
+        if (offset != UINT64_MAX)
+                info.lo_offset = offset;
+
+        if (ioctl(d->fd, LOOP_SET_STATUS64, &info) < 0)
                 return -errno;
 
         return 0;
index 50b959fe2514777dee3fa4d73d7532050af0f6f6..e5a0ae75b8cf0aee144b1f6697a5eee3caa87b64 100644 (file)
@@ -27,4 +27,4 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(LoopDevice*, loop_device_unref);
 
 void loop_device_relinquish(LoopDevice *d);
 
-int loop_device_refresh_size(LoopDevice *d);
+int loop_device_refresh_size(LoopDevice *d, uint64_t offset, uint64_t size);