bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: coreutils-5.92:du not AIX largefile safe --


From: Jim Meyering
Subject: Re: coreutils-5.92:du not AIX largefile safe --
Date: Fri, 04 Nov 2005 12:20:08 +0100

Paul Townsend <address@hidden> wrote:
> I put the above plus a couple of other commands in a script.  Below is
> the output of `ksh -xv tst'.

I've applied your patch and written a test for the bug.
Would you please see if it detects the problem with the previous
version of du and that it succeeds with your patch?

If you put the attached file in coreutils-5.9/tests/du/, make it executable,
and then run it like this (it relies on a new file, tests/very-expensive,
which you won't have -- just touch it to create an empty file):

  env srcdir=. ./2g

it should fail when src/du is the old one and succeed with the new.

#!/bin/sh
# Ensure that du can handle a 2GB file (i.e., a file of size 2^31 bytes)
# Before coreutils-5.93, on systems with a signed, 32-bit stat.st_blocks
# one of du's computations would overflow.

if test "$VERBOSE" = yes; then
  set -x
  du --version
fi

. $srcdir/../envvar-check

# Creating a 2GB file counts as `expensive'.
. $srcdir/../very-expensive

pwd=`pwd`
t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
trap 'status=$?; cd $pwd; chmod -R u+rwx $t0; rm -rf $t0 && exit $status' 0
trap '(exit $?); exit $?' 1 2 13 15

framework_failure=0
mkdir -p $tmp || framework_failure=1
cd $tmp || framework_failure=1

if test $framework_failure = 1; then
  echo "$0: failure in testing framework" 1>&2
  (exit 1); exit 1
fi

fail=0

# Get number of free kilobytes on current partition, so we can
# skip this test if there is insufficient free space.

# This technique relies on the fact that the `Available' kilobyte
# count is the number just before the one with a trailing `%'.
free_kb=`df -kP .|tail -1|sed 's/ [0-9][0-9]*%.*//;s/ *$//;s/.* //'`
case "$free_kb" in
  [0-9]*) ;;
  *) echo "invalid size from df: $free_kb" 1>&2; (exit 77); exit 77;;
esac

# Require about 3GB free.
min_kb=3000000
test $min_kb -lt $free_kb ||
{
  echo "$0: skipping this test:"
  echo "too little free space on current partition: $free_kb (need $min_kb KB)" 
\
    1>&2;
  (exit 77); exit 77
}

big=big
rm -f $big
test -t 1 || printf 'creating a 2GB file...\n'
for i in `seq 100`; do
  # Note: 2147483648 == 2^31. Print floor(2^31/100) per iteration.
  printf %21474836s x >> $big || fail=1
  # On the final iteration, append the remaining 48 bytes.
  test $i = 100 && { printf %48s x >> $big || fail=1; }
  test -t 1 && printf 'creating a 2GB file: %d%% complete\r' $i
done
echo

du -k $big > out1 || fail=1
rm -f $big
sed 's/^2[0-9][0-9][0-9][0-9][0-9][0-9] '$big'$/~2M/' out1 > out

cat <<\EOF > exp || fail=1
~2M
EOF

cmp out exp || fail=1
test $fail = 1 && diff out exp 2> /dev/null

(exit $fail); exit $fail

reply via email to

[Prev in Thread] Current Thread [Next in Thread]