Index: uspace/lib/libblock/libblock.c
===================================================================
--- uspace/lib/libblock/libblock.c	(revision 2953f9aa56ef5ff93cd64392ab549d5c7f473d49)
+++ uspace/lib/libblock/libblock.c	(revision 6284978581040c06c173f1990897a36fe2cd2cb2)
@@ -83,5 +83,5 @@
 
 static int devcon_add(dev_handle_t dev_handle, int dev_phone, void *com_area,
-   size_t com_size, void *bb_buf, off_t bb_off, size_t bb_size)
+   size_t com_size)
 {
 	link_t *cur;
@@ -97,7 +97,7 @@
 	devcon->com_area = com_area;
 	devcon->com_size = com_size;
-	devcon->bb_buf = bb_buf;
-	devcon->bb_off = bb_off;
-	devcon->bb_size = bb_size;
+	devcon->bb_buf = NULL;
+	devcon->bb_off = 0;
+	devcon->bb_size = 0;
 
 	futex_down(&dcl_lock);
@@ -122,21 +122,13 @@
 }
 
-int
-block_init(dev_handle_t dev_handle, size_t com_size, off_t bb_off,
-    size_t bb_size)
+int block_init(dev_handle_t dev_handle, size_t com_size)
 {
 	int rc;
 	int dev_phone;
 	void *com_area;
-	void *bb_buf;
-	
-	bb_buf = malloc(bb_size);
-	if (!bb_buf)
-		return ENOMEM;
 	
 	com_area = mmap(NULL, com_size, PROTO_READ | PROTO_WRITE,
 	    MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
 	if (!com_area) {
-		free(bb_buf);
 		return ENOMEM;
 	}
@@ -145,5 +137,4 @@
 
 	if (dev_phone < 0) {
-		free(bb_buf);
 		munmap(com_area, com_size);
 		return dev_phone;
@@ -153,5 +144,4 @@
 	    AS_AREA_READ | AS_AREA_WRITE);
 	if (rc != EOK) {
-		free(bb_buf);
 	    	munmap(com_area, com_size);
 		ipc_hangup(dev_phone);
@@ -159,8 +149,6 @@
 	}
 	
-	rc = devcon_add(dev_handle, dev_phone, com_area, com_size, bb_buf,
-	    bb_off, bb_size);
+	rc = devcon_add(dev_handle, dev_phone, com_area, com_size);
 	if (rc != EOK) {
-		free(bb_buf);
 		munmap(com_area, com_size);
 		ipc_hangup(dev_phone);
@@ -168,27 +156,47 @@
 	}
 
+	return EOK;
+}
+
+void block_fini(dev_handle_t dev_handle)
+{
+	devcon_t *devcon = devcon_search(dev_handle);
+	assert(devcon);
+	
+	devcon_remove(devcon);
+
+	if (devcon->bb_buf)
+		free(devcon->bb_buf);
+	munmap(devcon->com_area, devcon->com_size);
+	ipc_hangup(devcon->dev_phone);
+
+	free(devcon);	
+}
+
+int block_bb_read(dev_handle_t dev_handle, off_t off, size_t size)
+{
+	void *bb_buf;
+
+	devcon_t *devcon = devcon_search(dev_handle);
+	if (!devcon)
+		return ENOENT;
+	if (devcon->bb_buf)
+		return EEXIST;
+	bb_buf = malloc(size);
+	if (!bb_buf)
+		return ENOMEM;
+	
 	off_t bufpos = 0;
 	size_t buflen = 0;
-	if (!block_read(dev_handle, &bufpos, &buflen, &bb_off,
-	    bb_buf, bb_size, bb_size)) {
-		block_fini(dev_handle);
+	if (!block_read(dev_handle, &bufpos, &buflen, &off,
+	    bb_buf, size, size)) {
+	    	free(bb_buf);
 		return EIO;	/* XXX real error code */
 	}
-	
+	devcon->bb_buf = bb_buf;
+	devcon->bb_off = off;
+	devcon->bb_size = size;
+
 	return EOK;
-}
-
-void block_fini(dev_handle_t dev_handle)
-{
-	devcon_t *devcon = devcon_search(dev_handle);
-	assert(devcon);
-	
-	devcon_remove(devcon);
-
-	free(devcon->bb_buf);
-	munmap(devcon->com_area, devcon->com_size);
-	ipc_hangup(devcon->dev_phone);
-
-	free(devcon);	
 }
 
Index: uspace/lib/libblock/libblock.h
===================================================================
--- uspace/lib/libblock/libblock.h	(revision 2953f9aa56ef5ff93cd64392ab549d5c7f473d49)
+++ uspace/lib/libblock/libblock.h	(revision 6284978581040c06c173f1990897a36fe2cd2cb2)
@@ -68,6 +68,8 @@
 } block_t;
 
-extern int block_init(dev_handle_t, size_t, off_t, size_t);
+extern int block_init(dev_handle_t, size_t);
 extern void block_fini(dev_handle_t);
+
+extern int block_bb_read(dev_handle_t, off_t, size_t);
 extern void *block_bb_get(dev_handle_t);
 
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision 2953f9aa56ef5ff93cd64392ab549d5c7f473d49)
+++ uspace/srv/fs/fat/fat_ops.c	(revision 6284978581040c06c173f1990897a36fe2cd2cb2)
@@ -435,7 +435,15 @@
 
 	/* initialize libblock */
-	rc = block_init(dev_handle, BS_SIZE, BS_BLOCK * BS_SIZE, BS_SIZE);
+	rc = block_init(dev_handle, BS_SIZE);
 	if (rc != EOK) {
-		ipc_answer_0(rid, 0);
+		ipc_answer_0(rid, rc);
+		return;
+	}
+
+	/* prepare the boot block */
+	rc = block_bb_read(dev_handle, BS_BLOCK * BS_SIZE, BS_SIZE);
+	if (rc != EOK) {
+		block_fini(dev_handle);
+		ipc_answer_0(rid, rc);
 		return;
 	}
Index: uspace/srv/fs/tmpfs/tmpfs_dump.c
===================================================================
--- uspace/srv/fs/tmpfs/tmpfs_dump.c	(revision 2953f9aa56ef5ff93cd64392ab549d5c7f473d49)
+++ uspace/srv/fs/tmpfs/tmpfs_dump.c	(revision 6284978581040c06c173f1990897a36fe2cd2cb2)
@@ -161,5 +161,5 @@
 	int rc;
 
-	rc = block_init(dev, TMPFS_BLOCK_SIZE, 0, 0);
+	rc = block_init(dev, TMPFS_BLOCK_SIZE);
 	if (rc != EOK)
 		return false; 
