summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2023-03-09 20:33:04 +0100
committerLennart Poettering <lennart@poettering.net>2023-03-10 09:33:39 +0100
commit4b8ce14f6c68e5fd75a71fdb7bb998f070940ef1 (patch)
tree019e0245cd0fc45019b2a01179aac46f1487a1c6
parentMerge pull request #26741 from poettering/acquire-fd-fixes (diff)
downloadsystemd-4b8ce14f6c68e5fd75a71fdb7bb998f070940ef1.tar.xz
systemd-4b8ce14f6c68e5fd75a71fdb7bb998f070940ef1.zip
repart: Add support for reading mkfs options from environment
-rw-r--r--docs/ENVIRONMENT.md6
-rw-r--r--src/home/homework-luks.c22
-rw-r--r--src/partition/repart.c20
-rw-r--r--src/shared/mkfs-util.c21
-rw-r--r--src/shared/mkfs-util.h2
5 files changed, 48 insertions, 23 deletions
diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md
index 3e957113e7..3ec5573ff9 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_<FSTYPE>` – 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 8912b3df52..ac3d2b417c 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 4e0c5dd785..d80ba573df 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 d64ef0d47a..7e620391e3 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 b99ec3c0ad..75ea58543a 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);