From: Mikulas Patocka <[email-masked]>

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 <[email-masked]>
Signed-off-by: Alasdair G Kergon <[email-masked]>

---
 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);