[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: coreutils-5.2.1 : df show negative number for an cifs - mounted dir
From: |
Paul Eggert |
Subject: |
Re: coreutils-5.2.1 : df show negative number for an cifs - mounted dir |
Date: |
Tue, 24 Jan 2006 15:32:23 -0800 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Toralf Förster <address@hidden> writes:
> $ strace df -m /mnt/GSA/
> ...
> statfs64("/mnt/GSA", 84, {f_type=0xff534d42, f_bsize=1024,
> f_blocks=2245328896, f_bfree=2737373184, f_bavail=2737373184, f_files=0,
> f_ffree=0, f_fsid={0, 0}, f_namelen=4096, f_frsize=1024}) = 0
> ...
> Filesystem 1M-blocks Used Available Use% Mounted on
> //ehngsa.ibm.com/ 2192704 -18014398509001472 2673216 101% /mnt/GSA
Thanks for reporting that. statfs64 is claiming that your file system
has more available than total blocks. Clearly this is a bug in your
file system or kernel or something like that, but 'df' should output
more-useful information even when there's a bug elsewhere.
I think the output should look like this:
Filesystem 1M-blocks Used Available Use% Mounted on
//ehngsa.ibm.com/ 2192704 -480512 2673216 - /mnt/GSA
I've installed the following patch to CVS coreutils, so that it
generates this output.
2006-01-24 Paul Eggert <address@hidden>
* src/df.c (show_dev): If the file system claims to have
more available than total blocks, report the number of used
blocks as being total - available (a negative number) rather
than as garbage. Problem reported by Toralf Foerster.
--- src/df.c.~1.171.~ 2005-12-28 02:22:41.000000000 -0800
+++ src/df.c 2006-01-24 15:22:59.000000000 -0800
@@ -1,5 +1,5 @@
/* df - summarize free disk space
- Copyright (C) 91, 1995-2005 Free Software Foundation, Inc.
+ Copyright (C) 91, 1995-2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -231,15 +231,15 @@ excluded_fstype (const char *fstype)
/* Like human_readable (N, BUF, human_output_opts, INPUT_UNITS, OUTPUT_UNITS),
except:
- - Return "-" if N is -1,
- - If NEGATIVE is 1 then N represents a negative number,
- expressed in two's complement. */
+ - If NEGATIVE, then N represents a negative number,
+ expressed in two's complement.
+ - Otherwise, return "-" if N is UINTMAX_MAX. */
static char const *
df_readable (bool negative, uintmax_t n, char *buf,
uintmax_t input_units, uintmax_t output_units)
{
- if (n == UINTMAX_MAX)
+ if (n == UINTMAX_MAX && !negative)
return "-";
else
{
@@ -357,20 +357,17 @@ show_dev (char const *disk, char const *
output_units = output_block_size;
total = fsu.fsu_blocks;
available = fsu.fsu_bavail;
- negate_available = fsu.fsu_bavail_top_bit_set;
+ negate_available = (fsu.fsu_bavail_top_bit_set
+ & (available != UINTMAX_MAX));
available_to_root = fsu.fsu_bfree;
}
- used = -1;
+ used = UINTMAX_MAX;
negate_used = false;
if (total != UINTMAX_MAX && available_to_root != UINTMAX_MAX)
{
used = total - available_to_root;
- if (total < available_to_root)
- {
- negate_used = true;
- used = - used;
- }
+ negate_used = (total < available_to_root);
}
printf (" %*s %*s %*s ",