if (unit_has_name(u, "-.mount")) {
/* Don't allow start/stop for root directory */
- UNIT(m)->refuse_manual_start = true;
- UNIT(m)->refuse_manual_stop = true;
+ u->refuse_manual_start = true;
+ u->refuse_manual_stop = true;
} else {
/* The stdio/kmsg bridge socket is on /, in order to avoid a
* dep loop, don't use kmsg logging for -.mount */
m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
- UNIT(m)->ignore_on_isolate = true;
+ u->ignore_on_isolate = true;
}
static int mount_arm_timer(Mount *m) {
mount_parameters_done(&m->parameters_fragment);
cgroup_context_done(&m->cgroup_context);
- exec_context_done(&m->exec_context, manager_is_reloading_or_reexecuting(u->manager));
+ exec_context_done(&m->exec_context);
+ m->exec_runtime = exec_runtime_unref(m->exec_runtime);
exec_command_done_array(m->exec_command, _MOUNT_EXEC_COMMAND_MAX);
m->control_command = NULL;
else if (m->from_proc_self_mountinfo)
new_state = MOUNT_MOUNTED;
- if (new_state != m->state) {
-
- if (new_state == MOUNT_MOUNTING ||
- new_state == MOUNT_MOUNTING_DONE ||
- new_state == MOUNT_REMOUNTING ||
- new_state == MOUNT_UNMOUNTING ||
- new_state == MOUNT_MOUNTING_SIGTERM ||
- new_state == MOUNT_MOUNTING_SIGKILL ||
- new_state == MOUNT_UNMOUNTING_SIGTERM ||
- new_state == MOUNT_UNMOUNTING_SIGKILL ||
- new_state == MOUNT_REMOUNTING_SIGTERM ||
- new_state == MOUNT_REMOUNTING_SIGKILL) {
-
- if (m->control_pid <= 0)
- return -EBADMSG;
-
- r = unit_watch_pid(UNIT(m), m->control_pid);
- if (r < 0)
- return r;
+ if (new_state == m->state)
+ return 0;
- r = mount_arm_timer(m);
- if (r < 0)
- return r;
- }
+ if (new_state == MOUNT_MOUNTING ||
+ new_state == MOUNT_MOUNTING_DONE ||
+ new_state == MOUNT_REMOUNTING ||
+ new_state == MOUNT_UNMOUNTING ||
+ new_state == MOUNT_MOUNTING_SIGTERM ||
+ new_state == MOUNT_MOUNTING_SIGKILL ||
+ new_state == MOUNT_UNMOUNTING_SIGTERM ||
+ new_state == MOUNT_UNMOUNTING_SIGKILL ||
+ new_state == MOUNT_REMOUNTING_SIGTERM ||
+ new_state == MOUNT_REMOUNTING_SIGKILL) {
+
+ if (m->control_pid <= 0)
+ return -EBADMSG;
+
+ r = unit_watch_pid(UNIT(m), m->control_pid);
+ if (r < 0)
+ return r;
- mount_set_state(m, new_state);
+ r = mount_arm_timer(m);
+ if (r < 0)
+ return r;
}
+ mount_set_state(m, new_state);
return 0;
}
unit_realize_cgroup(UNIT(m));
+ r = unit_setup_exec_runtime(UNIT(m));
+ if (r < 0)
+ goto fail;
+
r = mount_arm_timer(m);
if (r < 0)
goto fail;
UNIT(m)->cgroup_path,
UNIT(m)->id,
NULL,
+ m->exec_runtime,
&pid);
if (r < 0)
goto fail;
if (f != MOUNT_SUCCESS)
m->result = f;
- exec_context_tmp_dirs_done(&m->exec_context);
+ exec_runtime_destroy(m->exec_runtime);
+ m->exec_runtime = exec_runtime_unref(m->exec_runtime);
+
mount_set_state(m, m->result != MOUNT_SUCCESS ? MOUNT_FAILED : MOUNT_DEAD);
}
mount_enter_dead(m, MOUNT_FAILURE_RESOURCES);
}
-static void mount_enter_mounting_done(Mount *m) {
- assert(m);
-
- mount_set_state(m, MOUNT_MOUNTING_DONE);
-}
-
static void mount_enter_remounting(Mount *m) {
int r;
if (m->control_command_id >= 0)
unit_serialize_item(u, f, "control-command", mount_exec_command_to_string(m->control_command_id));
- exec_context_serialize(&m->exec_context, UNIT(m), f);
-
return 0;
}
m->control_command_id = id;
m->control_command = m->exec_command + id;
}
- } else if (streq(key, "tmp-dir")) {
- char *t;
-
- t = strdup(value);
- if (!t)
- return log_oom();
-
- m->exec_context.tmp_dir = t;
- } else if (streq(key, "var-tmp-dir")) {
- char *t;
-
- t = strdup(value);
- if (!t)
- return log_oom();
-
- m->exec_context.var_tmp_dir = t;
} else
log_debug_unit(UNIT(m)->id,
"Unknown serialization key '%s'", key);
r = sd_event_add_io(m->event, fileno(m->proc_self_mountinfo), EPOLLPRI, mount_dispatch_io, m, &m->mount_event_source);
if (r < 0)
goto fail;
+
+ /* Dispatch this before we dispatch SIGCHLD, so that
+ * we always get the events from /proc/self/mountinfo
+ * before the SIGCHLD of /bin/mount. */
+ r = sd_event_source_set_priority(m->mount_event_source, -10);
+ if (r < 0)
+ goto fail;
}
r = mount_load_proc_self_mountinfo(m, false);
break;
case MOUNT_MOUNTING:
- mount_enter_mounting_done(mount);
+ mount_set_state(mount, MOUNT_MOUNTING_DONE);
break;
default:
.exec_context_offset = offsetof(Mount, exec_context),
.cgroup_context_offset = offsetof(Mount, cgroup_context),
.kill_context_offset = offsetof(Mount, kill_context),
+ .exec_runtime_offset = offsetof(Mount, exec_runtime),
.sections =
"Unit\0"