chiark / gitweb /
manager: don't show kernel boot-up time for containers
[elogind.git] / src / umount.c
index 2ae8f86ecd103cc98ff01dee344343a2f7a5c1f7..6fe0a26dd413278ae704e1037b0466abcdc04429 100644 (file)
@@ -355,7 +355,7 @@ static int delete_loopback(const char *device) {
         int fd, r;
 
         if ((fd = open(device, O_RDONLY|O_CLOEXEC)) < 0)
-                return -errno;
+                return errno == ENOENT ? 0 : -errno;
 
         r = ioctl(fd, LOOP_CLR_FD, 0);
         close_nointr_nofail(fd);
@@ -466,12 +466,24 @@ static int swap_points_list_off(MountPoint **head, bool *changed) {
 
 static int loopback_points_list_detach(MountPoint **head, bool *changed) {
         MountPoint *m, *n;
-        int n_failed = 0;
+        int n_failed = 0, k;
+        struct stat root_st;
 
         assert(head);
 
+        k = lstat("/", &root_st);
+
         LIST_FOREACH_SAFE(mount_point, m, n, *head) {
                 int r;
+                struct stat loopback_st;
+
+                if (k >= 0 &&
+                    major(root_st.st_dev) != 0 &&
+                    lstat(m->path, &loopback_st) >= 0 &&
+                    root_st.st_dev == loopback_st.st_rdev) {
+                        n_failed ++;
+                        continue;
+                }
 
                 if ((r = delete_loopback(m->path)) >= 0) {
 
@@ -490,13 +502,23 @@ static int loopback_points_list_detach(MountPoint **head, bool *changed) {
 
 static int dm_points_list_detach(MountPoint **head, bool *changed) {
         MountPoint *m, *n;
-        int n_failed = 0;
+        int n_failed = 0, k;
+        struct stat root_st;
 
         assert(head);
 
+        k = lstat("/", &root_st);
+
         LIST_FOREACH_SAFE(mount_point, m, n, *head) {
                 int r;
 
+                if (k >= 0 &&
+                    major(root_st.st_dev) != 0 &&
+                    root_st.st_dev == m->devnum) {
+                        n_failed ++;
+                        continue;
+                }
+
                 if ((r = delete_dm(m->devnum)) >= 0) {
 
                         if (r > 0 && changed)