From: Joe Thornber The dm table size is always known in advance, so we can specify it in dm_table_create(), rather than relying on dynamic resizing. 25-akpm/drivers/md/dm-ioctl-v1.c | 4 ++-- 25-akpm/drivers/md/dm-ioctl-v4.c | 2 +- 25-akpm/drivers/md/dm-table.c | 10 +++++++--- 25-akpm/drivers/md/dm.h | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff -puN drivers/md/dm.h~dm-2-remove-dynamic-table-resizing drivers/md/dm.h --- 25/drivers/md/dm.h~dm-2-remove-dynamic-table-resizing Tue Nov 25 12:53:44 2003 +++ 25-akpm/drivers/md/dm.h Tue Nov 25 12:53:44 2003 @@ -95,7 +95,7 @@ int dm_suspended(struct mapped_device *m * Functions for manipulating a table. Tables are also reference * counted. *---------------------------------------------------------------*/ -int dm_table_create(struct dm_table **result, int mode); +int dm_table_create(struct dm_table **result, int mode, unsigned num_targets); void dm_table_get(struct dm_table *t); void dm_table_put(struct dm_table *t); diff -puN drivers/md/dm-ioctl-v1.c~dm-2-remove-dynamic-table-resizing drivers/md/dm-ioctl-v1.c --- 25/drivers/md/dm-ioctl-v1.c~dm-2-remove-dynamic-table-resizing Tue Nov 25 12:53:44 2003 +++ 25-akpm/drivers/md/dm-ioctl-v1.c Tue Nov 25 12:53:44 2003 @@ -566,7 +566,7 @@ static int create(struct dm_ioctl *param if (r) return r; - r = dm_table_create(&t, get_mode(param)); + r = dm_table_create(&t, get_mode(param), param->target_count); if (r) return r; @@ -894,7 +894,7 @@ static int reload(struct dm_ioctl *param struct mapped_device *md; struct dm_table *t; - r = dm_table_create(&t, get_mode(param)); + r = dm_table_create(&t, get_mode(param), param->target_count); if (r) return r; diff -puN drivers/md/dm-ioctl-v4.c~dm-2-remove-dynamic-table-resizing drivers/md/dm-ioctl-v4.c --- 25/drivers/md/dm-ioctl-v4.c~dm-2-remove-dynamic-table-resizing Tue Nov 25 12:53:44 2003 +++ 25-akpm/drivers/md/dm-ioctl-v4.c Tue Nov 25 12:53:44 2003 @@ -872,7 +872,7 @@ static int table_load(struct dm_ioctl *p struct hash_cell *hc; struct dm_table *t; - r = dm_table_create(&t, get_mode(param)); + r = dm_table_create(&t, get_mode(param), param->target_count); if (r) return r; diff -puN drivers/md/dm-table.c~dm-2-remove-dynamic-table-resizing drivers/md/dm-table.c --- 25/drivers/md/dm-table.c~dm-2-remove-dynamic-table-resizing Tue Nov 25 12:53:44 2003 +++ 25-akpm/drivers/md/dm-table.c Tue Nov 25 12:53:44 2003 @@ -202,7 +202,7 @@ static int alloc_targets(struct dm_table return 0; } -int dm_table_create(struct dm_table **result, int mode) +int dm_table_create(struct dm_table **result, int mode, unsigned num_targets) { struct dm_table *t = kmalloc(sizeof(*t), GFP_NOIO); @@ -213,8 +213,12 @@ int dm_table_create(struct dm_table **re INIT_LIST_HEAD(&t->devices); atomic_set(&t->holders, 1); - /* allocate a single nodes worth of targets to begin with */ - if (alloc_targets(t, KEYS_PER_NODE)) { + if (!num_targets) + num_targets = KEYS_PER_NODE; + + num_targets = dm_round_up(num_targets, KEYS_PER_NODE); + + if (alloc_targets(t, num_targets)) { kfree(t); t = NULL; return -ENOMEM; _