summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2014-08-18 17:59:26 +0100
committerPádraig Brady <P@draigBrady.com>2014-08-19 18:43:07 +0100
commited1a495b3ccb2665a13229ca866f2115bd768d17 (patch)
tree2c6e3872a19c5ac9196f826990e84a75f8c83f5c
parent65d8e6906ae8752358b4f96153f7a1c5ccec3789 (diff)
downloadcoreutils-ed1a495b3ccb2665a13229ca866f2115bd768d17.tar.xz
df: improve mount point selection with inaccurate mount list
v8.23 has a test failure on Fedora rawhide build servers in tests/df/skip-duplicate.sh. This was due to no '/' entry being output by df. That was due to an inaccurate /proc/mounts on the build environment as stat(/mnt/point) identified all these /proc/mounts entries as having the same device id: / rootfs / /dev/md1 /dev devtmpfs /run tmpfs /boot /dev/md0 /proc/filesystems /dev/md1 Since the device name on the right changes for a given id, that causes the entries to be continually replaced, thus resulting in no '/' entry. I'm guessing this is due to the mock environment bind mounting unneeded or sensitive items to a dummy file on the host / (/dev/md1) though have not looked into those details. So rather than relying on an accurate /proc/mounts, the attached patch takes a more conservative replacement approach and only swaps a new device entry when the mount point matches. That should handle all practical cases while also avoiding this situation. * src/df.c (filter_mount_list): Only replace entries with different device names when the mount point also matches.
-rw-r--r--src/df.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/df.c b/src/df.c
index 3ef5d33b0..e907b9409 100644
--- a/src/df.c
+++ b/src/df.c
@@ -640,13 +640,18 @@ filter_mount_list (bool devices_only)
if (devlist)
{
- /* ...let the shorter mountdir win. */
+ /* let "real" devices with '/' in the name win. */
if ((strchr (me->me_devname, '/')
&& ! strchr (devlist->me->me_devname, '/'))
+ /* let a shorter mountdir win. */
|| (strlen (devlist->me->me_mountdir)
> strlen (me->me_mountdir))
- /* or one overmounted on a different device. */
- || ! STREQ (devlist->me->me_devname, me->me_devname))
+ /* let an entry overmounted on a different device win... */
+ || (! STREQ (devlist->me->me_devname, me->me_devname)
+ /* ... but only when matching an exsiting mount point, to
+ avoid problematic replacement when given inaccurate mount
+ lists, seen with some chroot environments for example. */
+ && STREQ (me->me_mountdir, devlist->me->me_mountdir)))
{
/* Discard mount entry for existing device. */
discard_me = devlist->me;