summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Shapovalov <intelfx@intelfx.name>2022-11-29 16:20:48 +0400
committerIvan Shapovalov <intelfx@intelfx.name>2022-12-03 20:31:48 +0400
commitc7779a61ac20133646aaeaee2986d4e0901f4861 (patch)
tree335867aaa64b640f2ccc94795830cec028cde659
parente9231901a2df0484b1eda70d6bed9f4f7cefac64 (diff)
downloadsystemd-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
-rw-r--r--src/import/importd.c40
-rw-r--r--src/machine/machined-dbus.c2
-rw-r--r--src/shared/machine-pool.c8
-rw-r--r--src/shared/machine-pool.h2
4 files changed, 45 insertions, 7 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;
diff --git a/src/machine/machined-dbus.c b/src/machine/machined-dbus.c
index e2d0784857..56dd22d757 100644
--- a/src/machine/machined-dbus.c
+++ b/src/machine/machined-dbus.c
@@ -863,7 +863,7 @@ static int method_set_pool_limit(sd_bus_message *message, void *userdata, sd_bus
return 1; /* Will call us back */
/* Set up the machine directory if necessary */
- r = setup_machine_directory(error);
+ r = setup_machine_directory(error, /* use_btrfs_subvol= */ true, /* use_btrfs_quota= */ true);
if (r < 0)
return r;
diff --git a/src/shared/machine-pool.c b/src/shared/machine-pool.c
index b495d4d79f..fb0b2f5adc 100644
--- a/src/shared/machine-pool.c
+++ b/src/shared/machine-pool.c
@@ -22,7 +22,7 @@ static int check_btrfs(void) {
return F_TYPE_EQUAL(sfs.f_type, BTRFS_SUPER_MAGIC);
}
-int setup_machine_directory(sd_bus_error *error) {
+int setup_machine_directory(sd_bus_error *error, bool use_btrfs_subvol, bool use_btrfs_quota) {
int r;
r = check_btrfs();
@@ -31,8 +31,14 @@ int setup_machine_directory(sd_bus_error *error) {
if (r == 0)
return 0;
+ if (!use_btrfs_subvol)
+ return 0;
+
(void) btrfs_subvol_make_label("/var/lib/machines");
+ if (!use_btrfs_quota)
+ return 0;
+
r = btrfs_quota_enable("/var/lib/machines", true);
if (r < 0)
log_warning_errno(r, "Failed to enable quota for /var/lib/machines, ignoring: %m");
diff --git a/src/shared/machine-pool.h b/src/shared/machine-pool.h
index 3f528ab060..c57e47878f 100644
--- a/src/shared/machine-pool.h
+++ b/src/shared/machine-pool.h
@@ -5,4 +5,4 @@
#include "sd-bus.h"
-int setup_machine_directory(sd_bus_error *error);
+int setup_machine_directory(sd_bus_error *error, bool use_btrfs_subvol, bool use_btrfs_quota);