summaryrefslogtreecommitdiff
path: root/src/home/homed-manager-bus.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-11-04 16:32:05 +0100
committerLennart Poettering <lennart@poettering.net>2021-11-25 18:28:44 +0100
commit4950591627de2e859fb5fd1ae6d67e9c2e1b395e (patch)
tree94fd8b819585369d4ea9ec54834cf4177043782c /src/home/homed-manager-bus.c
parentd357b80d331ebed709b7a9d71e014c319ba5bd79 (diff)
downloadsystemd-4950591627de2e859fb5fd1ae6d67e9c2e1b395e.tar.gz
homed: add explicit API for requesting rebalancing too
Diffstat (limited to 'src/home/homed-manager-bus.c')
-rw-r--r--src/home/homed-manager-bus.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/home/homed-manager-bus.c b/src/home/homed-manager-bus.c
index 7ac5b8d0fc..31f82dc1dc 100644
--- a/src/home/homed-manager-bus.c
+++ b/src/home/homed-manager-bus.c
@@ -635,6 +635,27 @@ static int method_deactivate_all_homes(sd_bus_message *message, void *userdata,
return sd_bus_reply_method_return(message, NULL);
}
+static int method_rebalance(sd_bus_message *message, void *userdata, sd_bus_error *error) {
+ Manager *m = userdata;
+ int r;
+
+ assert(m);
+
+ r = manager_schedule_rebalance(m, /* immediately= */ true);
+ if (r == 0)
+ return sd_bus_reply_method_errorf(message, BUS_ERROR_REBALANCE_NOT_NEEDED, "No home directories need rebalancing.");
+ if (r < 0)
+ return r;
+
+ /* Keep a reference to this message, so that we can reply to it once we are done */
+ r = set_ensure_put(&m->rebalance_queued_method_calls, &bus_message_hash_ops, message);
+ if (r < 0)
+ return log_error_errno(r, "Failed to track rebalance bus message: %m");
+
+ sd_bus_message_ref(message);
+ return 1;
+}
+
static const sd_bus_vtable manager_vtable[] = {
SD_BUS_VTABLE_START(0),
@@ -843,6 +864,7 @@ static const sd_bus_vtable manager_vtable[] = {
/* An operation that acts on all homes that allow it */
SD_BUS_METHOD("LockAllHomes", NULL, NULL, method_lock_all_homes, 0),
SD_BUS_METHOD("DeactivateAllHomes", NULL, NULL, method_deactivate_all_homes, 0),
+ SD_BUS_METHOD("Rebalance", NULL, NULL, method_rebalance, 0),
SD_BUS_VTABLE_END
};