From: Andrew Morton Date: Mon, 29 Dec 2003 13:55:40 +0000 (-0800) Subject: [PATCH] dm: remove dynamic table resizing X-Git-Tag: v2.6.1-rc1~22^2~5 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=938e284b157cea808f24b1ed5009ee50b0794eb5;p=history.git [PATCH] dm: remove dynamic table resizing 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. --- diff --git a/drivers/md/dm-ioctl-v1.c b/drivers/md/dm-ioctl-v1.c index fed010cafc1d..ad78def0281e 100644 --- a/drivers/md/dm-ioctl-v1.c +++ b/drivers/md/dm-ioctl-v1.c @@ -566,7 +566,7 @@ static int create(struct dm_ioctl *param, struct dm_ioctl *user) 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 dm_ioctl *user) 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 --git a/drivers/md/dm-ioctl-v4.c b/drivers/md/dm-ioctl-v4.c index 64c7598e80f2..63658f25a9c6 100644 --- a/drivers/md/dm-ioctl-v4.c +++ b/drivers/md/dm-ioctl-v4.c @@ -872,7 +872,7 @@ static int table_load(struct dm_ioctl *param, size_t param_size) 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 --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 46eaee908b40..39f101b707e8 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -202,7 +202,7 @@ static int alloc_targets(struct dm_table *t, unsigned int num) 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 **result, int mode) 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; diff --git a/drivers/md/dm.h b/drivers/md/dm.h index d5deaf13fd80..761915521167 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h @@ -95,7 +95,7 @@ int dm_suspended(struct mapped_device *md); * 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);