mirror of
git://git.sv.gnu.org/coreutils
synced 2026-05-13 18:37:22 -04:00
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:
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user