From: NeilBrown <neilb@suse.de>
To: Namhyung Kim <namhyung@gmail.com>
Cc: linux-raid@vger.kernel.org
Subject: Re: [PATCH] md/raid1: factor out common bio handling code
Date: Wed, 3 Aug 2011 14:15:42 +1000 [thread overview]
Message-ID: <20110803141542.2eea6525@notabene.brown> (raw)
In-Reply-To: <1312269772-7605-1-git-send-email-namhyung@gmail.com>
On Tue, 2 Aug 2011 16:22:52 +0900 Namhyung Kim <namhyung@gmail.com> 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@gmail.com>
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) ||
next prev parent reply other threads:[~2011-08-03 4:15 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-02 7:22 [PATCH] md/raid1: factor out common bio handling code Namhyung Kim
2011-08-03 4:15 ` NeilBrown [this message]
-- strict thread matches above, loose matches on Subject: below --
2011-06-17 2:10 Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110803141542.2eea6525@notabene.brown \
--to=neilb@suse.de \
--cc=linux-raid@vger.kernel.org \
--cc=namhyung@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).