diff options
author | Ivan Shapovalov <intelfx@intelfx.name> | 2022-11-29 16:20:48 +0400 |
---|---|---|
committer | Ivan Shapovalov <intelfx@intelfx.name> | 2022-12-03 20:31:48 +0400 |
commit | c7779a61ac20133646aaeaee2986d4e0901f4861 (patch) | |
tree | 335867aaa64b640f2ccc94795830cec028cde659 /src/import | |
parent | e9231901a2df0484b1eda70d6bed9f4f7cefac64 (diff) | |
download | systemd-c7779a61ac20133646aaeaee2986d4e0901f4861.tar.gz |
import: wire up SYSTEMD_IMPORT_BTRFS_{SUBVOL,QUOTA} to importd
Btrfs quotas are actually being enabled in systemd-importd via
setup_machine_directory(), not in systemd-{import,pull} where those
environment variables are checked. Therefore, also check them in
systemd-importd and avoid enabling quotas if requested by the user.
Fixes: #18421
Fixes: #15903
Fixes: #24387
Diffstat (limited to 'src/import')
-rw-r--r-- | src/import/importd.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/src/import/importd.c b/src/import/importd.c index 9a3ea131c1..4f6be5f20c 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -94,6 +94,9 @@ struct Manager { int notify_fd; sd_event_source *notify_event_source; + + bool use_btrfs_subvol; + bool use_btrfs_quota; }; #define TRANSFERS_MAX 64 @@ -628,10 +631,15 @@ static int manager_new(Manager **ret) { assert(ret); - m = new0(Manager, 1); + m = new(Manager, 1); if (!m) return -ENOMEM; + *m = (Manager) { + .use_btrfs_subvol = true, + .use_btrfs_quota = true, + }; + r = sd_event_default(&m->event); if (r < 0) return r; @@ -719,7 +727,7 @@ static int method_import_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Local name %s is invalid", local); - r = setup_machine_directory(error); + r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota); if (r < 0) return r; @@ -788,7 +796,7 @@ static int method_import_fs(sd_bus_message *msg, void *userdata, sd_bus_error *e return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Local name %s is invalid", local); - r = setup_machine_directory(error); + r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota); if (r < 0) return r; @@ -939,7 +947,7 @@ static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_er return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unknown verification mode %s", verify); - r = setup_machine_directory(error); + r = setup_machine_directory(error, m->use_btrfs_subvol, m->use_btrfs_quota); if (r < 0) return r; @@ -1351,6 +1359,28 @@ static int manager_run(Manager *m) { m); } +static void manager_parse_env(Manager *m) { + int r; + + assert(m); + + /* Same as src/import/{import,pull}.c: + * Let's make these relatively low-level settings also controllable via env vars. User can then set + * them for systemd-importd.service if they like to tweak behaviour */ + + r = getenv_bool("SYSTEMD_IMPORT_BTRFS_SUBVOL"); + if (r >= 0) + m->use_btrfs_subvol = r; + else if (r != -ENXIO) + log_warning_errno(r, "Failed to parse $SYSTEMD_IMPORT_BTRFS_SUBVOL: %m"); + + r = getenv_bool("SYSTEMD_IMPORT_BTRFS_QUOTA"); + if (r >= 0) + m->use_btrfs_quota = r; + else if (r != -ENXIO) + log_warning_errno(r, "Failed to parse $SYSTEMD_IMPORT_BTRFS_QUOTA: %m"); +} + static int run(int argc, char *argv[]) { _cleanup_(manager_unrefp) Manager *m = NULL; int r; @@ -1373,6 +1403,8 @@ static int run(int argc, char *argv[]) { if (r < 0) return log_error_errno(r, "Failed to allocate manager object: %m"); + manager_parse_env(m); + r = manager_add_bus_objects(m); if (r < 0) return r; |