For some reason dm_table_create() was allocating GFP_NOIO rather than GFP_KERNEL. --- diff/drivers/md/dm-table.c 2004-02-09 10:42:01.000000000 +0000 +++ source/drivers/md/dm-table.c 2004-02-09 10:42:49.000000000 +0000 @@ -205,7 +205,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;