]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
df: handle bind mounts when processing device nodes
authorPádraig Brady <P@draigBrady.com>
Wed, 4 Dec 2013 00:50:10 +0000 (00:50 +0000)
committerPádraig Brady <P@draigBrady.com>
Wed, 4 Dec 2013 13:17:17 +0000 (13:17 +0000)
* src/df.c (get_disk): Use the same heuristic used in
get_point() to select the shortest file system mount point,
in an attempt to show the base mounted file system.
* NEWS: Mention the bug fix.

NEWS
src/df.c

diff --git a/NEWS b/NEWS
index 9274645a32c0ce30396cf898a459050ebdbd035f..520e94669e93be9ca891dec96ceab631a4f23899 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,10 @@ GNU coreutils NEWS                                    -*- outline -*-
   df displayed the symlink's device rather than that for the device node.
   [This bug was present in "the beginning".]
 
+  df now processes disk device nodes correctly in the presence of bind mounts.
+  Now df shows the base mounted file system rather than the last one mounted.
+  [This bug was present in "the beginning".]
+
   install now removes the target file if the strip program failed for any
   reason.  Before, that file was left behind, sometimes even with wrong
   permissions.
index 8eabcbbaade97f39f484f92a4498af76f075716d..969670e821760d09f74aaf22741f549a22f190b7 100644 (file)
--- a/src/df.c
+++ b/src/df.c
@@ -1062,10 +1062,21 @@ get_disk (char const *disk)
   if (resolved && resolved[0] == '/')
     disk = resolved;
 
+  size_t best_match_len = SIZE_MAX;
   for (me = mount_list; me; me = me->me_next)
     {
       if (STREQ (disk, me->me_devname))
-        best_match = me;
+        {
+          size_t len = strlen (me->me_mountdir);
+          if (len < best_match_len)
+            {
+              best_match = me;
+              if (len == 1) /* Traditional root.  */
+                break;
+              else
+                best_match_len = len;
+            }
+        }
     }
 
   free (resolved);