Re: [PATCH] md/raid1: factor out common bio handling code

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

 



On Tue,  2 Aug 2011 16:22:52 +0900 Namhyung Kim <namhyung@xxxxxxxxx> wrote:

> When normal-write and sync-read/write bio completes, we should
> find out the disk number the bio belongs to. Factor those common
> code out to a separate function.
> 
> Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxx>

Applied, thanks.

I added another patch after it to remove the find_bio_disk from end_sync_read
and just use ->read_disk just like we do in raid1_end_read_request, as that
is always the right device to use.

Thanks,
NeilBrown


> ---
>  drivers/md/raid1.c |   44 ++++++++++++++++++++++++--------------------
>  1 files changed, 24 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> index d7518dc8593b..13109956edb9 100644
> --- a/drivers/md/raid1.c
> +++ b/drivers/md/raid1.c
> @@ -268,6 +268,24 @@ static inline void update_head_pos(int disk, r1bio_t *r1_bio)
>  		r1_bio->sector + (r1_bio->sectors);
>  }
>  
> +/*
> + * Find the disk number which triggered given bio
> + */
> +static int find_bio_disk(r1bio_t *r1_bio, struct bio *bio)
> +{
> +	int mirror;
> +	int raid_disks = r1_bio->mddev->raid_disks;
> +
> +	for (mirror = 0; mirror < raid_disks; mirror++)
> +		if (r1_bio->bios[mirror] == bio)
> +			break;
> +
> +	BUG_ON(mirror == raid_disks);
> +	update_head_pos(mirror, r1_bio);
> +
> +	return mirror;
> +}
> +
>  static void raid1_end_read_request(struct bio *bio, int error)
>  {
>  	int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
> @@ -361,10 +379,7 @@ static void raid1_end_write_request(struct bio *bio, int error)
>  	conf_t *conf = r1_bio->mddev->private;
>  	struct bio *to_put = NULL;
>  
> -
> -	for (mirror = 0; mirror < conf->raid_disks; mirror++)
> -		if (r1_bio->bios[mirror] == bio)
> -			break;
> +	mirror = find_bio_disk(r1_bio, bio);
>  
>  	/*
>  	 * 'one mirror IO has finished' event handler:
> @@ -400,8 +415,6 @@ static void raid1_end_write_request(struct bio *bio, int error)
>  		}
>  	}
>  
> -	update_head_pos(mirror, r1_bio);
> -
>  	if (behind) {
>  		if (test_bit(WriteMostly, &conf->mirrors[mirror].rdev->flags))
>  			atomic_dec(&r1_bio->behind_remaining);
> @@ -1341,13 +1354,10 @@ abort:
>  static void end_sync_read(struct bio *bio, int error)
>  {
>  	r1bio_t *r1_bio = bio->bi_private;
> -	int i;
>  
> -	for (i=r1_bio->mddev->raid_disks; i--; )
> -		if (r1_bio->bios[i] == bio)
> -			break;
> -	BUG_ON(i < 0);
> -	update_head_pos(i, r1_bio);
> +	/* this will call update_head_pos() */
> +	find_bio_disk(r1_bio, bio);
> +
>  	/*
>  	 * we have read a block, now it needs to be re-written,
>  	 * or re-read if the read failed.
> @@ -1366,16 +1376,12 @@ static void end_sync_write(struct bio *bio, int error)
>  	r1bio_t *r1_bio = bio->bi_private;
>  	mddev_t *mddev = r1_bio->mddev;
>  	conf_t *conf = mddev->private;
> -	int i;
>  	int mirror=0;
>  	sector_t first_bad;
>  	int bad_sectors;
>  
> -	for (i = 0; i < conf->raid_disks; i++)
> -		if (r1_bio->bios[i] == bio) {
> -			mirror = i;
> -			break;
> -		}
> +	mirror = find_bio_disk(r1_bio, bio);
> +
>  	if (!uptodate) {
>  		sector_t sync_blocks = 0;
>  		sector_t s = r1_bio->sector;
> @@ -1401,8 +1407,6 @@ static void end_sync_write(struct bio *bio, int error)
>  		)
>  		set_bit(R1BIO_MadeGood, &r1_bio->state);
>  
> -	update_head_pos(mirror, r1_bio);
> -
>  	if (atomic_dec_and_test(&r1_bio->remaining)) {
>  		int s = r1_bio->sectors;
>  		if (test_bit(R1BIO_MadeGood, &r1_bio->state) ||

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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