Index: uspace/lib/libfs/libfs.c
===================================================================
--- uspace/lib/libfs/libfs.c	(revision 9f429c00951b6fd8f40afbb019674f89d8ccefe2)
+++ uspace/lib/libfs/libfs.c	(revision d2c1fd53579d1a567dfae1eae22cce29947a9f5f)
@@ -331,4 +331,44 @@
 }
 
+#define RD_BASE		1024	// FIXME
+#define RD_READ_BLOCK	(RD_BASE + 1)
+
+bool libfs_blockread(int phone, void *buffer, size_t *bufpos, size_t *buflen,
+    size_t *pos, void *dst, size_t size, size_t block_size)
+{
+	size_t offset = 0;
+	size_t left = size;
+	
+	while (left > 0) {
+		size_t rd;
+		
+		if (*bufpos + left < *buflen)
+			rd = left;
+		else
+			rd = *buflen - *bufpos;
+		
+		if (rd > 0) {
+			memcpy(dst + offset, buffer + *bufpos, rd);
+			offset += rd;
+			*bufpos += rd;
+			*pos += rd;
+			left -= rd;
+		}
+		
+		if (*bufpos == *buflen) {
+			ipcarg_t retval;
+			int rc = async_req_2_1(phone, RD_READ_BLOCK,
+			    *pos / block_size, block_size, &retval);
+			if ((rc != EOK) || (retval != EOK))
+				return false;
+			
+			*bufpos = 0;
+			*buflen = block_size;
+		}
+	}
+	
+	return true;
+}
+
 /** @}
  */
Index: uspace/lib/libfs/libfs.h
===================================================================
--- uspace/lib/libfs/libfs.h	(revision 9f429c00951b6fd8f40afbb019674f89d8ccefe2)
+++ uspace/lib/libfs/libfs.h	(revision d2c1fd53579d1a567dfae1eae22cce29947a9f5f)
@@ -70,4 +70,7 @@
 extern void libfs_lookup(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);
 
+extern bool libfs_blockread(int, void *, size_t *, size_t *, size_t *, void *,
+    size_t, size_t);
+
 #endif
 
Index: uspace/srv/fs/tmpfs/tmpfs_dump.c
===================================================================
--- uspace/srv/fs/tmpfs/tmpfs_dump.c	(revision 9f429c00951b6fd8f40afbb019674f89d8ccefe2)
+++ uspace/srv/fs/tmpfs/tmpfs_dump.c	(revision d2c1fd53579d1a567dfae1eae22cce29947a9f5f)
@@ -52,7 +52,5 @@
 #include <byteorder.h>
 
-#define BLOCK_SIZE			1024	// FIXME
-#define RD_BASE				1024	// FIXME
-#define	RD_READ_BLOCK	(RD_BASE + 1)
+#define TMPFS_BLOCK_SIZE	1024
 
 struct rdentry {
@@ -60,42 +58,4 @@
 	uint32_t len;
 } __attribute__((packed));
-
-static bool 
-tmpfs_blockread(int phone, void *buffer, size_t *bufpos, size_t *buflen,
-    size_t *pos, void *dst, size_t size)
-{
-	size_t offset = 0;
-	size_t left = size;
-	
-	while (left > 0) {
-		size_t rd;
-		
-		if (*bufpos + left < *buflen)
-			rd = left;
-		else
-			rd = *buflen - *bufpos;
-		
-		if (rd > 0) {
-			memcpy(dst + offset, buffer + *bufpos, rd);
-			offset += rd;
-			*bufpos += rd;
-			*pos += rd;
-			left -= rd;
-		}
-		
-		if (*bufpos == *buflen) {
-			ipcarg_t retval;
-			int rc = async_req_2_1(phone, RD_READ_BLOCK,
-			    *pos / BLOCK_SIZE, BLOCK_SIZE, &retval);
-			if ((rc != EOK) || (retval != EOK))
-				return false;
-			
-			*bufpos = 0;
-			*buflen = BLOCK_SIZE;
-		}
-	}
-	
-	return true;
-}
 
 static bool
@@ -111,6 +71,6 @@
 		uint32_t size;
 		
-		if (!tmpfs_blockread(phone, block, bufpos, buflen, pos, &entry,
-		    sizeof(entry)))
+		if (!libfs_blockread(phone, block, bufpos, buflen, pos, &entry,
+		    sizeof(entry), TMPFS_BLOCK_SIZE))
 			return false;
 		
@@ -131,6 +91,6 @@
 			}
 			
-			if (!tmpfs_blockread(phone, block, bufpos, buflen, pos,
-			    fname, entry.len)) {
+			if (!libfs_blockread(phone, block, bufpos, buflen, pos,
+			    fname, entry.len, TMPFS_BLOCK_SIZE)) {
 				ops->destroy((void *) node);
 				free(fname);
@@ -146,6 +106,6 @@
 			free(fname);
 			
-			if (!tmpfs_blockread(phone, block, bufpos, buflen, pos,
-			    &size, sizeof(size)))
+			if (!libfs_blockread(phone, block, bufpos, buflen, pos,
+			    &size, sizeof(size), TMPFS_BLOCK_SIZE))
 				return false;
 			
@@ -157,6 +117,6 @@
 			
 			node->size = size;
-			if (!tmpfs_blockread(phone, block, bufpos, buflen, pos,
-			    node->data, size))
+			if (!libfs_blockread(phone, block, bufpos, buflen, pos,
+			    node->data, size, TMPFS_BLOCK_SIZE))
 				return false;
 			
@@ -173,6 +133,6 @@
 			}
 			
-			if (!tmpfs_blockread(phone, block, bufpos, buflen, pos,
-			    fname, entry.len)) {
+			if (!libfs_blockread(phone, block, bufpos, buflen, pos,
+			    fname, entry.len, TMPFS_BLOCK_SIZE)) {
 				ops->destroy((void *) node);
 				free(fname);
@@ -205,5 +165,5 @@
 	libfs_ops_t *ops = &tmpfs_libfs_ops;
 
-	void *block = mmap(NULL, BLOCK_SIZE,
+	void *block = mmap(NULL, TMPFS_BLOCK_SIZE,
 	    PROTO_READ | PROTO_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
 	
@@ -215,5 +175,5 @@
 
 	if (phone < 0) {
-		munmap(block, BLOCK_SIZE);
+		munmap(block, TMPFS_BLOCK_SIZE);
 		return false;
 	}
@@ -228,5 +188,6 @@
 	
 	char tag[6];
-	if (!tmpfs_blockread(phone, block, &bufpos, &buflen, &pos, tag, 5))
+	if (!libfs_blockread(phone, block, &bufpos, &buflen, &pos, tag, 5,
+	    TMPFS_BLOCK_SIZE))
 		goto error;
 	
@@ -240,10 +201,10 @@
 		
 	ipc_hangup(phone);
-	munmap(block, BLOCK_SIZE);
+	munmap(block, TMPFS_BLOCK_SIZE);
 	return true;
 	
 error:
 	ipc_hangup(phone);
-	munmap(block, BLOCK_SIZE);
+	munmap(block, TMPFS_BLOCK_SIZE);
 	return false;
 }
