[systemd-commits] 2 commits - src/mount.c src/mount.h src/service.c src/service.h src/systemctl.c src/unit-name.c src/unit-name.h TODO
Lennart Poettering
lennart at kemper.freedesktop.org
Tue Oct 12 19:00:54 PDT 2010
TODO | 2 -
src/mount.c | 52 +++++++++++++++++++++++++++++++++++++----------
src/mount.h | 1
src/service.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++------
src/service.h | 2 +
src/systemctl.c | 33 +++++++++++++++++++-----------
src/unit-name.c | 24 ++++++++++++++++++++++
src/unit-name.h | 1
8 files changed, 145 insertions(+), 31 deletions(-)
New commits:
commit 9fff8a1f165eb401f5411f96c755bb7704fdaa81
Author: Lennart Poettering <lennart at poettering.net>
Date: Wed Oct 13 03:57:04 2010 +0200
mount: hook in q fsck at .service instance for all mount points with passno > 0
diff --git a/src/mount.c b/src/mount.c
index 28ed8c3..9d79cd5 100644
--- a/src/mount.c
+++ b/src/mount.c
@@ -333,7 +333,7 @@ static bool mount_is_bind(MountParameters *p) {
static int mount_add_device_links(Mount *m) {
MountParameters *p;
- bool nofail, noauto;
+ int r;
assert(m);
@@ -344,18 +344,45 @@ static int mount_add_device_links(Mount *m) {
else
return 0;
- if (!p->what || path_equal(m->where, "/"))
+ if (!p->what)
return 0;
- if (mount_is_bind(p))
- return 0;
+ if (!mount_is_bind(p) && !path_equal(m->where, "/")) {
+ bool nofail, noauto;
- noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO);
- nofail = !!mount_test_option(p->options, "nofail");
+ noauto = !!mount_test_option(p->options, MNTOPT_NOAUTO);
+ nofail = !!mount_test_option(p->options, "nofail");
+
+ if ((r = unit_add_node_link(UNIT(m), p->what,
+ !noauto && nofail &&
+ UNIT(m)->meta.manager->running_as == MANAGER_SYSTEM)) < 0)
+ return r;
+ }
+
+ if (p->passno > 0 /* &&
+ UNIT(m)->meta.manager->running_as == MANAGER_SYSTEM */) {
+ char *name;
+ Unit *fsck;
+ /* Let's add in the fsck service */
- return unit_add_node_link(UNIT(m), p->what,
- !noauto && nofail &&
- UNIT(m)->meta.manager->running_as == MANAGER_SYSTEM);
+ if (!(name = unit_name_from_path_instance("fsck", p->what, ".service")))
+ return -ENOMEM;
+
+ if ((r = manager_load_unit_prepare(m->meta.manager, name, NULL, NULL, &fsck)) < 0) {
+ log_warning("Failed to prepare unit %s: %s", name, strerror(-r));
+ free(name);
+ return r;
+ }
+
+ free(name);
+
+ SERVICE(fsck)->fsck_passno = p->passno;
+
+ if ((r = unit_add_two_dependencies(UNIT(m), UNIT_AFTER, UNIT_WANTS, fsck, true)) < 0)
+ return r;
+ }
+
+ return 0;
}
static int mount_add_default_dependencies(Mount *m) {
@@ -1161,6 +1188,7 @@ static int mount_add_one(
const char *where,
const char *options,
const char *fstype,
+ int passno,
bool from_proc_self_mountinfo,
bool set_flags) {
int r;
@@ -1248,6 +1276,8 @@ static int mount_add_one(
free(p->fstype);
p->fstype = f;
+ p->passno = passno;
+
unit_add_to_dbus_queue(u);
return 0;
@@ -1381,7 +1411,7 @@ static int mount_load_etc_fstab(Manager *m) {
!!mount_test_option(me->mnt_opts, "comment=systemd.swapon"),
false);
} else
- k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, false, false);
+ k = mount_add_one(m, what, where, me->mnt_opts, me->mnt_type, me->mnt_passno, false, false);
free(what);
free(where);
@@ -1447,7 +1477,7 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
goto finish;
}
- if ((k = mount_add_one(m, d, p, o, fstype, true, set_flags)) < 0)
+ if ((k = mount_add_one(m, d, p, o, fstype, 0, true, set_flags)) < 0)
r = k;
clean_up:
diff --git a/src/mount.h b/src/mount.h
index 8d8c738..954058c 100644
--- a/src/mount.h
+++ b/src/mount.h
@@ -56,6 +56,7 @@ typedef struct MountParameters {
char *what;
char *options;
char *fstype;
+ int passno;
} MountParameters;
struct Mount {
diff --git a/src/service.c b/src/service.c
index d3852c7..310aa28 100644
--- a/src/service.c
+++ b/src/service.c
@@ -929,6 +929,47 @@ static int service_load_sysv(Service *s) {
}
#endif
+static int fsck_fix_order(Service *s) {
+ Meta *other;
+ int r;
+
+ assert(s);
+
+ if (s->fsck_passno <= 0)
+ return 0;
+
+ /* For each pair of services where both have an fsck priority
+ * we order things based on it. */
+
+ LIST_FOREACH(units_per_type, other, s->meta.manager->units_per_type[UNIT_SERVICE]) {
+ Service *t;
+ UnitDependency d;
+
+ t = (Service*) other;
+
+ if (s == t)
+ continue;
+
+ if (t->meta.load_state != UNIT_LOADED)
+ continue;
+
+ if (t->fsck_passno <= 0)
+ continue;
+
+ if (t->fsck_passno < s->fsck_passno)
+ d = UNIT_AFTER;
+ else if (t->fsck_passno > s->fsck_passno)
+ d = UNIT_BEFORE;
+ else
+ continue;
+
+ if (!(r = unit_add_dependency(UNIT(s), d, UNIT(t), true)) < 0)
+ return r;
+ }
+
+ return 0;
+}
+
static int service_verify(Service *s) {
assert(s);
@@ -1022,6 +1063,9 @@ static int service_load(Unit *u) {
return r;
#endif
+ if ((r = fsck_fix_order(s)) < 0)
+ return r;
+
if (s->bus_name)
if ((r = unit_watch_bus_name(u, s->bus_name)) < 0)
return r;
@@ -1108,22 +1152,27 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) {
if (s->sysv_path)
fprintf(f,
"%sSysV Init Script Path: %s\n"
- "%sSysV Init Script has LSB Header: %s\n",
+ "%sSysV Init Script has LSB Header: %s\n"
+ "%sSysVEnabled: %s\n",
prefix, s->sysv_path,
- prefix, yes_no(s->sysv_has_lsb));
+ prefix, yes_no(s->sysv_has_lsb),
+ prefix, yes_no(s->sysv_enabled));
if (s->sysv_start_priority >= 0)
fprintf(f,
- "%sSysVStartPriority: %i\n"
- "%sSysVEnabled: %s\n",
- prefix, s->sysv_start_priority,
- prefix, yes_no(s->sysv_enabled));
+ "%sSysVStartPriority: %i\n",
+ prefix, s->sysv_start_priority);
if (s->sysv_runlevels)
fprintf(f, "%sSysVRunLevels: %s\n",
prefix, s->sysv_runlevels);
#endif
+ if (s->fsck_passno > 0)
+ fprintf(f,
+ "%sFsckPassNo: %i\n",
+ prefix, s->fsck_passno);
+
if (s->status_text)
fprintf(f, "%sStatus Text: %s\n",
prefix, s->status_text);
diff --git a/src/service.h b/src/service.h
index eb44a43..500bebf 100644
--- a/src/service.h
+++ b/src/service.h
@@ -110,6 +110,8 @@ struct Service {
pid_t main_pid, control_pid;
int socket_fd;
+ int fsck_passno;
+
bool permissions_start_only;
bool root_directory_start_only;
bool remain_after_exit;
diff --git a/src/unit-name.c b/src/unit-name.c
index cd6e3ce..dbaa4a7 100644
--- a/src/unit-name.c
+++ b/src/unit-name.c
@@ -377,6 +377,30 @@ char *unit_name_from_path(const char *path, const char *suffix) {
return r;
}
+char *unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix) {
+ char *p, *r;
+
+ assert(path);
+ assert(suffix);
+
+ if (!(p = strdup(path)))
+ return NULL;
+
+ path_kill_slashes(p);
+
+ path = p[0] == '/' ? p + 1 : p;
+
+ if (path[0] == 0) {
+ free(p);
+ return unit_name_build_escape(prefix, "-", suffix);
+ }
+
+ r = unit_name_build_escape(prefix, path, suffix);
+ free(p);
+
+ return r;
+}
+
char *unit_name_to_path(const char *name) {
char *w, *e;
diff --git a/src/unit-name.h b/src/unit-name.h
index db1a79e..9842db3 100644
--- a/src/unit-name.h
+++ b/src/unit-name.h
@@ -49,6 +49,7 @@ char *unit_name_replace_instance(const char *f, const char *i);
char *unit_name_template(const char *f);
char *unit_name_from_path(const char *path, const char *suffix);
+char *unit_name_from_path_instance(const char *prefix, const char *path, const char *suffix);
char *unit_name_to_path(const char *name);
#endif
commit 560d8f23811162542c1748f711ea6dce269d2720
Author: Lennart Poettering <lennart at poettering.net>
Date: Wed Oct 13 03:13:23 2010 +0200
systemctl: warn if user enables unit with no installation instructions
diff --git a/TODO b/TODO
index e09d4d3..bda29da 100644
--- a/TODO
+++ b/TODO
@@ -36,8 +36,6 @@
* if a service fails too often, make the service enter failed mode, and the socket, too.
-* systemctl enable - warn about empty [Install] section
-
* bash completion a la gdbus
* systemctl list-jobs - show dependencies
diff --git a/src/systemctl.c b/src/systemctl.c
index a4a7655..671745b 100644
--- a/src/systemctl.c
+++ b/src/systemctl.c
@@ -3227,6 +3227,7 @@ typedef struct {
static Hashmap *will_install = NULL, *have_installed = NULL;
static Set *remove_symlinks_to = NULL;
+static unsigned n_symlinks = 0;
static void install_info_free(InstallInfo *i) {
assert(i);
@@ -3759,6 +3760,9 @@ static int install_info_apply(const char *verb, LookupPaths *paths, InstallInfo
return r;
}
+ n_symlinks += strv_length(i->aliases);
+ n_symlinks += strv_length(i->wanted_by);
+
fclose(f);
if ((r = install_info_symlink_alias(verb, i, config_path)) != 0)
@@ -3859,19 +3863,24 @@ static int enable_unit(DBusConnection *bus, char **args, unsigned n) {
if (streq(verb, "is-enabled"))
r = r > 0 ? 0 : -ENOENT;
- else if (bus &&
- /* Don't try to reload anything if the user asked us to not do this */
- !arg_no_reload &&
- /* Don't try to reload anything when updating a unit globally */
- !arg_global &&
- /* Don't try to reload anything if we are called for system changes but the system wasn't booted with systemd */
- (arg_session || sd_booted() > 0) &&
- /* Don't try to reload anything if we are running in a chroot environment */
- (arg_session || running_in_chroot() <= 0) ) {
- int q;
+ else {
+ if (n_symlinks <= 0)
+ log_warning("Unit files contain no applicable installation information. Ignoring.");
+
+ if (bus &&
+ /* Don't try to reload anything if the user asked us to not do this */
+ !arg_no_reload &&
+ /* Don't try to reload anything when updating a unit globally */
+ !arg_global &&
+ /* Don't try to reload anything if we are called for system changes but the system wasn't booted with systemd */
+ (arg_session || sd_booted() > 0) &&
+ /* Don't try to reload anything if we are running in a chroot environment */
+ (arg_session || running_in_chroot() <= 0) ) {
+ int q;
- if ((q = daemon_reload(bus, args, n)) < 0)
- r = q;
+ if ((q = daemon_reload(bus, args, n)) < 0)
+ r = q;
+ }
}
finish:
More information about the systemd-commits
mailing list