md/raid1:combine code in fix_read_error and fix_sync_read_error.
PATCH 1/1 md/raid1:combine code in fix_read_error and fix_sync_read_error.
From d8d5044e65ed2bea15e135918699777c49b6f224 Mon Sep 17 00:00:00 2001
From: majianpeng <[email protected]>
Date: Fri, 6 Apr 2012 15:07:33 +0800
Subject: [PATCH] md/raid1:combine code in fix_read_error and
fix_sync_read_error.
--- drivers/md/raid1.c | 36 ++++++++---------------------------- 1 files changed, 8 insertions(+), 28 deletions(-)
drivers/md/raid1.c +8 -28
@@ -1603,7 +1603,6 @@ static int fix_sync_read_error(struct r1bio *r1_bio)int d = r1_bio->read_disk;int success =0 ;struct md_rdev *rdev; -int start;if (s > (PAGE_SIZE >>9 )) s =PAGE_SIZE >>9 ;
@@ -1661,7 +1660,6 @@ static int fix_sync_read_error(struct r1bio *r1_bio)continue ; } - start = d;/* write it back and re-read */ while (d != r1_bio->read_disk) {if (d ==0 )
@@ -1675,21 +1673,12 @@ static int fix_sync_read_error(struct r1bio *r1_bio) WRITE) == 0) { r1_bio->bios[d]->bi_end_io =NULL ;rdev_dec_pending (rdev, mddev); - } - } - d = start; -while (d != r1_bio->read_disk) { -if (d ==0 ) - d = conf->raid_disks *2 ; - d--; -if (r1_bio->bios[d]->bi_end_io != end_sync_read) -continue ; - rdev = conf->mirrors[d].rdev; -if (r1_sync_page_io (rdev, sect, s, - bio->bi_io_vec[idx].bv_page, -READ ) !=0 ) + } else if (r1_sync_page_io(rdev, sect, s, + bio->bi_io_vec[idx].bv_page, READ)) atomic_add(s, &rdev->corrected_errors); + } + sectors -= s; sect += s; idx ++;
@@ -1841,7 +1830,6 @@ static void fix_read_error(struct r1conf *conf, int read_disk,int s = sectors;int d = read_disk;int success =0 ; -int start;struct md_rdev *rdev;if (s > (PAGE_SIZE >>9 ))
@@ -1878,19 +1866,8 @@ static void fix_read_error(struct r1conf *conf, int read_disk,md_error (mddev, rdev);break ; } +/* write it back and re-read */ - start = d; -while (d != read_disk) { -if (d==0 ) - d = conf->raid_disks *2 ; - d--; - rdev = conf->mirrors[d].rdev; -if (rdev && -test_bit (In_sync, &rdev->flags)) -r1_sync_page_io (rdev, sect, s, - conf->tmppage,WRITE ); - } - d = start;while (d != read_disk) {char b[BDEVNAME_SIZE ];if (d==0 )
@@ -1900,6 +1877,9 @@ static void fix_read_error(struct r1conf *conf, int read_disk,if (rdev &&test_bit (In_sync, &rdev->flags)) {if (r1_sync_page_io (rdev, sect, s, + conf->tmppage,WRITE ) ==0 ) +continue ; +else if (r1_sync_page_io (rdev, sect, s, conf->tmppage,READ )) {atomic_add (s, &rdev->corrected_errors); printk(KERN_INFO
Signature · 6 lines
1.7.5.4 -------------- majianpeng 2012-04-06
Quoted 6 lines · On Fri, 6 Apr 2012 15:15:38 +0800 "majianpeng" <[email protected]> wrote:
Quoted 1 line
From
d8d5044e65ed2bea15e135918699777c49b6f224Mon Sep 17 00:00:00 2001From: majianpeng <[email protected]>
Date: Fri, 6 Apr 2012 15:07:33 +0800
Subject: [PATCH] md/raid1:combine code infix_read_errorand
fix_sync_read_error.
your explanation for the patch is, again, too short.
I don't agree with this patch, I'd rather leave it as it is.
I want to perform all the writes before any reads.
If a read fails, I cannot be certain what the contents of the buffer are, so I don't want to risk writing it anywhere.
Thanks,
NeilBrown
Quoted 91 lines
Signed-off-by majianpeng <[email protected]>--- drivers/md/raid1.c | 36 ++++++++---------------------------- 1 files changed, 8 insertions(+), 28 deletions(-)drivers/md/raid1.c +8
-28@@ -1603,7 +1603,6 @@ static int fix_sync_read_error(struct r1bio *r1_bio)int d = r1_bio->read_disk;int success =0 ;struct md_rdev *rdev; -int start;if (s > (PAGE_SIZE >>9 )) s =PAGE_SIZE >>9 ;@@ -1661,7 +1660,6 @@ static int fix_sync_read_error(struct r1bio *r1_bio)continue ; } - start = d;/* write it back and re-read */ while (d != r1_bio->read_disk) {if (d ==0 )@@ -1675,21 +1673,12 @@ static int fix_sync_read_error(struct r1bio *r1_bio) WRITE) == 0) { r1_bio->bios[d]->bi_end_io =NULL ;rdev_dec_pending (rdev, mddev); - } - } - d = start; -while (d != r1_bio->read_disk) { -if (d ==0 ) - d = conf->raid_disks *2 ; - d--; -if (r1_bio->bios[d]->bi_end_io != end_sync_read) -continue ; - rdev = conf->mirrors[d].rdev; -if (r1_sync_page_io (rdev, sect, s, - bio->bi_io_vec[idx].bv_page, -READ ) !=0 ) + } else if (r1_sync_page_io(rdev, sect, s, + bio->bi_io_vec[idx].bv_page, READ)) atomic_add(s, &rdev->corrected_errors); + } + sectors -= s; sect += s; idx ++;@@ -1841,7 +1830,6 @@ static void fix_read_error(struct r1conf *conf, int read_disk,int s = sectors;int d = read_disk;int success =0 ; -int start;struct md_rdev *rdev;if (s > (PAGE_SIZE >>9 ))@@ -1878,19 +1866,8 @@ static void fix_read_error(struct r1conf *conf, int read_disk,md_error (mddev, rdev);break ; } +/* write it back and re-read */ - start = d; -while (d != read_disk) { -if (d==0 ) - d = conf->raid_disks *2 ; - d--; - rdev = conf->mirrors[d].rdev; -if (rdev && -test_bit (In_sync, &rdev->flags)) -r1_sync_page_io (rdev, sect, s, - conf->tmppage,WRITE ); - } - d = start;while (d != read_disk) {char b[BDEVNAME_SIZE ];if (d==0 )@@ -1900,6 +1877,9 @@ static void fix_read_error(struct r1conf *conf, int read_disk,if (rdev &&test_bit (In_sync, &rdev->flags)) {if (r1_sync_page_io (rdev, sect, s, + conf->tmppage,WRITE ) ==0 ) +continue ; +else if (r1_sync_page_io (rdev, sect, s, conf->tmppage,READ )) {atomic_add (s, &rdev->corrected_errors); printk(KERN_INFO
Re: Re: [PATCH] md/raid1:combine code in fix_read_error andfix_sync_read_error.
Thanks,Neil.I did not notice the data buff is the same when write and read.
------------------
majianpeng
2012-04-10
-------------------------------------------------------------
发件人:NeilBrown
发送日期:2012-04-10 07:47:15
收件人:majianpeng
抄送:linux-raid
主题:Re: [PATCH] md/raid1:combine code in fix_read_error andfix_sync_read_error.
Quoted 6 lines · On Fri, 6 Apr 2012 15:15:38 +0800 "majianpeng" <[email protected]> wrote:
Quoted 1 line
From
d8d5044e65ed2bea15e135918699777c49b6f224Mon Sep 17 00:00:00 2001From: majianpeng <[email protected]>
Date: Fri, 6 Apr 2012 15:07:33 +0800
Subject: [PATCH] md/raid1:combine code infix_read_errorand
fix_sync_read_error.
your explanation for the patch is, again, too short.
I don't agree with this patch, I'd rather leave it as it is.
I want to perform all the writes before any reads.
If a read fails, I cannot be certain what the contents of the buffer are, so I don't want to risk writing it anywhere.
Thanks,
NeilBrown
Quoted 91 lines
Signed-off-by majianpeng <[email protected]>--- drivers/md/raid1.c | 36 ++++++++---------------------------- 1 files changed, 8 insertions(+), 28 deletions(-)drivers/md/raid1.c +8
-28@@ -1603,7 +1603,6 @@ static int fix_sync_read_error(struct r1bio *r1_bio)int d = r1_bio->read_disk;int success =0 ;struct md_rdev *rdev; -int start;if (s > (PAGE_SIZE >>9 )) s =PAGE_SIZE >>9 ;@@ -1661,7 +1660,6 @@ static int fix_sync_read_error(struct r1bio *r1_bio)continue ; } - start = d;/* write it back and re-read */ while (d != r1_bio->read_disk) {if (d ==0 )@@ -1675,21 +1673,12 @@ static int fix_sync_read_error(struct r1bio *r1_bio) WRITE) == 0) { r1_bio->bios[d]->bi_end_io =NULL ;rdev_dec_pending (rdev, mddev); - } - } - d = start; -while (d != r1_bio->read_disk) { -if (d ==0 ) - d = conf->raid_disks *2 ; - d--; -if (r1_bio->bios[d]->bi_end_io != end_sync_read) -continue ; - rdev = conf->mirrors[d].rdev; -if (r1_sync_page_io (rdev, sect, s, - bio->bi_io_vec[idx].bv_page, -READ ) !=0 ) + } else if (r1_sync_page_io(rdev, sect, s, + bio->bi_io_vec[idx].bv_page, READ)) atomic_add(s, &rdev->corrected_errors); + } + sectors -= s; sect += s; idx ++;@@ -1841,7 +1830,6 @@ static void fix_read_error(struct r1conf *conf, int read_disk,int s = sectors;int d = read_disk;int success =0 ; -int start;struct md_rdev *rdev;if (s > (PAGE_SIZE >>9 ))@@ -1878,19 +1866,8 @@ static void fix_read_error(struct r1conf *conf, int read_disk,md_error (mddev, rdev);break ; } +/* write it back and re-read */ - start = d; -while (d != read_disk) { -if (d==0 ) - d = conf->raid_disks *2 ; - d--; - rdev = conf->mirrors[d].rdev; -if (rdev && -test_bit (In_sync, &rdev->flags)) -r1_sync_page_io (rdev, sect, s, - conf->tmppage,WRITE ); - } - d = start;while (d != read_disk) {char b[BDEVNAME_SIZE ];if (d==0 )@@ -1900,6 +1877,9 @@ static void fix_read_error(struct r1conf *conf, int read_disk,if (rdev &&test_bit (In_sync, &rdev->flags)) {if (r1_sync_page_io (rdev, sect, s, + conf->tmppage,WRITE ) ==0 ) +continue ; +else if (r1_sync_page_io (rdev, sect, s, conf->tmppage,READ )) {atomic_add (s, &rdev->corrected_errors); printk(KERN_INFO