diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 2ec9f08009d05..33bb5386bc682 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3412,15 +3412,20 @@ void BlueStore::_sync() int BlueStore::statfs(struct store_statfs_t *buf) { - uint64_t bluefs_len = 0; - for (interval_set::iterator p = bluefs_extents.begin(); - p != bluefs_extents.end(); p++) - bluefs_len += p.get_len(); - buf->reset(); buf->total = bdev->get_size(); - assert(alloc->get_free() >= bluefs_len); - buf->available = (alloc->get_free() - bluefs_len); + buf->available = alloc->get_free(); + + if (bluefs) { + // part of our shared device is "free" accordingly to BlueFS + buf->available += bluefs->get_free(bluefs_shared_bdev); + + // include dedicated db, too, if that isn't the shared device. + if (bluefs_shared_bdev != BlueFS::BDEV_DB) { + buf->available += bluefs->get_free(BlueFS::BDEV_DB); + buf->total += bluefs->get_total(BlueFS::BDEV_DB); + } + } bufferlist bl; int r = db->get(PREFIX_STAT, "bluestore_statfs", &bl);