The attached fixes a hang for unaccessible NFS mounts which
are automounted by systemd.

See e.g.
  http://blog.tomecek.net/post/automount-with-systemd/
for how to configure such a systemd unit to reproduce.

Do we need a test case for this?

Have a nice day,
Berny
>From 12c1918e836711d1a25dcb936dbc65c1e31d0813 Mon Sep 17 00:00:00 2001
From: Josef Cejka <[email protected]>
Date: Tue, 1 Aug 2017 01:50:34 +0200
Subject: [PATCH] df: avoid stat() for dummy file systems with -l

When systemd is configured to automount a remote file system - see
'man systemd.automount(5)', then the mount point is initially
mounted by systemd with the file system type "autofs".
When the resource is used later on, then the wanted file system is
mounted over that mount point on demand.
'df -l' triggered systemd to mount the file system because it called
stat() on the mount point.
Instead of single-casing "autofs" targets, we can avoid stat()ing
all dummy file systems (which includes "autofs"), because those are
skipped later on in get_dev() anyway.

*src/df.c (filter_mount_list): Also skip dummy file systems unless
the -a option or a specific target are given.
* NEWS: Mention the fix.

Co-authored-by: Bernhard Voelker <[email protected]>

Fixes http://bugzilla.suse.com/show_bug.cgi?id=1043059
---
 NEWS     | 4 ++++
 src/df.c | 1 +
 2 files changed, 5 insertions(+)

diff --git a/NEWS b/NEWS
index 13bbc96..7ea70af 100644
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,10 @@ GNU coreutils NEWS                                    -*- outline -*-
   specifying -x nfs no longer hangs with problematic nfs mounts.
   [bug introduced in coreutils-8.21]
 
+  df -l no longer interacts with dummy file system types, so for example
+  no longer hangs with problematic nfs mounted via system.automount(5).
+  [bug introduced in coreutils-8.21]
+
   `groups inva:lid root` no longer exits immediately upon failure.
   Now, it prints a diagnostic or a line to stdout for each argument.
   [bug introduced in the bourne-shell-to-C rewrite for coreutils-6.11]
diff --git a/src/df.c b/src/df.c
index 678aa47..bd4cc8b 100644
--- a/src/df.c
+++ b/src/df.c
@@ -674,6 +674,7 @@ filter_mount_list (bool devices_only)
          On Linux we probably have me_dev populated from /proc/self/mountinfo,
          however we still stat() in case another device was mounted later.  */
       if ((me->me_remote && show_local_fs)
+          || (me->me_dummy && !show_all_fs && !show_listed_fs)
           || (!selected_fstype (me->me_type) || excluded_fstype (me->me_type))
           || -1 == stat (me->me_mountdir, &buf))
         {
-- 
2.1.4

Reply via email to