Re: [PATCH] ceph: fix statvfs fr_size

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sage Weil <sage@xxxxxxxxxxx> writes:

> Hi,
>
> This applies cleanly to probably any 3.x kernel, but really only needs to 
> go into 3.4 (or other stable kernels from 3.4 to 3.9).  It first appeared 
> in 3.9.

Thank you, I'm queuing it for the 3.5 kernel

Cheers,
-- 
Luis

>
> Thanks!
> sage
>
>
> From 92a49fb0f79f3300e6e50ddf56238e70678e4202 Mon Sep 17 00:00:00 2001
> From: Sage Weil <sage@xxxxxxxxxxx>
> Date: Fri, 22 Feb 2013 15:31:00 -0800
> Subject: [PATCH] ceph: fix statvfs fr_size
>
> Different versions of glibc are broken in different ways, but the short of
> it is that for the time being, frsize should == bsize, and be used as the
> multiple for the blocks, free, and available fields.  This mirrors what is
> done for NFS.  The previous reporting of the page size for frsize meant
> that newer glibc and df would report a very small value for the fs size.
>
> Fixes http://tracker.ceph.com/issues/3793.
>
> Signed-off-by: Sage Weil <sage@xxxxxxxxxxx>
> Reviewed-by: Greg Farnum <greg@xxxxxxxxxxx>
> ---
>  fs/ceph/super.c | 7 ++++++-
>  fs/ceph/super.h | 2 +-
>  2 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/fs/ceph/super.c b/fs/ceph/super.c
> index e86aa994..9fe17c6c 100644
> --- a/fs/ceph/super.c
> +++ b/fs/ceph/super.c
> @@ -71,8 +71,14 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
>  	/*
>  	 * express utilization in terms of large blocks to avoid
>  	 * overflow on 32-bit machines.
> +	 *
> +	 * NOTE: for the time being, we make bsize == frsize to humor
> +	 * not-yet-ancient versions of glibc that are broken.
> +	 * Someday, we will probably want to report a real block
> +	 * size...  whatever that may mean for a network file system!
>  	 */
>  	buf->f_bsize = 1 << CEPH_BLOCK_SHIFT;
> +	buf->f_frsize = 1 << CEPH_BLOCK_SHIFT;
>  	buf->f_blocks = le64_to_cpu(st.kb) >> (CEPH_BLOCK_SHIFT-10);
>  	buf->f_bfree = le64_to_cpu(st.kb_avail) >> (CEPH_BLOCK_SHIFT-10);
>  	buf->f_bavail = le64_to_cpu(st.kb_avail) >> (CEPH_BLOCK_SHIFT-10);
> @@ -80,7 +86,6 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
>  	buf->f_files = le64_to_cpu(st.num_objects);
>  	buf->f_ffree = -1;
>  	buf->f_namelen = NAME_MAX;
> -	buf->f_frsize = PAGE_CACHE_SIZE;
>  
>  	/* leave fsid little-endian, regardless of host endianness */
>  	fsid = *(u64 *)(&monmap->fsid) ^ *((u64 *)&monmap->fsid + 1);
> diff --git a/fs/ceph/super.h b/fs/ceph/super.h
> index 9861cce..604526a 100644
> --- a/fs/ceph/super.h
> +++ b/fs/ceph/super.h
> @@ -21,7 +21,7 @@
>  
>  /* large granularity for statfs utilization stats to facilitate
>   * large volume sizes on 32-bit machines. */
> -#define CEPH_BLOCK_SHIFT   20  /* 1 MB */
> +#define CEPH_BLOCK_SHIFT   22  /* 4 MB */
>  #define CEPH_BLOCK         (1 << CEPH_BLOCK_SHIFT)
>  
>  #define CEPH_MOUNT_OPT_DIRSTAT         (1<<4) /* `cat dirname` for stats */
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]