chiark / gitweb /
core: either ignore or handle mount failures
[elogind.git] / src / core / umount.c
index a30f6740fada15b5b00214ede9e2173b0517ffe4..ceee70fbea6ebe46b1442fc894125275737bf5ec 100644 (file)
@@ -24,7 +24,6 @@
 #include <string.h>
 #include <sys/mount.h>
 #include <sys/swap.h>
-#include <unistd.h>
 #include <linux/loop.h>
 #include <linux/dm-ioctl.h>
 
@@ -104,10 +103,16 @@ static int mount_points_list_get(MountPoint **head) {
 
                 /* Ignore mount points we can't unmount because they
                  * are API or because we are keeping them open (like
-                 * /dev/console) */
+                 * /dev/console). Also, ignore all mounts below API
+                 * file systems, since they are likely virtual too,
+                 * and hence not worth spending time on. Also, in
+                 * unprivileged containers we might lack the rights to
+                 * unmount these things, hence don't bother. */
                 if (mount_point_is_api(p) ||
                     mount_point_ignore(p) ||
-                    path_equal(p, "/dev/console")) {
+                    path_startswith(p, "/dev") ||
+                    path_startswith(p, "/sys") ||
+                    path_startswith(p, "/proc")) {
                         free(p);
                         continue;
                 }
@@ -126,9 +131,8 @@ static int mount_points_list_get(MountPoint **head) {
 }
 
 static int swap_list_get(MountPoint **head) {
-        FILE *proc_swaps;
+        _cleanup_fclose_ FILE *proc_swaps = NULL;
         unsigned int i;
-        int r;
 
         assert(head);
 
@@ -168,26 +172,19 @@ static int swap_list_get(MountPoint **head) {
                 free(dev);
 
                 if (!d) {
-                        r = -ENOMEM;
-                        goto finish;
+                        return -ENOMEM;
                 }
 
                 if (!(swap = new0(MountPoint, 1))) {
                         free(d);
-                        r = -ENOMEM;
-                        goto finish;
+                        return -ENOMEM;
                 }
 
                 swap->path = d;
                 LIST_PREPEND(mount_point, *head, swap);
         }
 
-        r = 0;
-
-finish:
-        fclose(proc_swaps);
-
-        return r;
+        return 0;
 }
 
 static int loopback_list_get(MountPoint **head) {
@@ -409,7 +406,7 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e
 
                         mount_point_free(head, m);
                 } else if (log_error) {
-                        log_warning("Could not unmount %s: %m", m->path);
+                        log_warning_errno(errno, "Could not unmount %s: %m", m->path);
                         n_failed++;
                 }
         }
@@ -431,7 +428,7 @@ static int swap_points_list_off(MountPoint **head, bool *changed) {
 
                         mount_point_free(head, m);
                 } else {
-                        log_warning("Could not deactivate swap %s: %m", m->path);
+                        log_warning_errno(errno, "Could not deactivate swap %s: %m", m->path);
                         n_failed++;
                 }
         }
@@ -468,7 +465,7 @@ static int loopback_points_list_detach(MountPoint **head, bool *changed) {
 
                         mount_point_free(head, m);
                 } else {
-                        log_warning("Could not detach loopback %s: %m", m->path);
+                        log_warning_errno(errno, "Could not detach loopback %s: %m", m->path);
                         n_failed++;
                 }
         }
@@ -503,7 +500,7 @@ static int dm_points_list_detach(MountPoint **head, bool *changed) {
 
                         mount_point_free(head, m);
                 } else {
-                        log_warning("Could not detach DM %s: %m", m->path);
+                        log_warning_errno(errno, "Could not detach DM %s: %m", m->path);
                         n_failed++;
                 }
         }