diff options
Diffstat (limited to 'drivers/md/raid5.c')
| -rw-r--r-- | drivers/md/raid5.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index adda94df5eb..0689173fd9f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -393,6 +393,8 @@ static int calc_degraded(struct r5conf *conf)  	degraded = 0;  	for (i = 0; i < conf->previous_raid_disks; i++) {  		struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); +		if (rdev && test_bit(Faulty, &rdev->flags)) +			rdev = rcu_dereference(conf->disks[i].replacement);  		if (!rdev || test_bit(Faulty, &rdev->flags))  			degraded++;  		else if (test_bit(In_sync, &rdev->flags)) @@ -417,6 +419,8 @@ static int calc_degraded(struct r5conf *conf)  	degraded2 = 0;  	for (i = 0; i < conf->raid_disks; i++) {  		struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); +		if (rdev && test_bit(Faulty, &rdev->flags)) +			rdev = rcu_dereference(conf->disks[i].replacement);  		if (!rdev || test_bit(Faulty, &rdev->flags))  			degraded2++;  		else if (test_bit(In_sync, &rdev->flags)) @@ -1587,6 +1591,7 @@ static int resize_stripes(struct r5conf *conf, int newsize)  		#ifdef CONFIG_MULTICORE_RAID456  		init_waitqueue_head(&nsh->ops.wait_for_ops);  		#endif +		spin_lock_init(&nsh->stripe_lock);  		list_add(&nsh->lru, &newstripes);  	} @@ -4192,7 +4197,7 @@ static void make_request(struct mddev *mddev, struct bio * bi)  			finish_wait(&conf->wait_for_overlap, &w);  			set_bit(STRIPE_HANDLE, &sh->state);  			clear_bit(STRIPE_DELAYED, &sh->state); -			if ((bi->bi_rw & REQ_NOIDLE) && +			if ((bi->bi_rw & REQ_SYNC) &&  			    !test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))  				atomic_inc(&conf->preread_active_stripes);  			release_stripe_plug(mddev, sh);  |