From cfe1040c093be1c1a9b2403e713f1d1c2242a4bc Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 14 Dec 2011 18:00:42 -0800 Subject: [PATCH] du: -x should not count files in other file systems This fixes Bug#10293, which I guess was introduced in commit 95c948b06a dated 2003-10-02. * NEWS: Document fix. * src/du.c (process_file): Don't count files in different file systems if -x is given. * tests/du/one-file-system: Test for this bug. --- NEWS | 3 +++ src/du.c | 3 +++ tests/du/one-file-system | 17 +++++++++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 0d4c83b..51c44c7 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,9 @@ GNU coreutils NEWS -*- outline -*- ** Bug fixes + du -x no longer counts root directories of other file systems. + [bug introduced in coreutils-5.1.0] + ls --color many-entry-directory was uninterruptible for too long [bug introduced in coreutils-5.2.1] diff --git a/src/du.c b/src/du.c index fba7f7d..a8dfd28 100644 --- a/src/du.c +++ b/src/du.c @@ -443,6 +443,9 @@ process_file (FTS *fts, FTSENT *ent) error (0, ent->fts_errno, _("cannot access %s"), quote (file)); return false; } + + if (fts->fts_options & FTS_XDEV && fts->fts_dev != sb->st_dev) + excluded = true; } if (excluded diff --git a/tests/du/one-file-system b/tests/du/one-file-system index 7195838..3e82a8d 100755 --- a/tests/du/one-file-system +++ b/tests/du/one-file-system @@ -1,6 +1,5 @@ #!/bin/sh -# Test for a bug in fts's handling of FTS_XDEV, the flag behind -# du's --one-file-system (-x) option. +# Test for bugs in du's --one-file-system (-x) option. # Copyright (C) 2006-2011 Free Software Foundation, Inc. @@ -19,9 +18,11 @@ . "${srcdir=.}/init.sh"; path_prepend_ ../src print_ver_ du +cleanup_() { rm -rf "$other_partition_tmpdir"; } +. "$abs_srcdir/other-fs-tmpdir" -mkdir -p b/c y/z || framework_failure_ - +mkdir -p b/c y/z d "$other_partition_tmpdir/x" || framework_failure_ +ln -s "$other_partition_tmpdir/x" d || framework_failure_ # Due to a used-uninitialized variable, the "du -x" from coreutils-6.6 # would not traverse into second and subsequent directories listed @@ -37,4 +38,12 @@ EOF compare exp out || fail=1 +# "du -xL" reported a zero count for a file in a different file system, +# instead of ignoring it. +du -xL d > u || fail=1 +sed 's/^[0-9][0-9]* //' u > out1 +echo d > exp1 || fail=1 + +compare exp1 out1 || fail=1 + Exit $fail -- 2.7.4