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
This commit is contained in:
Pádraig Brady
2014-06-19 12:11:00 +01:00
parent 6635f0b0f7
commit b7bb499496
3 changed files with 9 additions and 11 deletions
+3
View File
@@ -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.
+4 -8
View File
@@ -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;
+2 -3
View File
@@ -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