Subject: bug#12730: bug #12730: patch attached

From: Jim Meyering <[email-masked]>
Date: Mon, 05 Nov 2012 02:01:53 +0100

Andrew Warshall wrote:
>> If we went that route, we'd change how me_dummy is set so that it
>> takes account of your case.  For example, we might add a boolean
>> "is_bind_mount" parameter to ME_DUMMY macro, so that when me_type is
>> "none" and is_bind_mount is true, ME_DUMMY would evaluate to false,
>> rather than to true.  The only tricky part would be robustly
>> determining whether "bind" is in mnt->mnt_opts.
>>
>> Care to write the patch?
>
> I've attached (an attempt at) the suggested patch. It should work on
> Linux/glibc, but should be tested on other platforms.

Thanks for the patch.
However, I'd rather not duplicate all of that logic solely
to change the part that deals with type-"none" entries.
Instead, I'll leave the other 5 types in a separate, new macro,
and use that from the new ME_DUMMY macro.

I've also removed the outer "#ifndef ME_DUMMY" and added
a comment and a ChangeLog entry for you.  But now,
you have to proofread that and ACK before I push it.

I've tested only on a system with MOUNTED_GETMNTENT1.

Finally, it's small enough that you don't have to fill
out copyright paperwork (hence the "tiny change"
and Copyright-paperwork-exempt notes), but if you think
you may contribute something else, please start the process now,
so the lack of an assignment does not delay things.
Let me know off-list and I'll send you the forms.

>From 613bcb6205cf2b64d835c19074c5a7e7c6cb99eb Mon Sep 17 00:00:00 2001
From: Andrew Warshall <[email-masked]>
Date: Sun, 4 Nov 2012 16:41:15 -0800
Subject: [PATCH] mountlist: do not classify a bind-mounted dir entry as
 "dummy"

* lib/mountlist.c (ME_DUMMY_0): Rename from ME_DUMMY, but omit
the "none"-testing clause.
(ME_DUMMY) [MOUNTED_GETMNTENT1]: New macro to encapsulate the
exception for bind-mounted directories.
Copyright-paperwork-exempt: Yes
---
 ChangeLog       |  8 ++++++++
 lib/mountlist.c | 31 +++++++++++++++++++++----------
 2 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 720b7a2..2173fb2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-11-04  Andrew Warshall  <[email-masked]>  (tiny change)
+
+	mountlist: do not classify a bind-mounted dir entry as "dummy"
+	* lib/mountlist.c (ME_DUMMY_0): Rename from ME_DUMMY, but omit
+	the "none"-testing clause.
+	(ME_DUMMY) [MOUNTED_GETMNTENT1]: New macro to encapsulate the
+	exception for bind-mounted directories.
+
 2012-11-01  Akim Demaille  <[email-masked]>

 	quote: provide a means to escape strings with nul characters
diff --git a/lib/mountlist.c b/lib/mountlist.c
index 67154b8..a9a9f2c 100644
--- a/lib/mountlist.c
+++ b/lib/mountlist.c
@@ -149,16 +149,27 @@
 #undef opendir
 #undef closedir

-#ifndef ME_DUMMY
-# define ME_DUMMY(Fs_name, Fs_type)             \
-    (strcmp (Fs_type, "autofs") == 0            \
-     || strcmp (Fs_type, "none") == 0           \
-     || strcmp (Fs_type, "proc") == 0           \
-     || strcmp (Fs_type, "subfs") == 0          \
-     /* for NetBSD 3.0 */                       \
-     || strcmp (Fs_type, "kernfs") == 0         \
-     /* for Irix 6.5 */                         \
-     || strcmp (Fs_type, "ignore") == 0)
+#define ME_DUMMY_0(Fs_name, Fs_type)            \
+  (strcmp (Fs_type, "autofs") == 0              \
+   || strcmp (Fs_type, "proc") == 0             \
+   || strcmp (Fs_type, "subfs") == 0            \
+   /* for NetBSD 3.0 */                         \
+   || strcmp (Fs_type, "kernfs") == 0           \
+   /* for Irix 6.5 */                           \
+   || strcmp (Fs_type, "ignore") == 0)
+
+/* Historically, we have marked as "dummy" any file system of type "none",
+   but now that programs like du need to know about bind-mounted directories,
+   we grant an exception to any with "bind" in its list of mount options.
+   I.e., those are *not* dummy entries.  */
+#ifdef MOUNTED_GETMNTENT1
+# define ME_DUMMY(Fs_name, Fs_type, Fs_ent)	\
+  (ME_DUMMY_0 (Fs_name, Fs_type)		\
+   || (strcmp (Fs_type, "none") == 0		\
+       && !hasmntopt (Fs_ent, "bind")))
+#else
+# define ME_DUMMY(Fs_name, Fs_type)		\
+  (ME_DUMMY_0 (Fs_name, Fs_type) || strcmp (Fs_type, "none") == 0)
 #endif

 #ifdef __CYGWIN__
--
1.8.0