Index: uspace/srv/fs/fat/fat.h
===================================================================
--- uspace/srv/fs/fat/fat.h	(revision e13d1febc1bf068214f559f6c427d5f7b4493786)
+++ uspace/srv/fs/fat/fat.h	(revision d9e9caf171dc0e1bb688e3504c01ff88cb2a76c5)
@@ -148,4 +148,6 @@
 /** FAT in-core node. */
 typedef struct {
+	/** Protects an instance of this type. */
+	futex_t			lock;
 	fat_node_type_t		type;
 	/** VFS index is the node's first allocated cluster. */
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision e13d1febc1bf068214f559f6c427d5f7b4493786)
+++ uspace/srv/fs/fat/fat_ops.c	(revision d9e9caf171dc0e1bb688e3504c01ff88cb2a76c5)
@@ -47,4 +47,5 @@
 #include <libadt/list.h>
 #include <assert.h>
+#include <futex.h>
 
 #define BS_BLOCK		0
@@ -52,4 +53,7 @@
 #define FIN_KEY_DEV_HANDLE	0
 #define FIN_KEY_INDEX		1
+
+/** Futex protecting both fin_hash and ffn_head. */
+futex_t fin_futex = FUTEX_INITIALIZER;
 
 /** Hash table of FAT in-core nodes. */
@@ -119,4 +123,5 @@
 static void fat_node_initialize(fat_node_t *node)
 {
+	futex_initialize(&node->lock, 1);
 	node->type = 0;
 	node->index = 0;
@@ -201,4 +206,5 @@
 	};
 
+	futex_down(&fin_futex);
 	lnk = hash_table_find(&fin_hash, key);
 	if (lnk) {
@@ -209,4 +215,10 @@
 		if (!node->refcnt++)
 			list_remove(&node->ffn_link);
+		futex_up(&fin_futex);
+		
+		/* Make sure that the node is fully instantiated. */
+		futex_down(&node->lock);
+		futex_up(&node->lock);
+		
 		return (void *) node;	
 	}
@@ -242,4 +254,15 @@
 	node->index = index;
 	node->pindex = pindex;
+	key[FIN_KEY_DEV_HANDLE] = node->dev_handle;
+	key[FIN_KEY_INDEX] = node->index;
+	hash_table_insert(&fin_hash, key, &node->fin_link);
+
+	/*
+	 * We have already put the node back to fin_hash.
+	 * The node is not yet fully instantiated so we lock it prior to
+	 * unlocking fin_hash.
+	 */
+	futex_down(&node->lock);
+	futex_up(&fin_futex);
 
 	/*
@@ -269,9 +292,6 @@
 	node->size = uint32_t_le2host(d->size);
 	block_put(b);
-	
-	key[FIN_KEY_DEV_HANDLE] = node->dev_handle;
-	key[FIN_KEY_INDEX] = node->index;
-	hash_table_insert(&fin_hash, key, &node->fin_link);
-
+
+	futex_up(&node->lock);
 	return node;
 }
@@ -281,6 +301,8 @@
 	fat_node_t *nodep = (fat_node_t *)node;
 
-	if (nodep->refcnt-- == 1)
+	futex_down(&fin_futex);
+	if (!--nodep->refcnt)
 		list_append(&nodep->ffn_link, &ffn_head);
+	futex_up(&fin_futex);
 }
 
