From: Mikulas Patocka Move array_too_big to include/linux/device-mapper.h because it is used by targets. Remove the test from dm-raid1 as the number of mirror legs is limited such that it can never fail. (Even for stripes it seems rather unlikely.) Signed-off-by: Mikulas Patocka Signed-off-by: Alasdair G Kergon --- drivers/md/dm-raid1.c | 3 --- drivers/md/dm-stripe.c | 4 ++-- drivers/md/dm.h | 9 --------- include/linux/device-mapper.h | 3 +++ 4 files changed, 5 insertions(+), 14 deletions(-) Index: linux-2.6.27/drivers/md/dm-raid1.c =================================================================== --- linux-2.6.27.orig/drivers/md/dm-raid1.c 2008-10-21 17:32:24.000000000 +0100 +++ linux-2.6.27/drivers/md/dm-raid1.c 2008-10-21 17:33:44.000000000 +0100 @@ -1315,9 +1315,6 @@ static struct mirror_set *alloc_context( size_t len; struct mirror_set *ms = NULL; - if (array_too_big(sizeof(*ms), sizeof(ms->mirror[0]), nr_mirrors)) - return NULL; - len = sizeof(*ms) + (sizeof(ms->mirror[0]) * nr_mirrors); ms = kzalloc(len, GFP_KERNEL); Index: linux-2.6.27/drivers/md/dm-stripe.c =================================================================== --- linux-2.6.27.orig/drivers/md/dm-stripe.c 2008-10-21 17:32:24.000000000 +0100 +++ linux-2.6.27/drivers/md/dm-stripe.c 2008-10-21 17:33:44.000000000 +0100 @@ -60,8 +60,8 @@ static inline struct stripe_c *alloc_con { size_t len; - if (array_too_big(sizeof(struct stripe_c), sizeof(struct stripe), - stripes)) + if (dm_array_too_big(sizeof(struct stripe_c), sizeof(struct stripe), + stripes)) return NULL; len = sizeof(struct stripe_c) + (sizeof(struct stripe) * stripes); Index: linux-2.6.27/drivers/md/dm.h =================================================================== --- linux-2.6.27.orig/drivers/md/dm.h 2008-10-21 17:32:24.000000000 +0100 +++ linux-2.6.27/drivers/md/dm.h 2008-10-21 17:33:44.000000000 +0100 @@ -62,15 +62,6 @@ void dm_put_target_type(struct target_ty int dm_target_iterate(void (*iter_func)(struct target_type *tt, void *param), void *param); -/*----------------------------------------------------------------- - * Useful inlines. - *---------------------------------------------------------------*/ -static inline int array_too_big(unsigned long fixed, unsigned long obj, - unsigned long num) -{ - return (num > (ULONG_MAX - fixed) / obj); -} - int dm_split_args(int *argc, char ***argvp, char *input); /* Index: linux-2.6.27/include/linux/device-mapper.h =================================================================== --- linux-2.6.27.orig/include/linux/device-mapper.h 2008-10-21 17:32:42.000000000 +0100 +++ linux-2.6.27/include/linux/device-mapper.h 2008-10-21 17:33:44.000000000 +0100 @@ -354,6 +354,9 @@ void *dm_vcalloc(unsigned long nmemb, un */ #define dm_round_up(n, sz) (dm_div_up((n), (sz)) * (sz)) +#define dm_array_too_big(fixed, obj, num) \ + ((num) > (UINT_MAX - (fixed)) / (obj)) + static inline sector_t to_sector(unsigned long n) { return (n >> SECTOR_SHIFT);