Index: uspace/srv/bd/hr/util.c
===================================================================
--- uspace/srv/bd/hr/util.c	(revision 234212a2cb8e6d38d313b28851c69c84ff5486bd)
+++ uspace/srv/bd/hr/util.c	(revision f0950d25ca930150730465e65799981bceeddc0b)
@@ -76,4 +76,28 @@
 extern fibril_rwlock_t hr_volumes_lock;
 
+/*
+ * malloc() wrapper that behaves like
+ * FreeBSD malloc(9) with M_WAITOK flag.
+ *
+ * Return value is never NULL.
+ */
+void *malloc_waitok(size_t size)
+{
+	void *ret;
+	while ((ret = malloc(size)) == NULL)
+		fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
+
+	return ret;
+}
+
+void *calloc_waitok(size_t nmemb, size_t size)
+{
+	void *ret;
+	while ((ret = calloc(nmemb, size)) == NULL)
+		fibril_usleep(MSEC2USEC(250)); /* sleep 250ms */
+
+	return ret;
+}
+
 errno_t hr_create_vol_struct(hr_volume_t **rvol, hr_level_t level,
     const char *devname, hr_metadata_type_t metadata_type)
Index: uspace/srv/bd/hr/util.h
===================================================================
--- uspace/srv/bd/hr/util.h	(revision 234212a2cb8e6d38d313b28851c69c84ff5486bd)
+++ uspace/srv/bd/hr/util.h	(revision f0950d25ca930150730465e65799981bceeddc0b)
@@ -77,4 +77,10 @@
 } hr_range_lock_t;
 
+extern void *malloc_waitok(size_t)
+    __attribute__((malloc));
+
+extern void *calloc_waitok(size_t, size_t)
+    __attribute__((malloc));
+
 extern errno_t hr_create_vol_struct(hr_volume_t **, hr_level_t, const char *,
     hr_metadata_type_t);
