* actually *is* the (ceph) default block size.
*/
stbuf->f_frsize = CEPH_4M_BLOCK_SIZE;
- stbuf->f_bsize = CEPH_4M_BLOCK_SIZE;
stbuf->f_files = total_files_on_fs;
stbuf->f_ffree = -1;
stbuf->f_favail = -1;
// Special case: if there is a size quota set on the Inode acting
// as the root for this client mount, then report the quota status
// as the filesystem statistics.
- const fsblkcnt_t total = quota_root->quota.max_bytes >> CEPH_4M_BLOCK_SHIFT;
+ fsblkcnt_t total = quota_root->quota.max_bytes >> CEPH_4M_BLOCK_SHIFT;
const fsblkcnt_t used = quota_root->rstat.rbytes >> CEPH_4M_BLOCK_SHIFT;
// It is possible for a quota to be exceeded: arithmetic here must
// handle case where used > total.
- const fsblkcnt_t free = total > used ? total - used : 0;
+ fsblkcnt_t 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 = quota_root->quota.max_bytes > quota_root->rstat.rbytes ? 1 : 0;
+ stbuf->f_frsize = CEPH_4K_BLOCK_SIZE;
+ }
stbuf->f_blocks = total;
stbuf->f_bfree = free;
stbuf->f_bfree = stats.kb_avail >> CEPH_4K_BLOCK_SHIFT;
stbuf->f_bavail = stats.kb_avail >> CEPH_4K_BLOCK_SHIFT;
}
+ stbuf->f_bsize = stbuf->f_frsize;
return rval;
}