summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2014-06-19 12:11:00 +0100
committerPádraig Brady <P@draigBrady.com>2014-06-24 14:39:34 +0100
commitb7bb499496ff306d87a07ffd68c034f29b97bc37 (patch)
treee6621e0f9e4bcef9413c9fed54d9c82087456d00
parent6635f0b0f71f68ab4e9108091bc6049ddb143648 (diff)
downloadcoreutils-b7bb499496ff306d87a07ffd68c034f29b97bc37.tar.xz
du: ignore directory cycles due to bind mounts
* src/du.c (process_file): Treat cycles due to bind mounts like cycles due to following symlinks. * tests/du/bind-mount-dir-cycle.sh: Adjust accordingly. * NEWS: Mention the change in behavior. Reported at http://bugzilla.redhat.com/836557
-rw-r--r--NEWS3
-rw-r--r--src/du.c12
-rwxr-xr-xtests/du/bind-mount-dir-cycle.sh5
3 files changed, 9 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index 77286f884..d3c23680c 100644
--- a/NEWS
+++ b/NEWS
@@ -48,6 +48,9 @@ GNU coreutils NEWS -*- outline -*-
display the correct device name for directories mounted multiple times.
[These bugs were present in "the beginning".]
+ du now silently ignores directory cycles introduced with bind mounts.
+ Previously it would issue a warning and exit with a failure status.
+
head --bytes=-N and --lines=-N now handles devices more
consistently, not ignoring data from virtual devices like /dev/zero,
or on BSD systems data from tty devices.
diff --git a/src/du.c b/src/du.c
index e4509fd78..0966326b5 100644
--- a/src/du.c
+++ b/src/du.c
@@ -514,15 +514,11 @@ process_file (FTS *fts, FTSENT *ent)
break;
case FTS_DC:
- if (cycle_warning_required (fts, ent))
+ /* If not following symlinks and not a (bind) mount point. */
+ if (cycle_warning_required (fts, ent)
+ && ! di_set_lookup (di_mnt, sb->st_dev, sb->st_ino))
{
- /* If this is a mount point, then diagnose it and avoid
- the cycle. */
- if (di_set_lookup (di_mnt, sb->st_dev, sb->st_ino))
- error (0, 0, _("mount point %s already traversed"),
- quote (file));
- else
- emit_cycle_warning (file);
+ emit_cycle_warning (file);
return false;
}
return true;
diff --git a/tests/du/bind-mount-dir-cycle.sh b/tests/du/bind-mount-dir-cycle.sh
index 4fef345cd..ac6bf2e24 100755
--- a/tests/du/bind-mount-dir-cycle.sh
+++ b/tests/du/bind-mount-dir-cycle.sh
@@ -27,12 +27,11 @@ mount --bind a a/b \
|| skip_ "This test requires mount with a working --bind option."
echo a > exp || framework_failure_
-echo "du: mount point 'a/b' already traversed" > exp-err || framework_failure_
-du a > out 2> err && fail=1
+du a > out 2> err || fail=1
sed 's/^[0-9][0-9]* //' out > k && mv k out
-compare exp-err err || fail=1
+compare /dev/null err || fail=1
compare exp out || fail=1
Exit $fail