[systemd-commits] 2 commits - TODO src/core

Lennart Poettering lennart at kemper.freedesktop.org
Fri Dec 12 11:24:40 PST 2014


 TODO             |    4 ----
 src/core/mount.c |   46 +++++++++++++++++++++++++++++++++++++++-------
 src/core/mount.h |    2 ++
 3 files changed, 41 insertions(+), 11 deletions(-)

New commits:
commit 308b57107606818431d3bff83e346eeab2f21e6a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Dec 12 20:24:35 2014 +0100

    update TODO

diff --git a/TODO b/TODO
index 19459b3..7852495 100644
--- a/TODO
+++ b/TODO
@@ -6,8 +6,6 @@ Bugfixes:
   automount points even when the original .automount file did not exist
   anymore. Only the .mount unit was still around.
 
-* properly handle .mount unit state tracking when two mount points are stacked one on top of another on the exact same mount point.
-
 * ExecStart with unicode characters fails in strv_split_quoted:
 
           [Service]
@@ -22,8 +20,6 @@ External:
 
 * Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros.
 
-* Fedora: post FPC ticket to move add %tmpfiles_create to the packaging guidelines
-
 * Fedora: move kernel image to /usr/lib/modules/, kernel-install will take care of populating /boot
 
 * Fedora: remove /etc/resolv.conf tmpfiles hack

commit 7d54a03a877e9c3f3f3087401ac4ccc1e12c78ea
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Dec 12 20:12:35 2014 +0100

    core: retry unmounting until we are done, in case of stacked mounts

diff --git a/src/core/mount.c b/src/core/mount.c
index e271d43..3029cfd 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -45,6 +45,8 @@
 #include "exit-status.h"
 #include "def.h"
 
+#define RETRY_UMOUNT_MAX 32
+
 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_table*, mnt_free_table);
 DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_iter*, mnt_free_iter);
 
@@ -867,20 +869,28 @@ static void mount_enter_unmounting(Mount *m) {
 
         assert(m);
 
+        /* Start counting our attempts */
+        if (!IN_SET(m->state,
+                    MOUNT_UNMOUNTING,
+                    MOUNT_UNMOUNTING_SIGTERM,
+                    MOUNT_UNMOUNTING_SIGKILL))
+                m->n_retry_umount = 0;
+
         m->control_command_id = MOUNT_EXEC_UNMOUNT;
         m->control_command = m->exec_command + MOUNT_EXEC_UNMOUNT;
 
-        if ((r = exec_command_set(
-                             m->control_command,
+        r = exec_command_set(m->control_command,
                              "/bin/umount",
                              "-n",
                              m->where,
-                             NULL)) < 0)
+                             NULL);
+        if (r < 0)
                 goto fail;
 
         mount_unwatch_control_pid(m);
 
-        if ((r = mount_spawn(m, m->control_command, &m->control_pid)) < 0)
+        r = mount_spawn(m, m->control_command, &m->control_pid);
+        if (r < 0)
                 goto fail;
 
         mount_set_state(m, MOUNT_UNMOUNTING);
@@ -1239,9 +1249,31 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         case MOUNT_UNMOUNTING_SIGKILL:
         case MOUNT_UNMOUNTING_SIGTERM:
 
-                if (f == MOUNT_SUCCESS)
-                        mount_enter_dead(m, f);
-                else if (m->from_proc_self_mountinfo)
+                if (f == MOUNT_SUCCESS) {
+
+                        if (m->from_proc_self_mountinfo) {
+
+                                /* Still a mount point? If so, let's
+                                 * try again. Most likely there were
+                                 * multiple mount points stacked on
+                                 * top of each other. Note that due to
+                                 * the io event priority logic we can
+                                 * be sure the new mountinfo is loaded
+                                 * before we process the SIGCHLD for
+                                 * the mount command. */
+
+                                if (m->n_retry_umount < RETRY_UMOUNT_MAX) {
+                                        log_unit_debug(u->id, "%s: mount still present, trying again.", u->id);
+                                        m->n_retry_umount++;
+                                        mount_enter_unmounting(m);
+                                } else {
+                                        log_unit_debug(u->id, "%s: mount still present after %u attempts to unmount, giving up.", u->id, m->n_retry_umount);
+                                        mount_enter_mounted(m, f);
+                                }
+                        } else
+                                mount_enter_dead(m, f);
+
+                } else if (m->from_proc_self_mountinfo)
                         mount_enter_mounted(m, f);
                 else
                         mount_enter_dead(m, f);
diff --git a/src/core/mount.h b/src/core/mount.h
index 2dcb663..d6987e6 100644
--- a/src/core/mount.h
+++ b/src/core/mount.h
@@ -112,6 +112,8 @@ struct Mount {
         pid_t control_pid;
 
         sd_event_source *timer_event_source;
+
+        unsigned n_retry_umount;
 };
 
 extern const UnitVTable mount_vtable;



More information about the systemd-commits mailing list