On 10/27/2014 05:21 PM, Michael Stone wrote:
> On Mon, Oct 27, 2014 at 11:54:57AM +0000, Pádraig Brady wrote:
>> On 10/27/2014 08:36 AM, Harald Dunkel wrote:
>>> On 10/24/14 18:24, Pádraig Brady wrote:
>>>>
>>>> Note /home doesn't seem to be accessible above
>>>> which is another reason to prefer /data here.
>>>>
>>>
>>> What do you mean by "not accessible"? Both /home and
>>> /data work fine.
>>
>> I was referring to the fact that "-" was shown for the /home entry:
>>
>>  nfs-home:/space/home              -           -          -    - /home
>>  nfs-home:/space/data    13390666752 10768854016 1941581824  85% /data
> 
> That's df's doing. Potentially something like this would get the suggested 
> behavior:
> 
> --- src/df.c.orig       2014-10-27 12:14:39.633167418 -0400
> +++ src/df.c    2014-10-27 13:16:54.524752800 -0400
> @@ -631,6 +631,10 @@
>            /* Stat failed - add ME to be able to complain about it later.  */
>            buf.st_dev = me->me_dev;
>          }
> +      else if (me->me_remote)
> +        {
> +          /* ignore duplicate network mounts */
> +        }
>        else
>          {
>            /* If we've already seen this device...  */

Still not convinced about that hunk.

> @@ -928,7 +932,7 @@
>        if (stat (stat_file, &sb) == 0)
>          {
>            char const * devname = devname_for_dev (sb.st_dev);
> -          if (devname && ! STREQ (devname, disk))
> +          if (devname && ! STREQ (devname, disk) && !me_remote)
>              {
>                fstype = "-";
>                fsu.fsu_blocksize = fsu.fsu_blocks = fsu.fsu_bfree =
> 
> 
> The question then being whether making this case work breaks other cases, and 
> whether making it that much harder to explain the logic of what df displays 
> is worth it to avoid explaining why a particular set of mounts is captured by 
> the current logic. :)

I agree that the "-" placeholders above should not have been output.
The attached patch is just a more general version of the hunk above.

thanks!
Pádraig.

>From 19c3646e1fd2964539fbb4240710e2262582c8d1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <p...@draigbrady.com>
Date: Mon, 27 Oct 2014 23:37:08 +0000
Subject: [PATCH] df: ensure -a shows all remote file system entries

commit v8.22-125-g9d736f8 printed placeholder "-" values
for device names that didn't match the preferred device name
for a particular mount point.  However that was seen to erroneously
suppress values for aliased host names or exports, common with
remote file systems.

* src/df.c (me_for_dev): Rename from devname_for_dev() so that
we can determine the remoteness as well as the name for the
preferred mount entry.
(get_dev): Don't output place holder values when both
current and preferred mount entries are remote.

Reported in http://bugs.debian.org/737399
---
 src/df.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/df.c b/src/df.c
index 5231676..a52afc4 100644
--- a/src/df.c
+++ b/src/df.c
@@ -703,17 +703,17 @@ filter_mount_list (bool devices_only)
 }
 
 /* Search a mount entry list for device id DEV.
-   Return the corresponding device name if found or NULL if not.  */
+   Return the corresponding mount entry if found or NULL if not.  */
 
-static char const * _GL_ATTRIBUTE_PURE
-devname_for_dev (dev_t dev)
+static struct mount_entry const * _GL_ATTRIBUTE_PURE
+me_for_dev (dev_t dev)
 {
   struct devlist *dl = device_list;
 
   while (dl)
     {
       if (dl->dev_num == dev)
-        return dl->me->me_devname;
+        return dl->me;
       dl = dl->next;
     }
 
@@ -928,12 +928,15 @@ get_dev (char const *disk, char const *mount_point, char const* file,
   else if (process_all && show_all_fs)
     {
       /* Ensure we don't output incorrect stats for over-mounted directories.
-         Discard stats when the device name doesn't match.  */
+         Discard stats when the device name doesn't match.  Though don't
+         discard when used and current mount entries are both remote due
+         to the possibility of aliased host names or exports.  */
       struct stat sb;
       if (stat (stat_file, &sb) == 0)
         {
-          char const * devname = devname_for_dev (sb.st_dev);
-          if (devname && ! STREQ (devname, disk))
+          struct mount_entry const * dev_me = me_for_dev (sb.st_dev);
+          if (dev_me && ! STREQ (dev_me->me_devname, disk)
+              && (! dev_me->me_remote || ! me_remote))
             {
               fstype = "-";
               fsu.fsu_blocksize = fsu.fsu_blocks = fsu.fsu_bfree =
-- 
1.7.7.6

Reply via email to