Index: uspace/lib/libfs/libfs.c
===================================================================
--- uspace/lib/libfs/libfs.c	(revision 57b4f469e7b99aef70031cf3f2d0a09930de3f2d)
+++ 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 57b4f469e7b99aef70031cf3f2d0a09930de3f2d)
+++ 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
 
