forked from pool/coreutils
68 lines
2.9 KiB
Diff
68 lines
2.9 KiB
Diff
|
Upstream patch for df(1) on top of v8.23, to be removed with v8.24.
|
||
|
http://git.sv.gnu.org/cgit/coreutils.git/commit/?id=ed1a495b3ccb
|
||
|
|
||
|
From ed1a495b3ccb2665a13229ca866f2115bd768d17 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||
|
Date: Mon, 18 Aug 2014 17:59:26 +0100
|
||
|
Subject: [PATCH] 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.
|
||
|
---
|
||
|
src/df.c | 11 ++++++++---
|
||
|
1 file changed, 8 insertions(+), 3 deletions(-)
|
||
|
|
||
|
Index: src/df.c
|
||
|
===================================================================
|
||
|
--- src/df.c.orig
|
||
|
+++ 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;
|