Merge pull request #2471 from michaelolbrich/transient-mounts
allow transient mounts and automounts
This commit is contained in:
commit
eb18df724b
|
@ -1105,6 +1105,9 @@ const UnitVTable automount_vtable = {
|
|||
.reset_failed = automount_reset_failed,
|
||||
|
||||
.bus_vtable = bus_automount_vtable,
|
||||
.bus_set_property = bus_automount_set_property,
|
||||
|
||||
.can_transient = true,
|
||||
|
||||
.shutdown = automount_shutdown,
|
||||
.supported = automount_supported,
|
||||
|
|
|
@ -32,3 +32,57 @@ const sd_bus_vtable bus_automount_vtable[] = {
|
|||
SD_BUS_PROPERTY("TimeoutIdleUSec", "t", bus_property_get_usec, offsetof(Automount, timeout_idle_usec), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
static int bus_automount_set_transient_property(
|
||||
Automount *a,
|
||||
const char *name,
|
||||
sd_bus_message *message,
|
||||
UnitSetPropertiesMode mode,
|
||||
sd_bus_error *error) {
|
||||
|
||||
int r;
|
||||
|
||||
assert(a);
|
||||
assert(name);
|
||||
assert(message);
|
||||
|
||||
if (streq(name, "TimeoutIdleUSec")) {
|
||||
usec_t timeout_idle_usec;
|
||||
r = sd_bus_message_read(message, "t", &timeout_idle_usec);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (mode != UNIT_CHECK) {
|
||||
char time[FORMAT_TIMESPAN_MAX];
|
||||
|
||||
a->timeout_idle_usec = timeout_idle_usec;
|
||||
unit_write_drop_in_format(UNIT(a), mode, name, "[Automount]\nTimeoutIdleSec=%s\n",
|
||||
format_timespan(time, sizeof(time), timeout_idle_usec, USEC_PER_MSEC));
|
||||
}
|
||||
} else
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bus_automount_set_property(
|
||||
Unit *u,
|
||||
const char *name,
|
||||
sd_bus_message *message,
|
||||
UnitSetPropertiesMode mode,
|
||||
sd_bus_error *error) {
|
||||
|
||||
Automount *a = AUTOMOUNT(u);
|
||||
int r = 0;
|
||||
|
||||
assert(a);
|
||||
assert(name);
|
||||
assert(message);
|
||||
|
||||
if (u->transient && u->load_state == UNIT_STUB)
|
||||
/* This is a transient unit, let's load a little more */
|
||||
|
||||
r = bus_automount_set_transient_property(a, name, message, mode, error);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -21,3 +21,5 @@
|
|||
|
||||
|
||||
extern const sd_bus_vtable bus_automount_vtable[];
|
||||
|
||||
int bus_automount_set_property(Unit *u, const char *name, sd_bus_message *message, UnitSetPropertiesMode mode, sd_bus_error *error);
|
||||
|
|
|
@ -157,6 +157,9 @@ static int bus_mount_set_transient_property(
|
|||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
unit_write_drop_in_format(UNIT(m), mode, name, "[Mount]\n%s=%s\n",
|
||||
name, new_property);
|
||||
|
||||
free(*property);
|
||||
*property = p;
|
||||
}
|
||||
|
|
|
@ -484,6 +484,7 @@ static int mount_add_default_dependencies(Mount *m) {
|
|||
|
||||
static int mount_verify(Mount *m) {
|
||||
_cleanup_free_ char *e = NULL;
|
||||
MountParameters *p;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
|
@ -508,7 +509,8 @@ static int mount_verify(Mount *m) {
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
|
||||
p = get_mount_parameters_fragment(m);
|
||||
if (p && !p->what) {
|
||||
log_unit_error(UNIT(m), "What= setting is missing. Refusing.");
|
||||
return -EBADMSG;
|
||||
}
|
||||
|
@ -862,11 +864,6 @@ fail:
|
|||
mount_enter_mounted(m, MOUNT_FAILURE_RESOURCES);
|
||||
}
|
||||
|
||||
static int mount_get_opts(Mount *m, char **ret) {
|
||||
return fstab_filter_options(m->parameters_fragment.options,
|
||||
"nofail\0" "noauto\0" "auto\0", NULL, NULL, ret);
|
||||
}
|
||||
|
||||
static void mount_enter_mounting(Mount *m) {
|
||||
int r;
|
||||
MountParameters *p;
|
||||
|
@ -889,19 +886,18 @@ static void mount_enter_mounting(Mount *m) {
|
|||
if (p && mount_is_bind(p))
|
||||
(void) mkdir_p_label(p->what, m->directory_mode);
|
||||
|
||||
if (m->from_fragment) {
|
||||
if (p) {
|
||||
_cleanup_free_ char *opts = NULL;
|
||||
|
||||
r = mount_get_opts(m, &opts);
|
||||
r = fstab_filter_options(p->options, "nofail\0" "noauto\0" "auto\0", NULL, NULL, &opts);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
r = exec_command_set(m->control_command, MOUNT_PATH,
|
||||
m->parameters_fragment.what, m->where, NULL);
|
||||
r = exec_command_set(m->control_command, MOUNT_PATH, p->what, m->where, NULL);
|
||||
if (r >= 0 && m->sloppy_options)
|
||||
r = exec_command_append(m->control_command, "-s", NULL);
|
||||
if (r >= 0 && m->parameters_fragment.fstype)
|
||||
r = exec_command_append(m->control_command, "-t", m->parameters_fragment.fstype, NULL);
|
||||
if (r >= 0 && p->fstype)
|
||||
r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
|
||||
if (r >= 0 && !isempty(opts))
|
||||
r = exec_command_append(m->control_command, "-o", opts, NULL);
|
||||
} else
|
||||
|
@ -927,27 +923,29 @@ fail:
|
|||
|
||||
static void mount_enter_remounting(Mount *m) {
|
||||
int r;
|
||||
MountParameters *p;
|
||||
|
||||
assert(m);
|
||||
|
||||
m->control_command_id = MOUNT_EXEC_REMOUNT;
|
||||
m->control_command = m->exec_command + MOUNT_EXEC_REMOUNT;
|
||||
|
||||
if (m->from_fragment) {
|
||||
p = get_mount_parameters_fragment(m);
|
||||
if (p) {
|
||||
const char *o;
|
||||
|
||||
if (m->parameters_fragment.options)
|
||||
o = strjoina("remount,", m->parameters_fragment.options);
|
||||
if (p->options)
|
||||
o = strjoina("remount,", p->options);
|
||||
else
|
||||
o = "remount";
|
||||
|
||||
r = exec_command_set(m->control_command, MOUNT_PATH,
|
||||
m->parameters_fragment.what, m->where,
|
||||
p->what, m->where,
|
||||
"-o", o, NULL);
|
||||
if (r >= 0 && m->sloppy_options)
|
||||
r = exec_command_append(m->control_command, "-s", NULL);
|
||||
if (r >= 0 && m->parameters_fragment.fstype)
|
||||
r = exec_command_append(m->control_command, "-t", m->parameters_fragment.fstype, NULL);
|
||||
if (r >= 0 && p->fstype)
|
||||
r = exec_command_append(m->control_command, "-t", p->fstype, NULL);
|
||||
} else
|
||||
r = -ENOENT;
|
||||
|
||||
|
|
Loading…
Reference in New Issue