Index: uspace/lib/libblock/libblock.c
===================================================================
--- uspace/lib/libblock/libblock.c	(revision 1fbe064b3b6175ba2c4ce86e56eb782cca0c3191)
+++ uspace/lib/libblock/libblock.c	(revision 4198f9c3ae7988eea2c8a649c01af1be31ded05d)
@@ -81,6 +81,6 @@
 } devcon_t;
 
-static int write_block(devcon_t *devcon, bn_t boff, size_t block_size,
-    const void *src);
+static int read_block(devcon_t *devcon, bn_t boff, size_t block_size);
+static int write_block(devcon_t *devcon, bn_t boff, size_t block_size);
 
 static devcon_t *devcon_search(dev_handle_t dev_handle)
@@ -212,12 +212,12 @@
 		return ENOMEM;
 	
-	off_t bufpos = 0;
-	size_t buflen = 0;
-	rc = block_read(dev_handle, &bufpos, &buflen, &off,
-	    bb_buf, size, size);
+	rc = read_block(devcon, 0, size);
 	if (rc != EOK) {
 	    	free(bb_buf);
 		return rc;
 	}
+
+	memcpy(bb_buf, devcon->com_area, size);
+
 	devcon->bb_buf = bb_buf;
 	devcon->bb_off = off;
@@ -340,7 +340,4 @@
 		 */
 		int rc;
-		off_t bufpos = 0;
-		size_t buflen = 0;
-		off_t pos = boff * cache->block_size;
 		bool sync = false;
 
@@ -400,7 +397,7 @@
 			 * the new contents from the device.
 			 */
-			rc = block_read(dev_handle, &bufpos, &buflen, &pos,
-			    b->data, cache->block_size, cache->block_size);
+			rc = read_block(devcon, b->boff, cache->block_size);
 			assert(rc == EOK);
+			memcpy(b->data, devcon->com_area, cache->block_size);
 		}
 
@@ -435,6 +432,6 @@
 		list_append(&block->free_link, &cache->free_head);
 		if (cache->mode != CACHE_MODE_WB && block->dirty) {
-			rc = write_block(devcon, block->boff, block->size,
-			    block->data);
+			memcpy(devcon->com_area, block->data, block->size);
+			rc = write_block(devcon, block->boff, block->size);
 			assert(rc == EOK);
 
@@ -446,5 +443,5 @@
 }
 
-/** Read data from a block device.
+/** Read sequential data from a block device.
  *
  * @param dev_handle	Device handle of the block device.
@@ -460,7 +457,6 @@
  * @return		EOK on success or a negative return code on failure.
  */
-int
-block_read(dev_handle_t dev_handle, off_t *bufpos, size_t *buflen, off_t *pos,
-    void *dst, size_t size, size_t block_size)
+int block_seqread(dev_handle_t dev_handle, off_t *bufpos, size_t *buflen,
+    off_t *pos, void *dst, size_t size, size_t block_size)
 {
 	off_t offset = 0;
@@ -491,9 +487,9 @@
 		if (*bufpos == (off_t) *buflen) {
 			/* Refill the communication buffer with a new block. */
-			ipcarg_t retval;
-			int rc = async_req_2_1(devcon->dev_phone, BD_READ_BLOCK,
-			    *pos / block_size, block_size, &retval);
-			if ((rc != EOK) || (retval != EOK))
-				return (rc != EOK ? rc : (int) retval);
+			int rc;
+
+			rc = read_block(devcon, *pos / block_size, block_size);
+			if (rc != EOK)
+				return rc;
 			
 			*bufpos = 0;
@@ -502,4 +498,27 @@
 	}
 	
+	return EOK;
+}
+
+/** Read block from block device.
+ *
+ * @param devcon	Device connection.
+ * @param boff		Block index.
+ * @param block_size	Block size.
+ * @param src		Buffer for storing the data.
+ *
+ * @return		EOK on success or negative error code on failure.
+ */
+static int read_block(devcon_t *devcon, bn_t boff, size_t block_size)
+{
+	ipcarg_t retval;
+	int rc;
+
+	assert(devcon);
+	rc = async_req_2_1(devcon->dev_phone, BD_READ_BLOCK, boff, block_size,
+	    &retval);
+	if ((rc != EOK) || (retval != EOK))
+		return (rc != EOK ? rc : (int) retval);
+
 	return EOK;
 }
@@ -514,6 +533,5 @@
  * @return		EOK on success or negative error code on failure.
  */
-static int write_block(devcon_t *devcon, bn_t boff, size_t block_size,
-    const void *src)
+static int write_block(devcon_t *devcon, bn_t boff, size_t block_size)
 {
 	ipcarg_t retval;
@@ -521,8 +539,6 @@
 
 	assert(devcon);
-	memcpy(devcon->com_area, src, block_size);
-	
-	rc = async_req_2_1(devcon->dev_phone, BD_WRITE_BLOCK,
-	    boff, block_size, &retval);
+	rc = async_req_2_1(devcon->dev_phone, BD_WRITE_BLOCK, boff, block_size,
+	    &retval);
 	if ((rc != EOK) || (retval != EOK))
 		return (rc != EOK ? rc : (int) retval);
