Index: uspace/srv/bd/hr/fge.c
===================================================================
--- uspace/srv/bd/hr/fge.c	(revision b22ea202107f450b2d752b06f3f2c48c9baff729)
+++ uspace/srv/bd/hr/fge.c	(revision 9d1685b9d20320c0d757562d21216a101ea960c6)
@@ -327,6 +327,6 @@
 			fibril_mutex_lock(&group->lock);
 			group->finished_fail++;
-			if (rc == ENOMEM)
-				group->final_errno = ENOMEM;
+			if (rc == EAGAIN)
+				group->final_errno = EAGAIN;
 			fibril_mutex_unlock(&group->lock);
 		}
Index: uspace/srv/bd/hr/io.c
===================================================================
--- uspace/srv/bd/hr/io.c	(revision b22ea202107f450b2d752b06f3f2c48c9baff729)
+++ uspace/srv/bd/hr/io.c	(revision 9d1685b9d20320c0d757562d21216a101ea960c6)
@@ -46,4 +46,45 @@
 
 static errno_t exec_io_op(hr_io_t *);
+
+/** Wrapper for block_write_direct(), never returns ENOMEM */
+errno_t hr_write_direct(service_id_t service_id, uint64_t ba, size_t cnt,
+    const void *data)
+{
+	errno_t rc;
+	while ((rc = block_write_direct(service_id, ba, cnt, data)) == ENOMEM)
+		fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
+
+	if (rc == EAGAIN)
+		rc = EIO;
+
+	return rc;
+}
+
+/** Wrapper for block_read_direct(), never returns ENOMEM */
+errno_t hr_read_direct(service_id_t service_id, uint64_t ba, size_t cnt,
+    void *data)
+{
+	errno_t rc;
+	while ((rc = block_read_direct(service_id, ba, cnt, data)) == ENOMEM)
+		fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
+
+	if (rc == EAGAIN)
+		rc = EIO;
+
+	return rc;
+}
+
+/** Wrapper for block_sync_cache(), never returns ENOMEM */
+errno_t hr_sync_cache(service_id_t service_id, uint64_t ba, size_t cnt)
+{
+	errno_t rc;
+	while ((rc = block_sync_cache(service_id, ba, cnt)) == ENOMEM)
+		fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
+
+	if (rc == EAGAIN)
+		rc = EIO;
+
+	return rc;
+}
 
 errno_t hr_io_worker(void *arg)
Index: uspace/srv/bd/hr/io.h
===================================================================
--- uspace/srv/bd/hr/io.h	(revision b22ea202107f450b2d752b06f3f2c48c9baff729)
+++ uspace/srv/bd/hr/io.h	(revision 9d1685b9d20320c0d757562d21216a101ea960c6)
@@ -52,4 +52,8 @@
 errno_t hr_io_worker_basic(void *);
 
+extern errno_t hr_write_direct(service_id_t, uint64_t, size_t, const void *);
+extern errno_t hr_read_direct(service_id_t, uint64_t, size_t, void *);
+extern errno_t hr_sync_cache(service_id_t, uint64_t, size_t);
+
 #endif
 
