From 4b8ce14f6c68e5fd75a71fdb7bb998f070940ef1 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Thu, 9 Mar 2023 20:33:04 +0100 Subject: [PATCH] repart: Add support for reading mkfs options from environment --- docs/ENVIRONMENT.md | 6 ++++++ src/home/homework-luks.c | 22 ++-------------------- src/partition/repart.c | 20 +++++++++++++++++--- src/shared/mkfs-util.c | 21 +++++++++++++++++++++ src/shared/mkfs-util.h | 2 ++ 5 files changed, 48 insertions(+), 23 deletions(-) diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md index 3e957113e74..3ec5573ff95 100644 --- a/docs/ENVIRONMENT.md +++ b/docs/ENVIRONMENT.md @@ -520,3 +520,9 @@ SYSTEMD_HOME_DEBUG_SUFFIX=foo \ systemd-stub. Normally, requested measurement of resources is conditionalized on kernels that have booted with `systemd-stub`. With this environment variable the test for that my be bypassed, for testing purposes. + +`systemd-repart`: + +* `$SYSTEMD_REPART_MKFS_OPTIONS_` – configure additional arguments to use for + `mkfs` when formatting partition file systems. There's one variable for each + of the supported file systems. diff --git a/src/home/homework-luks.c b/src/home/homework-luks.c index 8912b3df524..ac3d2b417c6 100644 --- a/src/home/homework-luks.c +++ b/src/home/homework-luks.c @@ -2119,25 +2119,6 @@ static int home_truncate( return !trunc; /* Return == 0 if we managed to truncate, > 0 if we managed to allocate */ } -static int mkfs_options_for_fstype(const char *fstype, char ***ret) { - _cleanup_(strv_freep) char **l = NULL; - const char *e; - char *n; - - assert(fstype); - - n = strjoina("SYSTEMD_HOME_MKFS_OPTIONS_", fstype); - e = getenv(ascii_strupper(n)); - if (e) { - l = strv_split(e, NULL); - if (!l) - return -ENOMEM; - } - - *ret = TAKE_PTR(l); - return 0; -} - int home_create_luks( UserRecord *h, HomeSetup *setup, @@ -2371,9 +2352,10 @@ int home_create_luks( log_info("Setting up LUKS device %s completed.", setup->dm_node); - r = mkfs_options_for_fstype(fstype, &extra_mkfs_options); + r = mkfs_options_from_env("HOME", fstype, &extra_mkfs_options); if (r < 0) return log_error_errno(r, "Failed to determine mkfs command line options for '%s': %m", fstype); + r = make_filesystem(setup->dm_node, fstype, user_record_user_name_and_realm(h), NULL, fs_uuid, user_record_luks_discard(h), 0, extra_mkfs_options); if (r < 0) return r; diff --git a/src/partition/repart.c b/src/partition/repart.c index 4e0c5dd785c..d80ba573df5 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -4092,6 +4092,7 @@ static int context_mkfs(Context *context) { _cleanup_hashmap_free_ Hashmap *denylist = NULL; _cleanup_(rm_rf_physical_and_freep) char *root = NULL; _cleanup_(partition_target_freep) PartitionTarget *t = NULL; + _cleanup_strv_free_ char **extra_mkfs_options = NULL; if (p->dropped) continue; @@ -4143,8 +4144,14 @@ static int context_mkfs(Context *context) { return r; } + r = mkfs_options_from_env("REPART", p->format, &extra_mkfs_options); + if (r < 0) + return log_error_errno(r, + "Failed to determine mkfs command line options for '%s': %m", + p->format); + r = make_filesystem(partition_target_path(t), p->format, strempty(p->new_label), root, - p->fs_uuid, arg_discard, context->sector_size, NULL); + p->fs_uuid, arg_discard, context->sector_size, extra_mkfs_options); if (r < 0) return r; @@ -5413,6 +5420,7 @@ static int context_minimize(Context *context) { _cleanup_(rm_rf_physical_and_freep) char *root = NULL; _cleanup_(unlink_and_freep) char *temp = NULL; _cleanup_(loop_device_unrefp) LoopDevice *d = NULL; + _cleanup_strv_free_ char **extra_mkfs_options = NULL; _cleanup_close_ int fd = -EBADF; sd_id128_t fs_uuid; uint64_t fsz; @@ -5477,8 +5485,14 @@ static int context_minimize(Context *context) { return r; } + r = mkfs_options_from_env("REPART", p->format, &extra_mkfs_options); + if (r < 0) + return log_error_errno(r, + "Failed to determine mkfs command line options for '%s': %m", + p->format); + r = make_filesystem(d ? d->node : temp, p->format, strempty(p->new_label), root, fs_uuid, - arg_discard, context->sector_size, NULL); + arg_discard, context->sector_size, extra_mkfs_options); if (r < 0) return r; @@ -5532,7 +5546,7 @@ static int context_minimize(Context *context) { return log_error_errno(r, "Failed to make loopback device of %s: %m", temp); r = make_filesystem(d ? d->node : temp, p->format, strempty(p->new_label), root, p->fs_uuid, - arg_discard, context->sector_size, NULL); + arg_discard, context->sector_size, extra_mkfs_options); if (r < 0) return r; diff --git a/src/shared/mkfs-util.c b/src/shared/mkfs-util.c index d64ef0d47a0..7e620391e35 100644 --- a/src/shared/mkfs-util.c +++ b/src/shared/mkfs-util.c @@ -520,3 +520,24 @@ int make_filesystem( return 0; } + +int mkfs_options_from_env(const char *component, const char *fstype, char ***ret) { + _cleanup_(strv_freep) char **l = NULL; + const char *e; + char *n; + + assert(component); + assert(fstype); + assert(ret); + + n = strjoina("SYSTEMD_", component, "_MKFS_OPTIONS_", fstype); + e = getenv(ascii_strupper(n)); + if (e) { + l = strv_split(e, NULL); + if (!l) + return -ENOMEM; + } + + *ret = TAKE_PTR(l); + return 0; +} diff --git a/src/shared/mkfs-util.h b/src/shared/mkfs-util.h index b99ec3c0ad3..75ea58543a1 100644 --- a/src/shared/mkfs-util.h +++ b/src/shared/mkfs-util.h @@ -20,3 +20,5 @@ int make_filesystem( bool discard, uint64_t sector_size, char * const *extra_mkfs_args); + +int mkfs_options_from_env(const char *component, const char *fstype, char ***ret);