summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2022-09-01 12:38:53 +0200
committerLennart Poettering <lennart@poettering.net>2022-09-01 22:05:10 +0200
commit234c2e16e5686d1a49fe84e534d4edb2db8d3719 (patch)
treee0db0ef1c46e0ec08cd850327d1e3d3f6c452317 /src
parente8383058b2378e516b1a6c092b323537624db475 (diff)
downloadsystemd-234c2e16e5686d1a49fe84e534d4edb2db8d3719.tar.gz
dissect: drop partition removal code
This reverts a major chunk of 75d7e04eb4662a814c26010d447eed8a862f5ec1 Now that the loopback device code already destroys the partitions we don't have to do this here anymore. I am sure the right place to delete the partitions is in the loopback code, since we really only should do that for loopback devices, see bug #24431, and not on "real" block devices. I am also not convinced dropping partitions the dissection logic doesn't care about is a good idea, after all. The dissection stuff should probably not consider itself the "owner" of the block devices it analyzes, but take a more passive role: figure out what is what, but not modify it. Fixes: #24431
Diffstat (limited to 'src')
-rw-r--r--src/core/namespace.c1
-rw-r--r--src/dissect/dissect.c2
-rw-r--r--src/gpt-auto-generator/gpt-auto-generator.c2
-rw-r--r--src/shared/dissect-image.c47
-rw-r--r--src/shared/dissect-image.h4
-rw-r--r--src/sysext/sysext.c1
6 files changed, 5 insertions, 52 deletions
diff --git a/src/core/namespace.c b/src/core/namespace.c
index d774467658..aaafdd8d0f 100644
--- a/src/core/namespace.c
+++ b/src/core/namespace.c
@@ -2432,7 +2432,6 @@ int setup_namespace(
}
}
- dissected_image_relinquish(dissected_image);
loop_device_relinquish(loop_device);
} else if (root_directory) {
diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c
index 0c33cacdba..858ed6a8f9 100644
--- a/src/dissect/dissect.c
+++ b/src/dissect/dissect.c
@@ -685,7 +685,6 @@ static int action_mount(DissectedImage *m, LoopDevice *d) {
return log_error_errno(r, "Failed to relinquish DM devices: %m");
}
- dissected_image_relinquish(m);
loop_device_relinquish(d);
return 0;
}
@@ -738,7 +737,6 @@ static int action_copy(DissectedImage *m, LoopDevice *d) {
return log_error_errno(r, "Failed to relinquish DM devices: %m");
}
- dissected_image_relinquish(m);
loop_device_relinquish(d);
if (arg_action == ACTION_COPY_FROM) {
diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c
index a95f384ecb..bd16ae333c 100644
--- a/src/gpt-auto-generator/gpt-auto-generator.c
+++ b/src/gpt-auto-generator/gpt-auto-generator.c
@@ -772,8 +772,6 @@ static int enumerate_partitions(dev_t devnum) {
r = k;
}
- dissected_image_relinquish(m);
-
return r;
}
diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c
index 4782330a0c..45218944e0 100644
--- a/src/shared/dissect-image.c
+++ b/src/shared/dissect-image.c
@@ -150,20 +150,9 @@ static void check_partition_flags(
}
#endif
-static void dissected_partition_done(int fd, DissectedPartition *p) {
- assert(fd >= 0);
+static void dissected_partition_done(DissectedPartition *p) {
assert(p);
-#if HAVE_BLKID
- if (p->node && p->partno > 0 && !p->relinquished) {
- int r;
-
- r = block_device_remove_partition(fd, p->node, p->partno);
- if (r < 0)
- log_debug_errno(r, "BLKPG_DEL_PARTITION failed, ignoring: %m");
- }
-#endif
-
free(p->fstype);
free(p->node);
free(p->label);
@@ -312,14 +301,9 @@ int dissect_image(
return -ENOMEM;
*m = (DissectedImage) {
- .fd = -1,
.has_init_system = -1,
};
- m->fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
- if (m->fd < 0)
- return -errno;
-
r = sd_device_get_sysname(d, &sysname);
if (r < 0)
return log_debug_errno(r, "Failed to get device sysname: %m");
@@ -775,14 +759,10 @@ int dissect_image(
* scheme in OS images. */
if (!PARTITION_DESIGNATOR_VERSIONED(designator) ||
- strverscmp_improved(m->partitions[designator].label, label) >= 0) {
- r = block_device_remove_partition(fd, node, nr);
- if (r < 0)
- log_debug_errno(r, "BLKPG_DEL_PARTITION failed, ignoring: %m");
+ strverscmp_improved(m->partitions[designator].label, label) >= 0)
continue;
- }
- dissected_partition_done(fd, m->partitions + designator);
+ dissected_partition_done(m->partitions + designator);
}
if (fstype) {
@@ -852,12 +832,8 @@ int dissect_image(
const char *sid, *options = NULL;
/* First one wins */
- if (m->partitions[PARTITION_XBOOTLDR].found) {
- r = block_device_remove_partition(fd, node, nr);
- if (r < 0)
- log_debug_errno(r, "BLKPG_DEL_PARTITION failed, ignoring: %m");
+ if (m->partitions[PARTITION_XBOOTLDR].found)
continue;
- }
sid = blkid_partition_get_uuid(pp);
if (sid)
@@ -1171,9 +1147,8 @@ DissectedImage* dissected_image_unref(DissectedImage *m) {
return NULL;
for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++)
- dissected_partition_done(m->fd, m->partitions + i);
+ dissected_partition_done(m->partitions + i);
- safe_close(m->fd);
free(m->image_name);
free(m->hostname);
strv_free(m->machine_info);
@@ -1183,16 +1158,6 @@ DissectedImage* dissected_image_unref(DissectedImage *m) {
return mfree(m);
}
-void dissected_image_relinquish(DissectedImage *m) {
- assert(m);
-
- /* Partitions are automatically removed when the underlying loop device is closed. We just need to
- * make sure we don't try to remove the partitions early. */
-
- for (PartitionDesignator i = 0; i < _PARTITION_DESIGNATOR_MAX; i++)
- m->partitions[i].relinquished = true;
-}
-
static int is_loop_device(const char *path) {
char s[SYS_BLOCK_PATH_MAX("/../loop/")];
struct stat st;
@@ -3046,7 +3011,6 @@ int mount_image_privately_interactively(
return log_error_errno(r, "Failed to relinquish DM devices: %m");
}
- dissected_image_relinquish(dissected_image);
loop_device_relinquish(d);
*ret_directory = TAKE_PTR(created_dir);
@@ -3209,7 +3173,6 @@ int verity_dissect_and_mount(
return log_debug_errno(r, "Failed to relinquish decrypted image: %m");
}
- dissected_image_relinquish(dissected_image);
loop_device_relinquish(loop_device);
return 0;
diff --git a/src/shared/dissect-image.h b/src/shared/dissect-image.h
index 5230189c16..55bb8a1dad 100644
--- a/src/shared/dissect-image.h
+++ b/src/shared/dissect-image.h
@@ -31,7 +31,6 @@ struct DissectedPartition {
char *mount_options;
uint64_t size;
uint64_t offset;
- bool relinquished;
};
typedef enum PartitionDesignator {
@@ -204,8 +203,6 @@ typedef enum DissectImageFlags {
} DissectImageFlags;
struct DissectedImage {
- int fd; /* Backing fd */
-
bool encrypted:1;
bool has_verity:1; /* verity available in image, but not necessarily used */
bool has_verity_sig:1; /* pkcs#7 signature embedded in image */
@@ -261,7 +258,6 @@ int dissect_image_and_warn(int fd, const char *name, const VeritySettings *verit
DissectedImage* dissected_image_unref(DissectedImage *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(DissectedImage*, dissected_image_unref);
-void dissected_image_relinquish(DissectedImage *m);
int dissected_image_decrypt(DissectedImage *m, const char *passphrase, const VeritySettings *verity, DissectImageFlags flags, DecryptedImage **ret);
int dissected_image_decrypt_interactively(DissectedImage *m, const char *passphrase, const VeritySettings *verity, DissectImageFlags flags, DecryptedImage **ret);
diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c
index a8593cec4d..2f6cf22d2e 100644
--- a/src/sysext/sysext.c
+++ b/src/sysext/sysext.c
@@ -585,7 +585,6 @@ static int merge_subprocess(Hashmap *images, const char *workspace) {
return log_error_errno(r, "Failed to relinquish DM devices: %m");
}
- dissected_image_relinquish(m);
loop_device_relinquish(d);
break;
}