components/coreutils/patches/df.c.patch
author Rich Burridge <rich.burridge@oracle.com>
Fri, 10 Apr 2015 11:53:57 -0700
changeset 4097 36a08df8bc1c
permissions -rw-r--r--
20807778 gdf doesn't list /
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4097
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     1
From: Pádraig Brady <[email protected]>
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     2
Date: Mon, 18 Aug 2014 16:59:26 +0000 (+0100)
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     3
Subject: df: improve mount point selection with inaccurate mount list
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     4
X-Git-Url: http://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=commitdiff_plain;h=ed1a495b
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     5
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     6
df: improve mount point selection with inaccurate mount list
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     7
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     8
v8.23 has a test failure on Fedora rawhide build servers
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
     9
in tests/df/skip-duplicate.sh.  This was due to no '/'
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    10
entry being output by df.  That was due to an inaccurate
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    11
/proc/mounts on the build environment as stat(/mnt/point)
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    12
identified all these /proc/mounts entries as having the
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    13
same device id:
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    14
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    15
  /                    rootfs
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    16
  /                    /dev/md1
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    17
  /dev                 devtmpfs
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    18
  /run                 tmpfs
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    19
  /boot                /dev/md0
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    20
  /proc/filesystems    /dev/md1
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    21
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    22
Since the device name on the right changes for a given id,
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    23
that causes the entries to be continually replaced, thus
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    24
resulting in no '/' entry.  I'm guessing this is due to
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    25
the mock environment bind mounting unneeded or sensitive
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    26
items to a dummy file on the host / (/dev/md1) though
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    27
have not looked into those details.
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    28
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    29
So rather than relying on an accurate /proc/mounts,
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    30
the attached patch takes a more conservative replacement
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    31
approach and only swaps a new device entry when the
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    32
mount point matches.  That should handle all practical
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    33
cases while also avoiding this situation.
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    34
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    35
* src/df.c (filter_mount_list): Only replace entries with
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    36
different device names when the mount point also matches.
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    37
---
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    38
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    39
diff --git a/src/df.c b/src/df.c
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    40
index 3ef5d33..e907b94 100644
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    41
--- src/df.c
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    42
+++ src/df.c
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    43
@@ -640,13 +640,18 @@ filter_mount_list (bool devices_only)
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    44
 
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    45
           if (devlist)
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    46
             {
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    47
-              /* ...let the shorter mountdir win.  */
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    48
+                  /* let "real" devices with '/' in the name win.  */
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    49
               if ((strchr (me->me_devname, '/')
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    50
                    && ! strchr (devlist->me->me_devname, '/'))
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    51
+                  /* let a shorter mountdir win.  */
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    52
                   || (strlen (devlist->me->me_mountdir)
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    53
                       > strlen (me->me_mountdir))
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    54
-                  /* or one overmounted on a different device.  */
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    55
-                  || ! STREQ (devlist->me->me_devname, me->me_devname))
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    56
+                  /* let an entry overmounted on a different device win...  */
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    57
+                  || (! STREQ (devlist->me->me_devname, me->me_devname)
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    58
+                      /* ... but only when matching an exsiting mount point, to
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    59
+                      avoid problematic replacement when given inaccurate mount
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    60
+                      lists, seen with some chroot environments for example.  */
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    61
+                      && STREQ (me->me_mountdir, devlist->me->me_mountdir)))
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    62
                 {
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    63
                   /* Discard mount entry for existing device.  */
36a08df8bc1c 20807778 gdf doesn't list /
Rich Burridge <rich.burridge@oracle.com>
parents:
diff changeset
    64
                   discard_me = devlist->me;