Make <asm-generic/statfs.h> suitable for 64-bit platforms.

At the moment, 64-bit platforms (other than Alpha) are all redefining
things for themselves instead of using <asm-generic/statfs.h>.

As is ARM, since it has special requirements w.r.t. padding.

Make <asm-generic/statfs.h> more generic, and they can use it directly.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
David Woodhouse 2008-09-01 14:07:11 +01:00
parent aa7a7fb399
commit 92a7507926
2 changed files with 52 additions and 17 deletions

View file

@ -1,6 +1,10 @@
#ifndef _ALPHA_STATFS_H #ifndef _ALPHA_STATFS_H
#define _ALPHA_STATFS_H #define _ALPHA_STATFS_H
/* Alpha is the only 64-bit platform with 32-bit statfs. And doesn't
even seem to implement statfs64 */
#define __statfs_word __u32
#include <asm-generic/statfs.h> #include <asm-generic/statfs.h>
#endif #endif

View file

@ -6,33 +6,64 @@
typedef __kernel_fsid_t fsid_t; typedef __kernel_fsid_t fsid_t;
#endif #endif
/*
* Most 64-bit platforms use 'long', while most 32-bit platforms use '__u32'.
* Yes, they differ in signedness as well as size.
* Special cases can override it for themselves -- except for S390x, which
* is just a little too special for us. And MIPS, which I'm not touching
* with a 10' pole.
*/
#ifndef __statfs_word
#if BITS_PER_LONG == 64
#define __statfs_word long
#else
#define __statfs_word __u32
#endif
#endif
struct statfs { struct statfs {
__u32 f_type; __statfs_word f_type;
__u32 f_bsize; __statfs_word f_bsize;
__u32 f_blocks; __statfs_word f_blocks;
__u32 f_bfree; __statfs_word f_bfree;
__u32 f_bavail; __statfs_word f_bavail;
__u32 f_files; __statfs_word f_files;
__u32 f_ffree; __statfs_word f_ffree;
__kernel_fsid_t f_fsid; __kernel_fsid_t f_fsid;
__u32 f_namelen; __statfs_word f_namelen;
__u32 f_frsize; __statfs_word f_frsize;
__u32 f_spare[5]; __statfs_word f_spare[5];
}; };
/*
* ARM needs to avoid the 32-bit padding at the end, for consistency
* between EABI and OABI
*/
#ifndef ARCH_PACK_STATFS64
#define ARCH_PACK_STATFS64
#endif
struct statfs64 { struct statfs64 {
__u32 f_type; __statfs_word f_type;
__u32 f_bsize; __statfs_word f_bsize;
__u64 f_blocks; __u64 f_blocks;
__u64 f_bfree; __u64 f_bfree;
__u64 f_bavail; __u64 f_bavail;
__u64 f_files; __u64 f_files;
__u64 f_ffree; __u64 f_ffree;
__kernel_fsid_t f_fsid; __kernel_fsid_t f_fsid;
__u32 f_namelen; __statfs_word f_namelen;
__u32 f_frsize; __statfs_word f_frsize;
__u32 f_spare[5]; __statfs_word f_spare[5];
}; } ARCH_PACK_STATFS64;
/*
* IA64 and x86_64 need to avoid the 32-bit padding at the end,
* to be compatible with the i386 ABI
*/
#ifndef ARCH_PACK_COMPAT_STATFS64
#define ARCH_PACK_COMPAT_STATFS64
#endif
struct compat_statfs64 { struct compat_statfs64 {
__u32 f_type; __u32 f_type;
@ -46,6 +77,6 @@ struct compat_statfs64 {
__u32 f_namelen; __u32 f_namelen;
__u32 f_frsize; __u32 f_frsize;
__u32 f_spare[5]; __u32 f_spare[5];
}; } ARCH_PACK_COMPAT_STATFS64;
#endif #endif