From 1e63dc4f1cbec8a2d2bc053b49db23fe9d47a524 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 11 Sep 2022 22:46:39 +0900 Subject: [PATCH] dissect-image: take a reference of LoopDevice into DissectedImage To make LoopDevice object freed after DissectedImage is freed. At least currently, this should not change anything. Preparation for later commits. --- src/shared/dissect-image.c | 29 ++++++++++++++++++++++++++++- src/shared/dissect-image.h | 8 +++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index e97c22d796..ab8813447a 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -1120,6 +1120,10 @@ DissectedImage* dissected_image_unref(DissectedImage *m) { * DecryptedImage may try to deactivate partitions. */ decrypted_image_unref(m->decrypted_image); + /* Third, unref LoopDevice. This must be called after the above two, as freeing LoopDevice may try to + * remove existing partitions on the loopback block device. */ + loop_device_unref(m->loop); + free(m->image_name); free(m->hostname); strv_free(m->machine_info); @@ -2794,8 +2798,31 @@ finish: return r; } +int dissect_loop_device( + LoopDevice *loop, + const VeritySettings *verity, + const MountOptions *mount_options, + DissectImageFlags flags, + DissectedImage **ret) { + + _cleanup_(dissected_image_unrefp) DissectedImage *m = NULL; + int r; + + assert(loop); + assert(ret); + + r = dissect_image(loop->fd, loop->node, loop->backing_file ?: loop->node, verity, mount_options, flags, &m); + if (r < 0) + return r; + + m->loop = loop_device_ref(loop); + + *ret = TAKE_PTR(m); + return 0; +} + int dissect_loop_device_and_warn( - const LoopDevice *loop, + LoopDevice *loop, const VeritySettings *verity, const MountOptions *mount_options, DissectImageFlags flags, diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h index 7308798493..efddea80c7 100644 --- a/src/shared/dissect-image.h +++ b/src/shared/dissect-image.h @@ -210,6 +210,7 @@ struct DissectedImage { bool verity_sig_ready:1; /* verity signature logic, fully specified and usable */ bool single_file_system:1; /* MBR/GPT or single file system */ + LoopDevice *loop; DissectedPartition partitions[_PARTITION_DESIGNATOR_MAX]; DecryptedImage *decrypted_image; @@ -262,11 +263,8 @@ int dissect_image( const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); -static inline int dissect_loop_device(const LoopDevice *loop, const VeritySettings *verity, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret) { - assert(loop); - return dissect_image(loop->fd, loop->node, loop->backing_file ?: loop->node, verity, mount_options, flags, ret); -} -int dissect_loop_device_and_warn(const LoopDevice *loop, const VeritySettings *verity, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); +int dissect_loop_device(LoopDevice *loop, const VeritySettings *verity, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); +int dissect_loop_device_and_warn(LoopDevice *loop, const VeritySettings *verity, const MountOptions *mount_options, DissectImageFlags flags, DissectedImage **ret); DissectedImage* dissected_image_unref(DissectedImage *m); DEFINE_TRIVIAL_CLEANUP_FUNC(DissectedImage*, dissected_image_unref);