Index: uspace/srv/fs/mfs/mfs.h
===================================================================
--- uspace/srv/fs/mfs/mfs.h	(revision b5ba8f6bf68a938553e7261a2c0285ce7d24fd7f)
+++ uspace/srv/fs/mfs/mfs.h	(revision 1eaa3cf707e6d408ffe5c523ca554778716f5394)
@@ -44,4 +44,5 @@
 #include <errno.h>
 #include <assert.h>
+#include <stdbool.h>
 #include "../../vfs/vfs.h"
 
@@ -105,4 +106,7 @@
 	unsigned isearch;
 	unsigned zsearch;
+
+	bool nfree_zones_valid;
+	unsigned nfree_zones;
 };
 
Index: uspace/srv/fs/mfs/mfs_balloc.c
===================================================================
--- uspace/srv/fs/mfs/mfs_balloc.c	(revision b5ba8f6bf68a938553e7261a2c0285ce7d24fd7f)
+++ uspace/srv/fs/mfs/mfs_balloc.c	(revision 1eaa3cf707e6d408ffe5c523ca554778716f5394)
@@ -88,4 +88,11 @@
 {
 	int r = mfs_alloc_bit(inst, zone, BMAP_ZONE);
+	if (r != EOK)
+		return r;
+
+	/* Update the cached number of free zones */
+	struct mfs_sb_info *sbi = inst->sbi;
+	if (sbi->nfree_zones_valid)
+		sbi->nfree_zones--;
 
 	*zone += inst->sbi->firstdatazone - 1;
@@ -103,7 +110,18 @@
 mfs_free_zone(struct mfs_instance *inst, uint32_t zone)
 {
+	int r;
+
 	zone -= inst->sbi->firstdatazone - 1;
 
-	return mfs_free_bit(inst, zone, BMAP_ZONE);
+	r = mfs_free_bit(inst, zone, BMAP_ZONE);
+	if (r != EOK)
+		return r;
+
+	/* Update the cached number of free zones */
+	struct mfs_sb_info *sbi = inst->sbi;
+	if (sbi->nfree_zones_valid)
+		sbi->nfree_zones++;
+
+	return r;
 }
 
Index: uspace/srv/fs/mfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/mfs/mfs_ops.c	(revision b5ba8f6bf68a938553e7261a2c0285ce7d24fd7f)
+++ uspace/srv/fs/mfs/mfs_ops.c	(revision 1eaa3cf707e6d408ffe5c523ca554778716f5394)
@@ -216,4 +216,6 @@
 	sbi->isearch = 0;
 	sbi->zsearch = 0;
+	sbi->nfree_zones_valid = false;
+	sbi->nfree_zones = 0;
 
 	if (version == MFS_VERSION_V3) {
@@ -1181,9 +1183,21 @@
 		return rc;
 
-	if (NULL == inst)
-		return ENOENT;
-
-	mfs_count_free_zones(inst, &block_free);
-	*count = block_free;
+	struct mfs_sb_info *sbi = inst->sbi;
+
+	if (!sbi->nfree_zones_valid) {
+		/* The cached number of free zones is not valid,
+		 * we need to scan the bitmap to retrieve the
+		 * current value.
+		 */
+
+		rc = mfs_count_free_zones(inst, &block_free);
+		if (rc != EOK)
+			return rc;
+
+		sbi->nfree_zones = block_free;
+		sbi->nfree_zones_valid = true;
+	}
+
+	*count = sbi->nfree_zones;
 
 	return EOK;
