Index: uspace/srv/fs/minixfs/mfs.h
===================================================================
--- uspace/srv/fs/minixfs/mfs.h	(revision 04be5a0ae200f3706573ff25f05f5dddff14dd0e)
+++ uspace/srv/fs/minixfs/mfs.h	(revision 07dcec5794ece1e66cb5907b70d1ad355b829e3f)
@@ -90,5 +90,5 @@
 	mfs_version_t fs_version;
 	int ino_per_block;
-	int dirsize;
+	size_t dirsize;
 	int itable_off;
 	unsigned max_name_len;
@@ -122,5 +122,5 @@
 struct mfs_dentry_info {
 	uint32_t d_inum;
-	char d_name[MFS3_MAX_NAME_LEN];
+	char d_name[MFS3_MAX_NAME_LEN + 1];
 
 	/*The following fields do not exist on disk but only in memory*/
@@ -182,4 +182,7 @@
 write_dentry(struct mfs_dentry_info *d_info);
 
+int
+insert_dentry(struct mfs_node *mnode, char *d_name, fs_index_t d_inum);
+
 /*mfs_balloc.c*/
 extern int
Index: uspace/srv/fs/minixfs/mfs_dentry.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_dentry.c	(revision 04be5a0ae200f3706573ff25f05f5dddff14dd0e)
+++ uspace/srv/fs/minixfs/mfs_dentry.c	(revision 07dcec5794ece1e66cb5907b70d1ad355b829e3f)
@@ -107,5 +107,5 @@
 		goto out;
 
-	const size_t name_len = str_size(d_info->d_name);
+	const size_t name_len = sbi->max_name_len;
 	uint8_t *ptr = b->data;
 	ptr += (d_info->index % dirs_per_block) * sbi->dirsize;
@@ -132,4 +132,52 @@
 }
 
+int
+insert_dentry(struct mfs_node *mnode, char *d_name, fs_index_t d_inum)
+{
+	int i, r;
+	struct mfs_sb_info *sbi = mnode->instance->sbi;
+	struct mfs_dentry_info *d_info;
+	bool empty_dentry_found = false;
+
+	const size_t name_len = str_size(d_name);
+
+	assert(name_len <= sbi->max_name_len);
+
+	/*Search for an empty dentry*/
+
+	for (i = 2; ; ++i) {
+		d_info = read_directory_entry(mnode, i);
+
+		if (!d_info) {
+			/*Reached the end of the dentries list*/
+			break;
+		}
+
+		if (d_info->d_inum == 0) {
+			/*This entry is not used*/
+			empty_dentry_found = true;
+			break;
+		}
+		free(d_info);
+	}
+
+	if (!empty_dentry_found) {
+		r = inode_grow(mnode, sbi->dirsize);
+		if (r != EOK)
+			return r;
+
+		d_info = read_directory_entry(mnode, i);
+		if (!d_info)
+			return EIO;
+	}
+
+	d_info->d_inum = d_inum;
+	memcpy(d_info->d_name, d_name, name_len);
+	d_info->d_name[name_len] = 0;
+
+	return  write_dentry(d_info);
+}
+
+
 /**
  * @}
