ceph: Fix incorrect statfs report for small quota
Problem: The statfs reports incorrect free/available space for quota less then CEPH_BLOCK size (4M). Solution: For quota less than CEPH_BLOCK size, smaller block size of 4K is used. But if quota is less than 4K, it is decided to go with binary use/free of 4K block. For quota size less than 4K size, report the total=used=4K,free=0 when quota is full and total=free=4K,used=0 otherwise. Signed-off-by: Kotresh HR <khiremat@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
adbed05ed6
commit
8e55ba8caa
|
@ -494,10 +494,24 @@ bool ceph_quota_update_statfs(struct ceph_fs_client *fsc, struct kstatfs *buf)
|
||||||
if (ci->i_max_bytes) {
|
if (ci->i_max_bytes) {
|
||||||
total = ci->i_max_bytes >> CEPH_BLOCK_SHIFT;
|
total = ci->i_max_bytes >> CEPH_BLOCK_SHIFT;
|
||||||
used = ci->i_rbytes >> CEPH_BLOCK_SHIFT;
|
used = ci->i_rbytes >> CEPH_BLOCK_SHIFT;
|
||||||
|
/* For quota size less than 4MB, use 4KB block size */
|
||||||
|
if (!total) {
|
||||||
|
total = ci->i_max_bytes >> CEPH_4K_BLOCK_SHIFT;
|
||||||
|
used = ci->i_rbytes >> CEPH_4K_BLOCK_SHIFT;
|
||||||
|
buf->f_frsize = 1 << CEPH_4K_BLOCK_SHIFT;
|
||||||
|
}
|
||||||
/* It is possible for a quota to be exceeded.
|
/* It is possible for a quota to be exceeded.
|
||||||
* Report 'zero' in that case
|
* Report 'zero' in that case
|
||||||
*/
|
*/
|
||||||
free = total > used ? total - used : 0;
|
free = total > used ? total - used : 0;
|
||||||
|
/* For quota size less than 4KB, report the
|
||||||
|
* total=used=4KB,free=0 when quota is full
|
||||||
|
* and total=free=4KB, used=0 otherwise */
|
||||||
|
if (!total) {
|
||||||
|
total = 1;
|
||||||
|
free = ci->i_max_bytes > ci->i_rbytes ? 1 : 0;
|
||||||
|
buf->f_frsize = 1 << CEPH_4K_BLOCK_SHIFT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
spin_unlock(&ci->i_ceph_lock);
|
spin_unlock(&ci->i_ceph_lock);
|
||||||
if (total) {
|
if (total) {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
* large volume sizes on 32-bit machines. */
|
* large volume sizes on 32-bit machines. */
|
||||||
#define CEPH_BLOCK_SHIFT 22 /* 4 MB */
|
#define CEPH_BLOCK_SHIFT 22 /* 4 MB */
|
||||||
#define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)
|
#define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)
|
||||||
|
#define CEPH_4K_BLOCK_SHIFT 12 /* 4 KB */
|
||||||
|
|
||||||
#define CEPH_MOUNT_OPT_CLEANRECOVER (1<<1) /* auto reonnect (clean mode) after blocklisted */
|
#define CEPH_MOUNT_OPT_CLEANRECOVER (1<<1) /* auto reonnect (clean mode) after blocklisted */
|
||||||
#define CEPH_MOUNT_OPT_DIRSTAT (1<<4) /* `cat dirname` for stats */
|
#define CEPH_MOUNT_OPT_DIRSTAT (1<<4) /* `cat dirname` for stats */
|
||||||
|
|
Loading…
Reference in New Issue