Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision adb49f58f0f19858bac40da225e2394606a6d356)
+++ uspace/app/init/init.c	(revision 95bc57cf68d3313bd1ab4ae930757d5fa26a00e5)
@@ -137,4 +137,34 @@
 }
 
+static void srv_start(char *fname)
+{
+	char *argv[2];
+	task_id_t id;
+	task_exit_t texit;
+	int rc, retval;
+	
+	printf(NAME ": Starting %s\n", fname);
+	
+	argv[0] = fname;
+	argv[1] = NULL;
+	
+	id = task_spawn(fname, argv);
+	if (!id) {
+		printf(NAME ": Error spawning %s\n", fname);
+		return;
+	}
+
+	rc = task_wait(id, &texit, &retval);
+	if (rc != EOK) {
+		printf(NAME ": Error waiting for %s\n", fname);
+		return;
+	}
+
+	if (texit != TASK_EXIT_NORMAL || retval != 0) {
+		printf(NAME ": Server %s failed to start (returned %d)\n",
+			fname, retval);
+	}
+}
+
 static void getvc(char *dev, char *app)
 {
@@ -198,8 +228,12 @@
 	spawn("/srv/fhc");
 	spawn("/srv/obio");
-	spawn("/srv/ata_bd");
-	spawn("/srv/gxe_bd");
-	
-	usleep(250000); // FIXME
+
+	/*
+	 * Start these synchronously so that mount_data() can be
+	 * non-blocking.
+	 */
+	srv_start("/srv/ata_bd");
+	srv_start("/srv/gxe_bd");
+	
 	mount_data();
 	
Index: uspace/srv/bd/ata_bd/ata_bd.c
===================================================================
--- uspace/srv/bd/ata_bd/ata_bd.c	(revision adb49f58f0f19858bac40da225e2394606a6d356)
+++ uspace/srv/bd/ata_bd/ata_bd.c	(revision 95bc57cf68d3313bd1ab4ae930757d5fa26a00e5)
@@ -55,4 +55,5 @@
 #include <errno.h>
 #include <bool.h>
+#include <task.h>
 
 #include "ata_bd.h"
@@ -136,4 +137,5 @@
 
 	printf(NAME ": Accepting connections\n");
+	task_retval(0);
 	async_manager();
 
Index: uspace/srv/bd/file_bd/file_bd.c
===================================================================
--- uspace/srv/bd/file_bd/file_bd.c	(revision adb49f58f0f19858bac40da225e2394606a6d356)
+++ uspace/srv/bd/file_bd/file_bd.c	(revision 95bc57cf68d3313bd1ab4ae930757d5fa26a00e5)
@@ -50,4 +50,5 @@
 #include <errno.h>
 #include <bool.h>
+#include <task.h>
 
 #define NAME "file_bd"
@@ -87,4 +88,5 @@
 
 	printf(NAME ": Accepting connections\n");
+	task_retval(0);
 	async_manager();
 
Index: uspace/srv/bd/gxe_bd/gxe_bd.c
===================================================================
--- uspace/srv/bd/gxe_bd/gxe_bd.c	(revision adb49f58f0f19858bac40da225e2394606a6d356)
+++ uspace/srv/bd/gxe_bd/gxe_bd.c	(revision 95bc57cf68d3313bd1ab4ae930757d5fa26a00e5)
@@ -47,4 +47,5 @@
 #include <sys/types.h>
 #include <errno.h>
+#include <task.h>
 
 #define NAME "gxe_bd"
@@ -111,4 +112,5 @@
 
 	printf(NAME ": Accepting connections\n");
+	task_retval(0);
 	async_manager();
 
