nixos/stc: Improve mount unit handling

We should sometimes restart the units rather than reloading them so the
changes are actually applied. / and /nix are explicitly excluded because
there was some very old issue where these were unmounted. I don't think
this will affect many people since most people use fstab mounts instead
but I plan to adapt this behavior for fstab mounts as well in the future
(once I wrote a test for the fstab thingies).
This commit is contained in:
Janne Heß 2023-08-20 11:05:46 +02:00
parent 37b8244412
commit eb831f759b
No known key found for this signature in database
3 changed files with 51 additions and 9 deletions

View file

@ -313,7 +313,8 @@ sub unrecord_unit {
# needs to be restarted or reloaded. If the units differ, the service
# is restarted unless the only difference is `X-Reload-Triggers` in the
# `Unit` section. If this is the only modification, the unit is reloaded
# instead of restarted.
# instead of restarted. If the only difference is `Options` in the
# `[Mount]` section, the unit is reloaded rather than restarted.
# Returns:
# - 0 if the units are equal
# - 1 if the units are different and a restart action is required
@ -390,6 +391,11 @@ sub compare_units { ## no critic(Subroutines::ProhibitExcessComplexity)
next;
}
}
# If this is a mount unit, check if it was only `Options`
if ($section_name eq "Mount" and $ini_key eq "Options") {
$ret = 2;
next;
}
return 1;
}
}
@ -440,10 +446,18 @@ sub handle_modified_unit { ## no critic(Subroutines::ProhibitManyArgs, Subroutin
# properties (resource limits and inotify watches)
# seem to get applied on daemon-reload.
} elsif ($unit =~ /\.mount$/msx) {
# Reload the changed mount unit to force a remount.
# FIXME: only reload when Options= changed, restart otherwise
$units_to_reload->{$unit} = 1;
record_unit($reload_list_file, $unit);
# Just restart the unit. We wouldn't have gotten into this subroutine
# if only `Options` was changed, in which case the unit would be reloaded.
# The only exception is / and /nix because it's very unlikely we can safely
# unmount them so we reload them instead. This means that we may not get
# all changes into the running system but it's better than crashing it.
if ($unit eq "-.mount" or $unit eq "nix.mount") {
$units_to_reload->{$unit} = 1;
record_unit($reload_list_file, $unit);
} else {
$units_to_restart->{$unit} = 1;
record_unit($restart_list_file, $unit);
}
} elsif ($unit =~ /\.socket$/msx) {
# FIXME: do something?
# Attempt to fix this: https://github.com/NixOS/nixpkgs/pull/141192