Index: uspace/srv/fs/fat/fat.h
===================================================================
--- uspace/srv/fs/fat/fat.h	(revision 6571b78d097ed965d75b3a6866c17c0bea684a82)
+++ uspace/srv/fs/fat/fat.h	(revision 2eb893b0af836486e4d6cd3d0b897be36ab58e77)
@@ -208,4 +208,5 @@
 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);
+extern void fat_idx_destroy(fat_idx_t *);
 
 extern int fat_idx_init(void);
Index: uspace/srv/fs/fat/fat_idx.c
===================================================================
--- uspace/srv/fs/fat/fat_idx.c	(revision 6571b78d097ed965d75b3a6866c17c0bea684a82)
+++ uspace/srv/fs/fat/fat_idx.c	(revision 2eb893b0af836486e4d6cd3d0b897be36ab58e77)
@@ -215,5 +215,5 @@
 
 /** Allocate a VFS index which is not currently in use. */
-static bool fat_idx_alloc(dev_handle_t dev_handle, fs_index_t *index)
+static bool fat_index_alloc(dev_handle_t dev_handle, fs_index_t *index)
 {
 	unused_t *u;
@@ -277,5 +277,5 @@
 
 /** Free a VFS index, which is no longer in use. */
-static void fat_idx_free(dev_handle_t dev_handle, fs_index_t index)
+static void fat_index_free(dev_handle_t dev_handle, fs_index_t index)
 {
 	unused_t *u;
@@ -339,5 +339,5 @@
 }
 
-static fat_idx_t *fat_idx_get_new_core(dev_handle_t dev_handle)
+static fat_idx_t *fat_idx_create(dev_handle_t dev_handle)
 {
 	fat_idx_t *fidx;
@@ -346,5 +346,5 @@
 	if (!fidx) 
 		return NULL;
-	if (!fat_idx_alloc(dev_handle, &fidx->index)) {
+	if (!fat_index_alloc(dev_handle, &fidx->index)) {
 		free(fidx);
 		return NULL;
@@ -367,5 +367,5 @@
 
 	futex_down(&used_futex);
-	fidx = fat_idx_get_new_core(dev_handle);
+	fidx = fat_idx_create(dev_handle);
 	if (!fidx) {
 		futex_up(&used_futex);
@@ -401,5 +401,5 @@
 		fidx = hash_table_get_instance(l, fat_idx_t, uph_link);
 	} else {
-		fidx = fat_idx_get_new_core(dev_handle);
+		fidx = fat_idx_create(dev_handle);
 		if (!fidx) {
 			futex_up(&used_futex);
@@ -445,4 +445,31 @@
 }
 
+/** Destroy the index structure.
+ *
+ * @param idx		The index structure to be destroyed.
+ */
+void fat_idx_destroy(fat_idx_t *idx)
+{
+	unsigned long ikey[] = {
+		[UIH_DH_KEY] = idx->dev_handle,
+		[UIH_INDEX_KEY] = idx->index,
+	};
+
+	assert(idx->pfc == FAT_CLST_RES0);
+
+	futex_down(&used_futex);
+	/*
+	 * Since we can only free unlinked nodes, the index structure is not
+	 * present in the position hash (uph). We therefore hash it out from
+	 * the index hash only.
+	 */
+	hash_table_remove(&ui_hash, ikey, 2);
+	futex_up(&used_futex);
+	/* Release the VFS index. */
+	fat_index_free(idx->dev_handle, idx->index);
+	/* Deallocate the structure. */
+	free(idx);
+}
+
 int fat_idx_init(void)
 {
