From: Greg Kroah-Hartman Date: Wed, 21 Apr 2010 20:02:30 +0000 (-0700) Subject: .32 patche X-Git-Tag: v2.6.32.12~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=845458f1ea35a66e7ef8f4fb1d1818d82eb76336;p=thirdparty%2Fkernel%2Fstable-queue.git .32 patche --- diff --git a/queue-2.6.32/md-raid5-allow-for-more-than-2-31-chunks.patch b/queue-2.6.32/md-raid5-allow-for-more-than-2-31-chunks.patch new file mode 100644 index 00000000000..f8b37ba34ae --- /dev/null +++ b/queue-2.6.32/md-raid5-allow-for-more-than-2-31-chunks.patch @@ -0,0 +1,80 @@ +From 35f2a591192d0a5d9f7fc696869c76f0b8e49c3d Mon Sep 17 00:00:00 2001 +From: NeilBrown +Date: Tue, 20 Apr 2010 14:13:34 +1000 +Subject: md/raid5: allow for more than 2^31 chunks. + +From: NeilBrown + +commit 35f2a591192d0a5d9f7fc696869c76f0b8e49c3d upstream. + +With many large drives and small chunk sizes it is possible +to create a RAID5 with more than 2^31 chunks. Make sure this +works. + +Reported-by: Brett King +Signed-off-by: NeilBrown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/md/raid5.c | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +--- a/drivers/md/raid5.c ++++ b/drivers/md/raid5.c +@@ -1649,8 +1649,8 @@ static sector_t raid5_compute_sector(rai + int previous, int *dd_idx, + struct stripe_head *sh) + { +- long stripe; +- unsigned long chunk_number; ++ sector_t stripe; ++ sector_t chunk_number; + unsigned int chunk_offset; + int pd_idx, qd_idx; + int ddf_layout = 0; +@@ -1670,17 +1670,12 @@ static sector_t raid5_compute_sector(rai + */ + chunk_offset = sector_div(r_sector, sectors_per_chunk); + chunk_number = r_sector; +- BUG_ON(r_sector != chunk_number); + + /* + * Compute the stripe number + */ +- stripe = chunk_number / data_disks; +- +- /* +- * Compute the data disk and parity disk indexes inside the stripe +- */ +- *dd_idx = chunk_number % data_disks; ++ stripe = chunk_number; ++ *dd_idx = sector_div(stripe, data_disks); + + /* + * Select the parity disk based on the user selected algorithm. +@@ -1869,14 +1864,14 @@ static sector_t compute_blocknr(struct s + : conf->algorithm; + sector_t stripe; + int chunk_offset; +- int chunk_number, dummy1, dd_idx = i; ++ sector_t chunk_number; ++ int dummy1, dd_idx = i; + sector_t r_sector; + struct stripe_head sh2; + + + chunk_offset = sector_div(new_sector, sectors_per_chunk); + stripe = new_sector; +- BUG_ON(new_sector != stripe); + + if (i == sh->pd_idx) + return 0; +@@ -1969,7 +1964,7 @@ static sector_t compute_blocknr(struct s + } + + chunk_number = stripe * data_disks + i; +- r_sector = (sector_t)chunk_number * sectors_per_chunk + chunk_offset; ++ r_sector = chunk_number * sectors_per_chunk + chunk_offset; + + check = raid5_compute_sector(conf, r_sector, + previous, &dummy1, &sh2); diff --git a/queue-2.6.32/series b/queue-2.6.32/series index 3ff5d438f5f..e2677fcaf3c 100644 --- a/queue-2.6.32/series +++ b/queue-2.6.32/series @@ -163,3 +163,4 @@ r8169-offical-fix-for-cve-2009-4537-overlength-frame-dmas.patch tcp-fix-icmp-rto-war.patch perf_events-x86-implement-intel-westmere-nehalem-ex-support.patch acpi-ec-allow-multibyte-access-to-ec.patch +md-raid5-allow-for-more-than-2-31-chunks.patch