For some reason dm_table_create() was allocating GFP_NOIO rather than
GFP_KERNEL.
--- diff/drivers/md/dm-table.c	2003-11-05 17:13:04.000000000 +0000
+++ source/drivers/md/dm-table.c	2003-11-19 13:54:11.000000000 +0000
@@ -114,7 +114,7 @@
 
 int dm_table_create(struct dm_table **result, int mode, unsigned num_targets)
 {
-	struct dm_table *t = kmalloc(sizeof(*t), GFP_NOIO);
+	struct dm_table *t = kmalloc(sizeof(*t), GFP_KERNEL);
 
 	if (!t)
 		return -ENOMEM;