Index: uspace/srv/bd/ata_bd/ata_bd.c
===================================================================
--- uspace/srv/bd/ata_bd/ata_bd.c	(revision ac47b7c2b6e75a9b9aa60b443fca9a151cf89e5c)
+++ uspace/srv/bd/ata_bd/ata_bd.c	(revision 12956e5768a7adf60aa5e6cc0a70a87007f8ccd4)
@@ -38,4 +38,7 @@
  * Currently based on the (now obsolete) ANSI X3.221-1994 (ATA-1) standard.
  * At this point only reading is possible, not writing.
+ *
+ * The driver services a single controller which can have up to two disks
+ * attached.
  */
 
@@ -47,5 +50,5 @@
 #include <async.h>
 #include <as.h>
-#include <futex.h>
+#include <fibril_sync.h>
 #include <devmap.h>
 #include <sys/types.h>
@@ -65,8 +68,5 @@
 static ata_ctl_t *ctl;
 
-static dev_handle_t dev_handle[MAX_DISKS];
-
-static atomic_t dev_futex = FUTEX_INITIALIZER;
-
+/** Per-disk state. */
 static disk_t disk[MAX_DISKS];
 
@@ -90,6 +90,5 @@
 	printf(NAME ": ATA disk driver\n");
 
-	printf("cmd_physical = 0x%x\n", cmd_physical);
-	printf("ctl_physical = 0x%x\n", ctl_physical);
+	printf("I/O address 0x%x\n", cmd_physical);
 
 	if (ata_bd_init() != EOK)
@@ -121,5 +120,5 @@
 
 		snprintf(name, 16, "disk%d", i);
-		rc = devmap_device_register(name, &dev_handle[i]);
+		rc = devmap_device_register(name, &disk[i].dev_handle);
 		if (rc != EOK) {
 			devmap_hangup_phone(DEVMAP_DRIVER);
@@ -182,6 +181,4 @@
 	}
 
-	printf("\n\nStatus = 0x%x\n", pio_read_8(&cmd->status));
-
 	d->blocks = d->cylinders * d->heads * d->sectors;
 
@@ -190,4 +187,5 @@
 
 	d->present = true;
+	fibril_mutex_initialize(&d->lock);
 
 	return EOK;
@@ -244,5 +242,5 @@
 	disk_id = -1;
 	for (i = 0; i < MAX_DISKS; i++)
-		if (dev_handle[i] == dh)
+		if (disk[i].dev_handle == dh)
 			disk_id = i;
 
@@ -356,5 +354,5 @@
 	    (h & 0x0f);
 
-	futex_down(&dev_futex);
+	fibril_mutex_lock(&d->lock);
 
 	/* Program a Read Sectors operation. */
@@ -378,5 +376,5 @@
 	}
 
-	futex_up(&dev_futex);
+	fibril_mutex_unlock(&d->lock);
 	return EOK;
 }
@@ -410,5 +408,5 @@
 	    (h & 0x0f);
 
-	futex_down(&dev_futex);
+	fibril_mutex_lock(&d->lock);
 
 	/* Program a Read Sectors operation. */
@@ -431,5 +429,5 @@
 	}
 
-	futex_up(&dev_futex);
+	fibril_mutex_unlock(&d->lock);
 	return EOK;
 }
Index: uspace/srv/bd/ata_bd/ata_bd.h
===================================================================
--- uspace/srv/bd/ata_bd/ata_bd.h	(revision ac47b7c2b6e75a9b9aa60b443fca9a151cf89e5c)
+++ uspace/srv/bd/ata_bd/ata_bd.h	(revision 12956e5768a7adf60aa5e6cc0a70a87007f8ccd4)
@@ -37,4 +37,5 @@
 
 #include <sys/types.h>
+#include <fibril_sync.h>
 
 enum {
@@ -140,4 +141,7 @@
 	unsigned sectors;
 	uint64_t blocks;
+
+	fibril_mutex_t lock;
+	dev_handle_t dev_handle;
 } disk_t;
 
Index: uspace/srv/bd/file_bd/file_bd.c
===================================================================
--- uspace/srv/bd/file_bd/file_bd.c	(revision ac47b7c2b6e75a9b9aa60b443fca9a151cf89e5c)
+++ uspace/srv/bd/file_bd/file_bd.c	(revision 12956e5768a7adf60aa5e6cc0a70a87007f8ccd4)
@@ -45,5 +45,5 @@
 #include <async.h>
 #include <as.h>
-#include <futex.h>
+#include <fibril_sync.h>
 #include <devmap.h>
 #include <sys/types.h>
@@ -57,5 +57,5 @@
 
 static dev_handle_t dev_handle;
-static atomic_t dev_futex = FUTEX_INITIALIZER;
+static fibril_mutex_t dev_lock;
 
 static int file_bd_init(const char *fname);
@@ -106,4 +106,6 @@
 	if (img == NULL)
 		return EINVAL;
+
+	fibril_mutex_initialize(&dev_lock);
 
 	return EOK;
@@ -170,21 +172,15 @@
 	size_t n_rd;
 
-	printf("file_bd_read\n");
-	futex_down(&dev_futex);
-
-	printf("seek\n");
+	fibril_mutex_lock(&dev_lock);
+
 	fseek(img, blk_idx * size, SEEK_SET);
-	printf("read\n");
 	n_rd = fread(buf, 1, size, img);
-	printf("done\n");
-
-	printf("done\n");
 
 	if (ferror(img)) {
-		futex_up(&dev_futex);
+		fibril_mutex_unlock(&dev_lock);
 		return EIO;	/* Read error */
 	}
 
-	futex_up(&dev_futex);
+	fibril_mutex_unlock(&dev_lock);
 
 	if (n_rd < size) 
@@ -198,5 +194,5 @@
 	size_t n_wr;
 
-	futex_down(&dev_futex);
+	fibril_mutex_lock(&dev_lock);
 
 	fseek(img, blk_idx * size, SEEK_SET);
@@ -204,9 +200,9 @@
 
 	if (ferror(img) || n_wr < size) {
-		futex_up(&dev_futex);
+		fibril_mutex_unlock(&dev_lock);
 		return EIO;	/* Write error */
 	}
 
-	futex_up(&dev_futex);
+	fibril_mutex_unlock(&dev_lock);
 
 	return EOK;
Index: uspace/srv/bd/gxe_bd/gxe_bd.c
===================================================================
--- uspace/srv/bd/gxe_bd/gxe_bd.c	(revision ac47b7c2b6e75a9b9aa60b443fca9a151cf89e5c)
+++ uspace/srv/bd/gxe_bd/gxe_bd.c	(revision 12956e5768a7adf60aa5e6cc0a70a87007f8ccd4)
@@ -43,5 +43,5 @@
 #include <async.h>
 #include <as.h>
-#include <futex.h>
+#include <fibril_sync.h>
 #include <devmap.h>
 #include <sys/types.h>
@@ -92,5 +92,5 @@
 static dev_handle_t dev_handle[MAX_DISKS];
 
-static atomic_t dev_futex = FUTEX_INITIALIZER;
+static fibril_mutex_t dev_lock[MAX_DISKS];
 
 static int gxe_bd_init(void);
@@ -146,4 +146,5 @@
 			return rc;
 		}
+		fibril_mutex_initialize(&dev_lock[i]);
 	}
 
@@ -257,5 +258,5 @@
 	uint32_t w;
 
-	futex_down(&dev_futex);
+	fibril_mutex_lock(&dev_lock[disk_id]);
 	pio_write_32(&dev->offset_lo, (uint32_t) offset);
 	pio_write_32(&dev->offset_hi, offset >> 32);
@@ -265,4 +266,5 @@
 	status = pio_read_32(&dev->status);
 	if (status == STATUS_FAILURE) {
+		fibril_mutex_unlock(&dev_lock[disk_id]);
 		return EIO;
 	}
@@ -272,5 +274,5 @@
 	}
 
-	futex_up(&dev_futex);
+	fibril_mutex_unlock(&dev_lock[disk_id]);
 	return EOK;
 }
@@ -286,5 +288,5 @@
 	}
 
-	futex_down(&dev_futex);
+	fibril_mutex_lock(&dev_lock[disk_id]);
 	pio_write_32(&dev->offset_lo, (uint32_t) offset);
 	pio_write_32(&dev->offset_hi, offset >> 32);
@@ -294,8 +296,9 @@
 	status = pio_read_32(&dev->status);
 	if (status == STATUS_FAILURE) {
+		fibril_mutex_unlock(&dev_lock[disk_id]);
 		return EIO;
 	}
 
-	futex_up(&dev_futex);
+	fibril_mutex_unlock(&dev_lock[disk_id]);
 	return EOK;
 }
