diff options
author | Pádraig Brady <P@draigBrady.com> | 2014-08-18 17:59:26 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2014-08-19 18:43:07 +0100 |
commit | ed1a495b3ccb2665a13229ca866f2115bd768d17 (patch) | |
tree | 2c6e3872a19c5ac9196f826990e84a75f8c83f5c | |
parent | 65d8e6906ae8752358b4f96153f7a1c5ccec3789 (diff) | |
download | coreutils-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.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -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; |