For some reason dm_table_create() was allocating GFP_NOIO rather than GFP_KERNEL. --- diff/drivers/md/dm-table.c 2003-12-29 10:15:04.000000000 +0000 +++ source/drivers/md/dm-table.c 2004-01-02 10:08:55.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;