author | Rich Burridge <rich.burridge@oracle.com> |
Fri, 10 Apr 2015 11:53:57 -0700 | |
changeset 4097 | 36a08df8bc1c |
permissions | -rw-r--r-- |
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; |