chiark / gitweb /
umount: umount, until all umounts failed
[elogind.git] / src / umount.c
index 95efa8204b2e9e9cb11e2cf07666d1556251354d..20db612ace8d11e2eea2e6796ade9c4a29212b6f 100644 (file)
@@ -417,6 +417,7 @@ static int mount_points_list_umount(MountPoint **head, bool *changed) {
 
                 /* Trying to umount. Forcing to umount if busy (only for NFS mounts) */
                 if (umount2(m->path, MNT_FORCE) == 0) {
+                        log_info("Unmounted %s.", m->path);
                         if (changed)
                                 *changed = true;
 
@@ -551,6 +552,8 @@ static int dm_points_list_detach(MountPoint **head, bool *changed) {
 
 int umount_all(bool *changed) {
         int r;
+        bool umount_changed;
+
         LIST_HEAD(MountPoint, mp_list_head);
 
         LIST_HEAD_INIT(MountPoint, mp_list_head);
@@ -559,7 +562,13 @@ int umount_all(bool *changed) {
         if (r < 0)
                 goto end;
 
-        r = mount_points_list_umount(&mp_list_head, changed);
+        /* retry umount, until nothing can be umounted anymore */
+        do {
+                umount_changed = false;
+                r = mount_points_list_umount(&mp_list_head, &umount_changed);
+                if (umount_changed)
+                        *changed = true;
+        } while(umount_changed);
         if (r <= 0)
                 goto end;