From 804deec15b6bd7b1f843405af65e2863e5655ef8 Mon Sep 17 00:00:00 2001 From: Xiaoxi Chen Date: Thu, 22 Jan 2015 16:19:44 +0800 Subject: [PATCH] Fix memstore free space caculation Originally if memstore run out of space, it will report a very large positive number as free space. For example: root@bigmem:~# rados df pool name KB objects clones degraded unfound rd rd KB wr wr KB rbd 12366704 92240 0 0 0 0 0 92240 12366704 total used 12375877 92240 total avail 36028797009199167 total space 2611076 st->f_bavail = st->f_blocks - used_bytes / st->f_bsize This is due to used_bytes is an unsigned value, so compiler make the whole statement unsigned. Fix it by adding explicit type cast, st->f_bavail = long(st->f_blocks) - long(used_bytes / st->f_bsize) Signed-off-by: Xiaoxi Chen --- src/os/MemStore.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/MemStore.cc b/src/os/MemStore.cc index 7682a513e63..66ad5570a4a 100644 --- a/src/os/MemStore.cc +++ b/src/os/MemStore.cc @@ -241,7 +241,7 @@ int MemStore::statfs(struct statfs *st) st->f_blocks = g_conf->memstore_device_bytes / st->f_bsize; dout(10) << __func__ << ": used_bytes: " << used_bytes << "/" << g_conf->memstore_device_bytes << dendl; - st->f_bfree = st->f_bavail = MAX((st->f_blocks - used_bytes / st->f_bsize), 0); + st->f_bfree = st->f_bavail = MAX((long(st->f_blocks) - long(used_bytes / st->f_bsize)), 0); return 0; } -- 2.47.3