bug-coreutils
[Top][All Lists]
Advanced

[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 ",




reply via email to

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