Index: uspace/srv/vfs/vfs.c
===================================================================
--- uspace/srv/vfs/vfs.c	(revision 1715b6af7847ebb95ae42eba99295f3291f1d1b5)
+++ uspace/srv/vfs/vfs.c	(revision f29a3a24d16a6735fe7d2c7852aa35dd11c133eb)
@@ -137,5 +137,5 @@
 	}
 	
-	/* TODO: cleanup after the client */
+	vfs_files_done();
 }
 
Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 1715b6af7847ebb95ae42eba99295f3291f1d1b5)
+++ uspace/srv/vfs/vfs.h	(revision f29a3a24d16a6735fe7d2c7852aa35dd11c133eb)
@@ -177,4 +177,5 @@
     vfs_pair_t *, ...);
 extern int vfs_open_node_internal(vfs_lookup_res_t *);
+extern int vfs_close_internal(vfs_file_t *);
 
 extern bool vfs_nodes_init(void);
@@ -188,4 +189,5 @@
 
 extern bool vfs_files_init(void);
+extern void vfs_files_done(void);
 extern vfs_file_t *vfs_file_get(int);
 extern int vfs_fd_assign(vfs_file_t *file, int fd);
Index: uspace/srv/vfs/vfs_file.c
===================================================================
--- uspace/srv/vfs/vfs_file.c	(revision 1715b6af7847ebb95ae42eba99295f3291f1d1b5)
+++ uspace/srv/vfs/vfs_file.c	(revision f29a3a24d16a6735fe7d2c7852aa35dd11c133eb)
@@ -72,4 +72,22 @@
 	}
 	return true;
+}
+
+/** Cleanup the table of open files. */
+void vfs_files_done(void)
+{
+	int i;
+
+	if (!files)
+		return;
+
+	for (i = 0; i < MAX_OPEN_FILES; i++) {
+		if (files[i]) {
+			(void) vfs_close_internal(files[i]);
+			(void) vfs_fd_free(i);
+		}
+	}
+	
+	free(files);
 }
 
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 1715b6af7847ebb95ae42eba99295f3291f1d1b5)
+++ uspace/srv/vfs/vfs_ops.c	(revision f29a3a24d16a6735fe7d2c7852aa35dd11c133eb)
@@ -817,5 +817,5 @@
 }
 
-static int vfs_close_internal(vfs_file_t *file)
+int vfs_close_internal(vfs_file_t *file)
 {
 	/*
