Re: [PATCH 3/4] md: Don't do normal-write on unresync area of replacement-disk.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 28 Feb 2013 15:50:37 +0800 majianpeng <majianpeng@xxxxxxxxx> wrote:

> Replacement is a fullsync which don't depent on bitmap.So regardless of
> the presence and absence of bitmap, it do full resync.
> If offset of normal io is larger than offset of resync,it will write
> again when resync arrived this offset.

This might be OK for RAID1 and RAID10 as recover is paused when writes
happen, but that is not the case for RAID5, so it isn't safe to test against
curr_resync - it gets updated a bit too later.

Also you messed up the formatting in raid10.c

I'm not convinced this optimisation is really worth it.

NeilBrown


> 
> Signed-off-by: Jianpeng Ma <majianpeng@xxxxxxxxx>
> ---
>  drivers/md/raid1.c  |    4 +++-
>  drivers/md/raid10.c |    4 +++-
>  drivers/md/raid5.c  |    3 ++-
>  3 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> index d5bddfc..142a5fa 100644
> --- a/drivers/md/raid1.c
> +++ b/drivers/md/raid1.c
> @@ -1173,7 +1173,9 @@ read_again:
>  				set_bit(R1BIO_Degraded, &r1_bio->state);
>  			continue;
>  		}
> -
> +		if (test_bit(Replacement, &rdev->flags) &&
> +			conf->mddev->curr_resync < r1_bio->sector)
> +			continue;
>  		atomic_inc(&rdev->nr_pending);
>  		if (test_bit(WriteErrorSeen, &rdev->flags)) {
>  			sector_t first_bad;
> diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
> index 64d4824..bb11cfb 100644
> --- a/drivers/md/raid10.c
> +++ b/drivers/md/raid10.c
> @@ -1337,7 +1337,9 @@ retry_write:
>  			     || test_bit(Unmerged, &rdev->flags)))
>  			rdev = NULL;
>  		if (rrdev && (test_bit(Faulty, &rrdev->flags)
> -			      || test_bit(Unmerged, &rrdev->flags)))
> +			|| test_bit(Unmerged, &rrdev->flags) || 
> +			(test_bit(Replacement, &rrdev->flags) &&
> +			conf->mddev->curr_resync < r10_bio->sector)))
>  			rrdev = NULL;
>  
>  		r10_bio->devs[i].bio = NULL;
> diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
> index bd49623..e0a2a39 100644
> --- a/drivers/md/raid5.c
> +++ b/drivers/md/raid5.c
> @@ -602,7 +602,8 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
>  			rdev = NULL;
>  		if (rdev)
>  			atomic_inc(&rdev->nr_pending);
> -		if (rrdev && test_bit(Faulty, &rrdev->flags))
> +		if (rrdev && (test_bit(Faulty, &rrdev->flags) ||
> +			conf->mddev->curr_resync < sh->sector))
>  			rrdev = NULL;
>  		if (rrdev)
>  			atomic_inc(&rrdev->nr_pending);

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux