Index: uspace/srv/fs/minixfs/mfs_ops.c
===================================================================
--- uspace/srv/fs/minixfs/mfs_ops.c	(revision c955be913c2b1bcf936f66665586de462471eb3e)
+++ uspace/srv/fs/minixfs/mfs_ops.c	(revision 53eb5887bacd6f7ee9d9357fda801a782f8e5502)
@@ -56,4 +56,5 @@
 static int mfs_create_node(fs_node_t **rfn, devmap_handle_t handle, int flags);
 static int mfs_link(fs_node_t *pfn, fs_node_t *cfn, const char *name);
+static int mfs_unlink(fs_node_t *, fs_node_t *, const char *name);
 
 static int mfs_node_get(fs_node_t **rfn, devmap_handle_t devmap_handle,
@@ -77,4 +78,5 @@
 	.create = mfs_create_node,
 	.link = mfs_link,
+	.unlink = mfs_unlink,
 	.plb_get_char = mfs_plb_get_char,
 	.has_children = mfs_has_children,
@@ -433,5 +435,4 @@
 static unsigned mfs_lnkcnt_get(fs_node_t *fsnode)
 {
-	unsigned rc;
 	struct mfs_node *mnode = fsnode->data;
 
@@ -439,6 +440,5 @@
 	assert(mnode->ino_i);
 
-	rc = mnode->ino_i->i_nlinks;
-	return rc;
+	return mnode->ino_i->i_nlinks;;
 }
 
@@ -536,4 +536,33 @@
 exit_error:
 	return r;
+}
+
+static int
+mfs_unlink(fs_node_t *pfn, fs_node_t *cfn, const char *name)
+{
+	struct mfs_node *parent = pfn->data;
+	struct mfs_node *child = cfn->data;
+	bool has_children;
+	int r;
+
+	if (!parent)
+		return EBUSY;
+
+	r = mfs_has_children(&has_children, cfn);
+	on_error(r, return r);
+	if (has_children)
+		return ENOTEMPTY;
+
+	r = remove_dentry(parent, name);
+	on_error(r, return r);
+
+	struct mfs_ino_info *chino = child->ino_i;
+
+	assert(chino->i_nlinks >= 1);
+	--chino->i_nlinks;
+
+	chino->dirty = true;
+
+	return EOK;
 }
 
