m->directory_mode = 0755;
exec_context_init(&m->exec_context);
+ kill_context_init(&m->kill_context);
+ cgroup_context_init(&m->cgroup_context);
if (unit_has_name(u, "-.mount")) {
/* Don't allow start/stop for root directory */
m->exec_context.std_error = u->manager->default_std_error;
}
- kill_context_init(&m->kill_context);
- cgroup_context_init(&m->cgroup_context);
-
/* We need to make sure that /bin/mount is always called in
* the same process group as us, so that the autofs kernel
* side doesn't send us another mount request while we are
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;
b = unit_has_name(UNIT(m), e);
if (!b) {
- log_error_unit(UNIT(m)->id,
- "%s's Where setting doesn't match unit name. Refusing.",
- UNIT(m)->id);
+ log_error_unit(UNIT(m)->id, "%s's Where= setting doesn't match unit name. Refusing.", UNIT(m)->id);
return -EINVAL;
}
if (mount_point_is_api(m->where) || mount_point_ignore(m->where)) {
- log_error_unit(UNIT(m)->id,
- "Cannot create mount unit for API file system %s. Refusing.",
- m->where);
+ log_error_unit(UNIT(m)->id, "Cannot create mount unit for API file system %s. Refusing.", m->where);
return -EINVAL;
}
if (UNIT(m)->fragment_path && !m->parameters_fragment.what) {
- log_error_unit(UNIT(m)->id,
- "%s's What setting is missing. Refusing.", UNIT(m)->id);
+ log_error_unit(UNIT(m)->id, "%s's What setting is missing. Refusing.", UNIT(m)->id);
return -EBADMSG;
}
if (m->exec_context.pam_name && m->kill_context.kill_mode != KILL_CONTROL_GROUP) {
- log_error_unit(UNIT(m)->id,
- "%s has PAM enabled. Kill mode must be set to control-group'. Refusing.",
- UNIT(m)->id);
+ log_error_unit(UNIT(m)->id, "%s has PAM enabled. Kill mode must be set to control-group'. Refusing.",UNIT(m)->id);
return -EINVAL;
}
Unit *u = UNIT(m);
int r;
- if (UNIT(m)->fragment_path)
+ assert(m);
+
+ if (u->fragment_path)
m->from_fragment = true;
if (!m->where) {
if (r < 0)
return r;
- if (!UNIT(m)->description) {
+ if (!u->description) {
r = unit_set_description(u, m->where);
if (r < 0)
return r;
if (r < 0)
return r;
- if (UNIT(m)->default_dependencies) {
+ if (u->default_dependencies) {
r = mount_add_default_dependencies(m);
if (r < 0)
return r;
if (r < 0)
return r;
+ r = unit_exec_context_defaults(u, &m->exec_context);
+ if (r < 0)
+ return r;
+
return 0;
}
r = mount_add_extras(m);
if (r < 0)
return r;
-
- r = unit_exec_context_defaults(u, &m->exec_context);
- if (r < 0)
- return r;
}
return mount_verify(m);
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)->manager->cgroup_supported,
UNIT(m)->cgroup_path,
UNIT(m)->id,
+ 0,
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);
}
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);
.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"
.bus_interface = "org.freedesktop.systemd1.Mount",
.bus_vtable = bus_mount_vtable,
- .bus_changing_properties = bus_mount_changing_properties,
.bus_set_property = bus_mount_set_property,
.bus_commit_properties = bus_mount_commit_properties,