Index: uspace/srv/fs/fat/fat.h
===================================================================
--- uspace/srv/fs/fat/fat.h	(revision 1d8cdb185ad73e3854920a8c26df884d780b3315)
+++ uspace/srv/fs/fat/fat.h	(revision 3ff2b5474db5d13ba2132c533593a7bcdbf4126a)
@@ -205,4 +205,5 @@
 extern void fat_truncate(ipc_callid_t, ipc_call_t *);
 
+extern fat_idx_t *fat_idx_get_new(dev_handle_t);
 extern fat_idx_t *fat_idx_get_by_pos(dev_handle_t, fat_cluster_t, unsigned);
 extern fat_idx_t *fat_idx_get_by_index(dev_handle_t, fs_index_t);
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision 1d8cdb185ad73e3854920a8c26df884d780b3315)
+++ uspace/srv/fs/fat/fat_ops.c	(revision 3ff2b5474db5d13ba2132c533593a7bcdbf4126a)
@@ -235,20 +235,59 @@
 {
 	fat_node_t *nodep = (fat_node_t *)node;
+	bool destroy = false;
 
 	futex_down(&nodep->lock);
 	if (!--nodep->refcnt) {
-		futex_down(&ffn_futex);
-		list_append(&nodep->ffn_link, &ffn_head);
-		futex_up(&ffn_futex);
+		if (nodep->idx) {
+			futex_down(&ffn_futex);
+			list_append(&nodep->ffn_link, &ffn_head);
+			futex_up(&ffn_futex);
+		} else {
+			/*
+			 * The node does not have any index structure associated
+			 * with itself. This can only mean that we are releasing
+			 * the node after a failed attempt to allocate the index
+			 * structure for it.
+			 */
+			destroy = true;
+		}
 	}
 	futex_up(&nodep->lock);
-}
-
-static void *fat_create(dev_handle_t dev_handle, int flags)
-{
-	return NULL;	/* not supported at the moment */
-}
-
-static int fat_destroy(void *node)
+	if (destroy)
+		free(node);
+}
+
+static void *fat_create_node(dev_handle_t dev_handle, int flags)
+{
+	fat_idx_t *idxp;
+	fat_node_t *nodep;
+
+	nodep = fat_node_get_new();
+	if (!nodep) 
+		return NULL;
+	idxp = fat_idx_get_new(dev_handle);
+	if (!idxp) {
+		fat_node_put(nodep);
+		return NULL;
+	}
+	/* idxp->lock held */
+	if (flags & L_DIRECTORY) {
+		nodep->type = FAT_DIRECTORY;
+	} else {
+		nodep->type = FAT_FILE;
+	}
+	nodep->size = 0;
+	nodep->firstc = FAT_CLST_RES0;
+	nodep->lnkcnt = 0;	/* not linked anywhere */
+	nodep->refcnt = 1;
+
+	nodep->idx = idxp;
+	idxp->nodep = nodep;
+
+	futex_up(&idxp->lock);
+	return nodep;
+}
+
+static int fat_destroy_node(void *node)
 {
 	return ENOTSUP;	/* not supported at the moment */
@@ -425,6 +464,6 @@
 	.node_get = fat_node_get,
 	.node_put = fat_node_put,
-	.create = fat_create,
-	.destroy = fat_destroy,
+	.create = fat_create_node,
+	.destroy = fat_destroy_node,
 	.link = fat_link,
 	.unlink = fat_unlink,
