aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-06-16 05:15:21 -0400
committerIngo Molnar <mingo@elte.hu>2008-06-16 05:15:21 -0400
commitf9e8e07e074a880e110922759dcdb369fecdf07c (patch)
tree61bc9a61e0a0546a81d699047d9e001c50b52d50 /drivers/md
parente9886ca3a93d7d041d3de8e5acebe213da777d59 (diff)
parent066519068ad2fbe98c7f45552b1f592903a9c8c8 (diff)
Merge branch 'linus' into sched-devel
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/md.c2
-rw-r--r--drivers/md/raid5.c10
2 files changed, 10 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 51c19f86ff99..7cf512a34ccf 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -276,6 +276,7 @@ static mddev_t * mddev_find(dev_t unit)
276 atomic_set(&new->active, 1); 276 atomic_set(&new->active, 1);
277 spin_lock_init(&new->write_lock); 277 spin_lock_init(&new->write_lock);
278 init_waitqueue_head(&new->sb_wait); 278 init_waitqueue_head(&new->sb_wait);
279 init_waitqueue_head(&new->recovery_wait);
279 new->reshape_position = MaxSector; 280 new->reshape_position = MaxSector;
280 new->resync_max = MaxSector; 281 new->resync_max = MaxSector;
281 new->level = LEVEL_NONE; 282 new->level = LEVEL_NONE;
@@ -5665,7 +5666,6 @@ void md_do_sync(mddev_t *mddev)
5665 window/2,(unsigned long long) max_sectors/2); 5666 window/2,(unsigned long long) max_sectors/2);
5666 5667
5667 atomic_set(&mddev->recovery_active, 0); 5668 atomic_set(&mddev->recovery_active, 0);
5668 init_waitqueue_head(&mddev->recovery_wait);
5669 last_check = 0; 5669 last_check = 0;
5670 5670
5671 if (j>2) { 5671 if (j>2) {
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 425958a76b84..c37e256b1176 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -2002,6 +2002,7 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh,
2002 * have quiesced. 2002 * have quiesced.
2003 */ 2003 */
2004 if ((s->uptodate == disks - 1) && 2004 if ((s->uptodate == disks - 1) &&
2005 (s->failed && disk_idx == s->failed_num) &&
2005 !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) { 2006 !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) {
2006 set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); 2007 set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
2007 set_bit(R5_Wantcompute, &dev->flags); 2008 set_bit(R5_Wantcompute, &dev->flags);
@@ -2087,7 +2088,9 @@ static void handle_issuing_new_read_requests6(struct stripe_head *sh,
2087 /* we would like to get this block, possibly 2088 /* we would like to get this block, possibly
2088 * by computing it, but we might not be able to 2089 * by computing it, but we might not be able to
2089 */ 2090 */
2090 if (s->uptodate == disks-1) { 2091 if ((s->uptodate == disks - 1) &&
2092 (s->failed && (i == r6s->failed_num[0] ||
2093 i == r6s->failed_num[1]))) {
2091 pr_debug("Computing stripe %llu block %d\n", 2094 pr_debug("Computing stripe %llu block %d\n",
2092 (unsigned long long)sh->sector, i); 2095 (unsigned long long)sh->sector, i);
2093 compute_block_1(sh, i, 0); 2096 compute_block_1(sh, i, 0);
@@ -2645,6 +2648,7 @@ static void handle_stripe5(struct stripe_head *sh)
2645 struct r5dev *dev; 2648 struct r5dev *dev;
2646 unsigned long pending = 0; 2649 unsigned long pending = 0;
2647 mdk_rdev_t *blocked_rdev = NULL; 2650 mdk_rdev_t *blocked_rdev = NULL;
2651 int prexor;
2648 2652
2649 memset(&s, 0, sizeof(s)); 2653 memset(&s, 0, sizeof(s));
2650 pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d " 2654 pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d "
@@ -2774,9 +2778,11 @@ static void handle_stripe5(struct stripe_head *sh)
2774 /* leave prexor set until postxor is done, allows us to distinguish 2778 /* leave prexor set until postxor is done, allows us to distinguish
2775 * a rmw from a rcw during biodrain 2779 * a rmw from a rcw during biodrain
2776 */ 2780 */
2781 prexor = 0;
2777 if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) && 2782 if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) &&
2778 test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) { 2783 test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) {
2779 2784
2785 prexor = 1;
2780 clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete); 2786 clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete);
2781 clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack); 2787 clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack);
2782 clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending); 2788 clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending);
@@ -2810,6 +2816,8 @@ static void handle_stripe5(struct stripe_head *sh)
2810 if (!test_and_set_bit( 2816 if (!test_and_set_bit(
2811 STRIPE_OP_IO, &sh->ops.pending)) 2817 STRIPE_OP_IO, &sh->ops.pending))
2812 sh->ops.count++; 2818 sh->ops.count++;
2819 if (prexor)
2820 continue;
2813 if (!test_bit(R5_Insync, &dev->flags) || 2821 if (!test_bit(R5_Insync, &dev->flags) ||
2814 (i == sh->pd_idx && s.failed == 0)) 2822 (i == sh->pd_idx && s.failed == 0))
2815 set_bit(STRIPE_INSYNC, &sh->state); 2823 set_bit(STRIPE_INSYNC, &sh->state);