Index: uspace/srv/vfs/vfs_file.c
===================================================================
--- uspace/srv/vfs/vfs_file.c	(revision 01c3bb491370247ba1459d7e381e27022f09fed4)
+++ uspace/srv/vfs/vfs_file.c	(revision 40feeac3d6d981d671abe77b20b3aa999c586faf)
@@ -257,4 +257,15 @@
 }
 
+static int _vfs_fd_free_locked(vfs_client_data_t *vfs_data, int fd)
+{
+	if ((fd < 0) || (fd >= MAX_OPEN_FILES) || !vfs_data->files[fd]) {
+		return EBADF;
+	}
+
+	int rc = vfs_file_delref(vfs_data, vfs_data->files[fd]);
+	vfs_data->files[fd] = NULL;
+	return rc;
+}
+
 static int _vfs_fd_free(vfs_client_data_t *vfs_data, int fd)
 {
@@ -265,11 +276,5 @@
 
 	fibril_mutex_lock(&vfs_data->lock);	
-	if ((fd < 0) || (fd >= MAX_OPEN_FILES) || !vfs_data->files[fd]) {
-		fibril_mutex_unlock(&vfs_data->lock);
-		return EBADF;
-	}
-	
-	rc = vfs_file_delref(vfs_data, vfs_data->files[fd]);
-	vfs_data->files[fd] = NULL;
+	rc = _vfs_fd_free_locked(vfs_data, fd);
 	fibril_mutex_unlock(&vfs_data->lock);
 	
@@ -308,8 +313,8 @@
 		return EBADF;
 	}
-	if (FILES[fd] != NULL) {
-		fibril_mutex_unlock(&VFS_DATA->lock);
-		return EEXIST;
-	}
+
+	/* Make sure fd is closed. */
+	(void) _vfs_fd_free_locked(VFS_DATA, fd);
+	assert(FILES[fd] == NULL);
 	
 	FILES[fd] = file;
Index: uspace/srv/vfs/vfs_ops.c
===================================================================
--- uspace/srv/vfs/vfs_ops.c	(revision 01c3bb491370247ba1459d7e381e27022f09fed4)
+++ uspace/srv/vfs/vfs_ops.c	(revision 40feeac3d6d981d671abe77b20b3aa999c586faf)
@@ -102,6 +102,4 @@
 
 	if (newfd != -1) {
-		/* Make sure newfd is closed. */
-		(void) vfs_fd_free(newfd);
 		/* Assign the old file to newfd. */
 		rc = vfs_fd_assign(oldfile, newfd);
