Messages in this thread Patch in this message | | | Subject | RE: stat64 for over 2TB file returned invalid st_blocks | From | Trond Myklebust <> | Date | Wed, 07 Dec 2005 13:55:25 -0500 |
| |
On Wed, 2005-12-07 at 10:34 -0600, Dave Kleikamp wrote: > On Wed, 2005-12-07 at 10:34 -0500, Trond Myklebust wrote: > > If you really want a variable size type here, then the right thing to do > > is to define a __kernel_blkcnt_t or some such thing, and hide the > > configuration knob for it somewhere in the arch-specific Kconfigs. > > Takashi's patch does improve on what currently exists. Maybe someone > can create a separate patch to replace sector_t with blkcnt_t where it > makes sense.
I can't see that it makes sense to replace sector_t with blkcnt_t in the case of kstatfs. The only place where it may make sense is i_block, since that grows the size of the inode on embedded systems.
Here is a patch to fix the former.
Cheers, Trond
VFS: Convert abuses of sector_t
The type "sector_t" is heavily tied in to the block layer interface as an offset/handle to a block, and is subject to a supposedly block-specific configuration option: CONFIG_LBD. Despite this, it is used in struct kstatfs to save a couple of bytes on the stack whenever we call the filesystems' ->statfs().
One consequence is that networked filesystems may break if CONFIG_LBD is not set, since it is quite common to have multi-TB remote filesystems.
The following patch just converts struct kstatfs to use the standard type u64.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> ---
include/linux/statfs.h | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/linux/statfs.h b/include/linux/statfs.h index ad83a2b..b34cc82 100644 --- a/include/linux/statfs.h +++ b/include/linux/statfs.h @@ -8,11 +8,11 @@ struct kstatfs { long f_type; long f_bsize; - sector_t f_blocks; - sector_t f_bfree; - sector_t f_bavail; - sector_t f_files; - sector_t f_ffree; + u64 f_blocks; + u64 f_bfree; + u64 f_bavail; + u64 f_files; + u64 f_ffree; __kernel_fsid_t f_fsid; long f_namelen; long f_frsize; | |