chiark / gitweb /
journal: implicitly add code location to all messages logged with the native interface
[elogind.git] / src / umount.c
index 20db612ace8d11e2eea2e6796ade9c4a29212b6f..0a63d23a01bb1b18ea2703237646c60a20792ce0 100644 (file)
@@ -403,14 +403,18 @@ static int delete_dm(dev_t devnum) {
         return r >= 0 ? 0 : -errno;
 }
 
-static int mount_points_list_umount(MountPoint **head, bool *changed) {
+static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_error) {
         MountPoint *m, *n;
         int n_failed = 0;
 
         assert(head);
 
         LIST_FOREACH_SAFE(mount_point, m, n, *head) {
-                if (streq(m->path, "/")) {
+                if (path_equal(m->path, "/")
+#ifndef HAVE_SPLIT_USR
+                    || path_equal(m->path, "/usr")
+#endif
+                ) {
                         n_failed++;
                         continue;
                 }
@@ -422,7 +426,7 @@ static int mount_points_list_umount(MountPoint **head, bool *changed) {
                                 *changed = true;
 
                         mount_point_free(head, m);
-                } else {
+                } else if (log_error) {
                         log_warning("Could not unmount %s: %m", m->path);
                         n_failed++;
                 }
@@ -565,10 +569,15 @@ int umount_all(bool *changed) {
         /* retry umount, until nothing can be umounted anymore */
         do {
                 umount_changed = false;
-                r = mount_points_list_umount(&mp_list_head, &umount_changed);
+
+                mount_points_list_umount(&mp_list_head, &umount_changed, false);
                 if (umount_changed)
                         *changed = true;
-        } while(umount_changed);
+
+        } while (umount_changed);
+
+        /* umount one more time with logging enabled */
+        r = mount_points_list_umount(&mp_list_head, &umount_changed, true);
         if (r <= 0)
                 goto end;