1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-04-18 09:46:33 +02:00

stat: report the correct block size for file system usage

struct statfs has the f_frsize member since Linux 2.6,
so use that rather than f_bsize which can be different.
Note the related df change mentioned in NEWS is handled
in gnulib by using statvfs() rather than statfs()
on Linux > 2.6.36 (where statvfs doesn't hang) and the
same method as stat for Linux 2.6 kernels earlier than that.
stat(1) doesn't use statvfs() on GNU/Linux as the f_type
member isn't available there.
Note the change to not use statvfs() on GNU/Linux was introduced
in gnulib commit eda39b8 16-08-2003.

* m4/stat-prog.m4 (cu_PREREQ_STAT_PROG): Check for the f_frsize
member in the statfs structure.
* src/stat.c: Use (struct statfs).f_frsize if available.
* NEWS (Bug fixes): Mention this stat fix, and the related df fix
coming in the next gnulib update.
* THANKS.in: Add Nikolaus.

Reported and Tested by Nikolaus Rath
This commit is contained in:
Pádraig Brady
2012-05-15 19:56:21 +01:00
parent 6124a3842d
commit 0863f018f0
4 changed files with 12 additions and 3 deletions

4
NEWS
View File

@@ -7,6 +7,10 @@ GNU coreutils NEWS -*- outline -*-
ls --color would mis-color relative-named symlinks in /
[bug introduced in coreutils-8.17]
stat and df now report the correct file system usage,
in all situations on GNU/Linux, by correctly determining the block size.
[df bug since coreutils-5.0.91, stat bug since the initial implementation]
* Noteworthy changes in release 8.17 (2012-05-10) [stable]

View File

@@ -448,6 +448,7 @@ Nickolai Zeldovich nickolai@cs.stanford.edu
Nicolas François nicolas.francois@centraliens.net
Niklas Edmundsson nikke@acc.umu.se
Nikola Milutinovic Nikola.Milutinovic@ev.co.yu
Nikolaus Rath Nikolaus@rath.org
Nima Nikzad nnikzad@ucla.edu
Noah Friedman friedman@splode.com
Noel Cragg noel@red-bean.com

View File

@@ -72,8 +72,8 @@ AC_INCLUDES_DEFAULT
[AC_DEFINE([STRUCT_STATVFS_F_FSID_IS_INTEGER], [1],
[Define to 1 if the f_fsid member of struct statvfs is an integer.])])
else
AC_CHECK_MEMBERS([struct statfs.f_namelen, struct statfs.f_type],,,
[$statfs_includes])
AC_CHECK_MEMBERS([struct statfs.f_namelen, struct statfs.f_type,
struct statfs.f_frsize],,, [$statfs_includes])
if test $ac_cv_header_OS_h != yes; then
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(

View File

@@ -126,7 +126,11 @@ statfs (char const *filename, struct fs_info *buf)
# else
# define STRUCT_STATVFS struct statfs
# define STRUCT_STATXFS_F_FSID_IS_INTEGER STRUCT_STATFS_F_FSID_IS_INTEGER
# define STATFS_FRSIZE(S) 0
# if HAVE_STRUCT_STATFS_F_FRSIZE
# define STATFS_FRSIZE(S) ((S)->f_frsize)
# else
# define STATFS_FRSIZE(S) 0
# endif
# endif
#endif