chiark / gitweb /
readahead: remove misleading error messages
[elogind.git] / src / mount.c
index 5b433c970a85466f24a290b032896ff9f9446ee3..102d88b6e068846577f8b628613606fd837967a2 100644 (file)
@@ -36,6 +36,7 @@
 #include "dbus-mount.h"
 #include "special.h"
 #include "bus-errors.h"
+#include "exit-status.h"
 
 static const UnitActiveState state_translation_table[_MOUNT_STATE_MAX] = {
         [MOUNT_DEAD] = UNIT_INACTIVE,
@@ -63,6 +64,7 @@ static void mount_init(Unit *u) {
         m->directory_mode = 0755;
 
         exec_context_init(&m->exec_context);
+        m->exec_context.std_output = EXEC_OUTPUT_KMSG;
 
         /* We need to make sure that /bin/mount is always called in
          * the same process group as us, so that the autofs kernel
@@ -97,12 +99,21 @@ static void mount_parameters_done(MountParameters *p) {
 
 static void mount_done(Unit *u) {
         Mount *m = MOUNT(u);
+        Meta *other;
 
         assert(m);
 
         free(m->where);
         m->where = NULL;
 
+        /* Try to detach us from the automount unit if there is any */
+        LIST_FOREACH(units_per_type, other, m->meta.manager->units_per_type[UNIT_AUTOMOUNT]) {
+                Automount *a = (Automount*) other;
+
+                if (a->mount == m)
+                        a->mount = NULL;
+        }
+
         mount_parameters_done(&m->parameters_etc_fstab);
         mount_parameters_done(&m->parameters_proc_self_mountinfo);
         mount_parameters_done(&m->parameters_fragment);
@@ -362,6 +373,7 @@ static int mount_add_device_links(Mount *m) {
         }
 
         if (p->passno > 0 &&
+            !mount_is_bind(p) &&
             UNIT(m)->meta.manager->running_as == MANAGER_SYSTEM &&
             !path_equal(m->where, "/")) {
                 char *name;
@@ -454,6 +466,9 @@ static int mount_load(Unit *u) {
 
         /* This is a new unit? Then let's add in some extras */
         if (u->meta.load_state == UNIT_LOADED) {
+                if ((r = unit_add_exec_dependencies(u, &m->exec_context)) < 0)
+                        return r;
+
                 if (m->meta.fragment_path)
                         m->from_fragment = true;
 
@@ -554,7 +569,8 @@ static void mount_set_state(Mount *m, MountState state) {
                           mount_state_to_string(old_state),
                           mount_state_to_string(state));
 
-        unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state]);
+        unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], !m->reload_failure);
+        m->reload_failure = false;
 }
 
 static int mount_coldplug(Unit *u) {
@@ -910,7 +926,8 @@ static void mount_enter_remounting(Mount *m, bool success) {
 
 fail:
         log_warning("%s failed to run 'remount' task: %s", m->meta.id, strerror(-r));
-        mount_enter_mounted(m, false);
+        m->reload_failure = true;
+        mount_enter_mounted(m, true);
 }
 
 static int mount_start(Unit *u) {
@@ -1098,9 +1115,6 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         case MOUNT_MOUNTING_DONE:
         case MOUNT_MOUNTING_SIGKILL:
         case MOUNT_MOUNTING_SIGTERM:
-        case MOUNT_REMOUNTING:
-        case MOUNT_REMOUNTING_SIGKILL:
-        case MOUNT_REMOUNTING_SIGTERM:
 
                 if (success)
                         mount_enter_mounted(m, true);
@@ -1110,6 +1124,18 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                         mount_enter_dead(m, false);
                 break;
 
+        case MOUNT_REMOUNTING:
+        case MOUNT_REMOUNTING_SIGKILL:
+        case MOUNT_REMOUNTING_SIGTERM:
+
+                m->reload_failure = !success;
+                if (m->from_proc_self_mountinfo)
+                        mount_enter_mounted(m, true);
+                else
+                        mount_enter_dead(m, true);
+
+                break;
+
         case MOUNT_UNMOUNTING:
         case MOUNT_UNMOUNTING_SIGKILL:
         case MOUNT_UNMOUNTING_SIGTERM:
@@ -1147,7 +1173,8 @@ static void mount_timer_event(Unit *u, uint64_t elapsed, Watch *w) {
 
         case MOUNT_REMOUNTING:
                 log_warning("%s remounting timed out. Stopping.", u->meta.id);
-                mount_enter_signal(m, MOUNT_REMOUNTING_SIGTERM, false);
+                m->reload_failure = true;
+                mount_enter_mounted(m, true);
                 break;
 
         case MOUNT_UNMOUNTING: