Index: uspace/lib/libfs/libfs.c
===================================================================
--- uspace/lib/libfs/libfs.c	(revision c9f6e49f0fb66a74ff19dac4951b9b121322ca4f)
+++ uspace/lib/libfs/libfs.c	(revision d9e9caf171dc0e1bb688e3504c01ff88cb2a76c5)
@@ -151,4 +151,5 @@
 	void *par = NULL;
 	void *cur = ops->root_get(dev_handle);
+	void *tmp = NULL;
 
 	if (ops->plb_get_char(next) == '/')
@@ -156,6 +157,4 @@
 	
 	while (ops->has_children(cur) && next <= last) {
-		void *tmp;
-
 		/* collect the component */
 		len = 0;
@@ -164,5 +163,5 @@
 				/* comopnent length overflow */
 				ipc_answer_0(rid, ENAMETOOLONG);
-				return;
+				goto out;
 			}
 			component[len++] = ops->plb_get_char(next);
@@ -182,5 +181,5 @@
 				/* there are unprocessed components */
 				ipc_answer_0(rid, ENOENT);
-				return;
+				goto out;
 			}
 			/* miss in the last component */
@@ -189,5 +188,5 @@
 				if (!ops->is_directory(cur)) {
 					ipc_answer_0(rid, ENOTDIR);
-					return;
+					goto out;
 				}
 				void *nodep;
@@ -208,9 +207,10 @@
 						    ops->size_get(nodep),
 						    ops->lnkcnt_get(nodep));
+						ops->node_put(nodep);
 					}
 				} else {
 					ipc_answer_0(rid, ENOSPC);
 				}
-				return;
+				goto out;
 			} else if (lflag & L_PARENT) {
 				/* return parent */
@@ -220,10 +220,14 @@
 			} 
 			ipc_answer_0(rid, ENOENT);
-			return;
+			goto out;
 		}
+
+		if (par)
+			ops->node_put(par);
 
 		/* descend one level */
 		par = cur;
 		cur = tmp;
+		tmp = NULL;
 	}
 
@@ -233,5 +237,5 @@
 			if (!ops->is_directory(cur)) {
 				ipc_answer_0(rid, ENOTDIR);
-				return;
+				goto out;
 			}
 
@@ -242,10 +246,10 @@
 					/* more than one component */
 					ipc_answer_0(rid, ENOENT);
-					return;
+					goto out;
 				}
 				if (len + 1 == NAME_MAX) {
 					/* component length overflow */
 					ipc_answer_0(rid, ENAMETOOLONG);
-					return;
+					goto out;
 				}
 				component[len++] = ops->plb_get_char(next);
@@ -272,20 +276,23 @@
 					    ops->size_get(nodep),
 					    ops->lnkcnt_get(nodep));
+					ops->node_put(nodep);
 				}
 			} else {
 				ipc_answer_0(rid, ENOSPC);
 			}
-			return;
+			goto out;
 		}
 		ipc_answer_0(rid, ENOENT);
-		return;
+		goto out;
 	}
 
 	/* handle hit */
 	if (lflag & L_PARENT) {
+		ops->node_put(cur);
 		cur = par;
+		par = NULL;
 		if (!cur) {
 			ipc_answer_0(rid, ENOENT);
-			return;
+			goto out;
 		}
 	}
@@ -295,22 +302,30 @@
 		ipc_answer_5(rid, (ipcarg_t)res, fs_handle, dev_handle,
 		    ops->index_get(cur), ops->size_get(cur), old_lnkcnt);
-		return;
+		goto out;
 	}
 	if (((lflag & (L_CREATE | L_EXCLUSIVE)) == (L_CREATE | L_EXCLUSIVE)) ||
 	    (lflag & L_LINK)) {
 		ipc_answer_0(rid, EEXIST);
-		return;
+		goto out;
 	}
 	if ((lflag & L_FILE) && (ops->is_directory(cur))) {
 		ipc_answer_0(rid, EISDIR);
-		return;
+		goto out;
 	}
 	if ((lflag & L_DIRECTORY) && (ops->is_file(cur))) {
 		ipc_answer_0(rid, ENOTDIR);
-		return;
+		goto out;
 	}
 
 	ipc_answer_5(rid, EOK, fs_handle, dev_handle, ops->index_get(cur),
 	    ops->size_get(cur), ops->lnkcnt_get(cur));
+
+out:
+	if (par)
+		ops->node_put(par);
+	if (cur)
+		ops->node_put(cur);
+	if (tmp)
+		ops->node_put(tmp);
 }
 
Index: uspace/lib/libfs/libfs.h
===================================================================
--- uspace/lib/libfs/libfs.h	(revision c9f6e49f0fb66a74ff19dac4951b9b121322ca4f)
+++ uspace/lib/libfs/libfs.h	(revision d9e9caf171dc0e1bb688e3504c01ff88cb2a76c5)
@@ -45,4 +45,5 @@
 	void * (* match)(void *, const char *);
 	void * (* node_get)(dev_handle_t, fs_index_t, fs_index_t);
+	void (* node_put)(void *);
 	void * (* create)(int);
 	void (* destroy)(void *);
