chiark / gitweb /
drop unnecessary suffix NULs as gcc adds them anyway
[elogind.git] / src / umount.c
index 2ae8f86ecd103cc98ff01dee344343a2f7a5c1f7..4fd6b22ad78620e3585985b0a3f9a19989a827b3 100644 (file)
@@ -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)