Index: uspace/srv/fs/fat/fat_fat.c
===================================================================
--- uspace/srv/fs/fat/fat_fat.c	(revision 0a51029fc6a0f62c7212f6bc2b39bc647abdd7d9)
+++ uspace/srv/fs/fat/fat_fat.c	(revision b5db2ae00615259decec56fa6dc55a7b03233dff)
@@ -139,5 +139,5 @@
 		return ELIMIT;
 
-	if (nodep->firstc == FAT_CLST_ROOT)
+	if (!FAT_IS_FAT32(bs) && nodep->firstc == FAT_CLST_ROOT)
 		goto fall_through;
 
@@ -207,5 +207,5 @@
 		return ELIMIT;
 
-	if (fcl == FAT_CLST_ROOT) {
+	if (!FAT_IS_FAT32(bs) && fcl == FAT_CLST_ROOT) {
 		/* root directory special case */
 		assert(bn < RDS(bs));
Index: uspace/srv/fs/fat/fat_fat.h
===================================================================
--- uspace/srv/fs/fat/fat_fat.h	(revision 0a51029fc6a0f62c7212f6bc2b39bc647abdd7d9)
+++ uspace/srv/fs/fat/fat_fat.h	(revision b5db2ae00615259decec56fa6dc55a7b03233dff)
@@ -103,4 +103,8 @@
     (FAT_IS_FAT32(bs) ? FAT32_MASK : FAT16_MASK))
 
+#define FAT_ROOT_CLST(bs) \
+    (FAT_IS_FAT32(bs) ? uint32_t_le2host(bs->fat32.root_cluster) : \
+    FAT_CLST_ROOT)
+
 /* forward declarations */
 struct block;
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision 0a51029fc6a0f62c7212f6bc2b39bc647abdd7d9)
+++ uspace/srv/fs/fat/fat_ops.c	(revision b5db2ae00615259decec56fa6dc55a7b03233dff)
@@ -657,5 +657,5 @@
 	 * We need to grow the parent in order to create a new unused dentry.
 	 */
-	if (parentp->firstc == FAT_CLST_ROOT) {
+	if (!FAT_IS_FAT32(bs) && parentp->firstc == FAT_CLST_ROOT) {
 		/* Can't grow the root directory. */
 		fibril_mutex_unlock(&parentp->idx->lock);
@@ -738,6 +738,6 @@
 			memcpy(d->ext, FAT_EXT_PAD, FAT_EXT_LEN);
 			d->attr = FAT_ATTR_SUBDIR;
-			d->firstc = (parentp->firstc == FAT_CLST_ROOT) ?
-			    host2uint16_t_le(FAT_CLST_RES0) :
+			d->firstc = (parentp->firstc == FAT_ROOT_CLST(bs)) ?
+			    host2uint16_t_le(FAT_CLST_ROOTPAR) :
 			    host2uint16_t_le(parentp->firstc);
 			/* TODO: initialize also the date/time members. */
@@ -1055,9 +1055,25 @@
 
 	rootp->type = FAT_DIRECTORY;
-	rootp->firstc = (FAT_IS_FAT32(bs) ? bs->fat32.root_cluster : FAT_CLST_ROOT);
+	rootp->firstc = FAT_ROOT_CLST(bs);
 	rootp->refcnt = 1;
 	rootp->lnkcnt = 0;	/* FS root is not linked */
-	rootp->size = (FAT_IS_FAT32(bs) ? SPC(bs)*BPS(bs) : 
-	    RDE(bs) * sizeof(fat_dentry_t));
+
+	if (FAT_IS_FAT32(bs)) {
+		uint16_t clusters;
+		rc = fat_clusters_get(&clusters, bs, devmap_handle, rootp->firstc);
+		if (rc != EOK) {
+			free(rfn);
+			free(rootp);
+			free(ridxp); /* TODO: Is it right way to free ridxp? */
+			(void) block_cache_fini(devmap_handle);
+			block_fini(devmap_handle);
+			fat_idx_fini_by_devmap_handle(devmap_handle);
+			async_answer_0(rid, ENOTSUP);
+			return;
+		}
+		rootp->size = BPS(bs) * SPC(bs) * clusters;
+	} else
+		rootp->size = RDE(bs) * sizeof(fat_dentry_t);
+
 	rootp->idx = ridxp;
 	ridxp->nodep = rootp;
