]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
import: wire up SYSTEMD_IMPORT_BTRFS_{SUBVOL,QUOTA} to importd 25559/head
authorIvan Shapovalov <intelfx@intelfx.name>
Tue, 29 Nov 2022 12:20:48 +0000 (16:20 +0400)
committerIvan Shapovalov <intelfx@intelfx.name>
Sat, 3 Dec 2022 16:31:48 +0000 (20:31 +0400)
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
src/import/importd.c
src/machine/machined-dbus.c
src/shared/machine-pool.c
src/shared/machine-pool.h

index 9a3ea131c122ad4cb65d6bc929cdd2bde925de91..4f6be5f20c914f143e8e79da193a36dab3470b7c 100644 (file)
@@ -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;
index e2d078485790770069d6124e039d15359ab5d483..56dd22d7573b031777d9807359d0e7d6a99963fe 100644 (file)
@@ -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;
 
index b495d4d79fdb9287e6358a07e95cea92f008a357..fb0b2f5adcc714c379b6e1c8d34eadfc6045716b 100644 (file)
@@ -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");
index 3f528ab060e2b29374bea3e3efbede103d140efb..c57e47878fbbdb1cbb422a3a26f2e5004c78b18e 100644 (file)
@@ -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);