summaryrefslogtreecommitdiffstats
path: root/src/shared
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-09-11 15:41:03 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-09-18 00:56:32 +0200
commit36d5eb0bffc3cc7b8e4be1e41ee3cbd4ddd8c870 (patch)
tree7fb09d94831cf34c776ed57e8e200f114620c3d0 /src/shared
parentdissect-image: take reference of DecryptedImage into DissectedImage (diff)
downloadsystemd-36d5eb0bffc3cc7b8e4be1e41ee3cbd4ddd8c870.tar.xz
systemd-36d5eb0bffc3cc7b8e4be1e41ee3cbd4ddd8c870.zip
loop-util: introduce reference counter for LoopDevice
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/loop-util.c6
-rw-r--r--src/shared/loop-util.h2
2 files changed, 7 insertions, 1 deletions
diff --git a/src/shared/loop-util.c b/src/shared/loop-util.c
index 49f4b2bf6e..54251f0fb7 100644
--- a/src/shared/loop-util.c
+++ b/src/shared/loop-util.c
@@ -369,6 +369,7 @@ static int loop_configure(
return -ENOMEM;
*d = (LoopDevice) {
+ .n_ref = 1,
.fd = TAKE_FD(loop_with_fd),
.lock_fd = TAKE_FD(lock_fd),
.node = TAKE_PTR(node),
@@ -624,7 +625,7 @@ int loop_device_make_by_path(
return loop_device_make_internal(path, fd, open_flags, 0, 0, loop_flags, lock_op, ret);
}
-LoopDevice* loop_device_unref(LoopDevice *d) {
+static LoopDevice* loop_device_free(LoopDevice *d) {
_cleanup_close_ int control = -1;
int r;
@@ -696,6 +697,8 @@ LoopDevice* loop_device_unref(LoopDevice *d) {
return mfree(d);
}
+DEFINE_TRIVIAL_REF_UNREF_FUNC(LoopDevice, loop_device, loop_device_free);
+
void loop_device_relinquish(LoopDevice *d) {
assert(d);
@@ -796,6 +799,7 @@ int loop_device_open_full(
return -ENOMEM;
*d = (LoopDevice) {
+ .n_ref = 1,
.fd = TAKE_FD(fd),
.lock_fd = TAKE_FD(lock_fd),
.nr = nr,
diff --git a/src/shared/loop-util.h b/src/shared/loop-util.h
index cb0183ba07..756041adaa 100644
--- a/src/shared/loop-util.h
+++ b/src/shared/loop-util.h
@@ -11,6 +11,7 @@ typedef struct LoopDevice LoopDevice;
/* Some helpers for setting up loopback block devices */
struct LoopDevice {
+ unsigned n_ref;
int fd;
int lock_fd;
int nr; /* The loopback device index (i.e. 4 for /dev/loop4); if this object encapsulates a non-loopback block device, set to -1 */
@@ -34,6 +35,7 @@ static inline int loop_device_open(const char *loop_path, int open_flags, int lo
return loop_device_open_full(loop_path, -1, open_flags, lock_op, ret);
}
+LoopDevice* loop_device_ref(LoopDevice *d);
LoopDevice* loop_device_unref(LoopDevice *d);
DEFINE_TRIVIAL_CLEANUP_FUNC(LoopDevice*, loop_device_unref);