aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Brassow <jbrassow@redhat.com>2011-01-13 17:14:33 -0500
committerNeilBrown <neilb@suse.de>2011-01-13 17:14:33 -0500
commitccebd4c4159462c96397ae9af9c667bb394d7b70 (patch)
tree04554f0e7607d906c6b09f31a995fca0dd40c5b5
parent57b2caa394393f8870ed41bdcc38a7542593018f (diff)
md-new-param-to_sync_page_io
Add new parameter to 'sync_page_io'. The new parameter allows us to distinguish between metadata and data operations. This becomes important later when we add the ability to use separate devices for data and metadata. Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
-rw-r--r--drivers/md/bitmap.c4
-rw-r--r--drivers/md/md.c9
-rw-r--r--drivers/md/md.h4
-rw-r--r--drivers/md/raid1.c28
-rw-r--r--drivers/md/raid10.c12
5 files changed, 28 insertions, 29 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index 5a1ffe3527aa..1977765ff964 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -210,11 +210,11 @@ static struct page *read_sb_page(mddev_t *mddev, loff_t offset,
210 || test_bit(Faulty, &rdev->flags)) 210 || test_bit(Faulty, &rdev->flags))
211 continue; 211 continue;
212 212
213 target = rdev->sb_start + offset + index * (PAGE_SIZE/512); 213 target = offset + index * (PAGE_SIZE/512);
214 214
215 if (sync_page_io(rdev, target, 215 if (sync_page_io(rdev, target,
216 roundup(size, bdev_logical_block_size(rdev->bdev)), 216 roundup(size, bdev_logical_block_size(rdev->bdev)),
217 page, READ)) { 217 page, READ, true)) {
218 page->index = index; 218 page->index = index;
219 attach_page_buffers(page, NULL); /* so that free_buffer will 219 attach_page_buffers(page, NULL); /* so that free_buffer will
220 * quietly no-op */ 220 * quietly no-op */
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 0a0d7c2f2ff6..0bc10cc4b961 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -795,7 +795,7 @@ static void bi_complete(struct bio *bio, int error)
795} 795}
796 796
797int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, 797int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size,
798 struct page *page, int rw) 798 struct page *page, int rw, bool metadata_op)
799{ 799{
800 struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); 800 struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev);
801 struct completion event; 801 struct completion event;
@@ -804,7 +804,10 @@ int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size,
804 rw |= REQ_SYNC | REQ_UNPLUG; 804 rw |= REQ_SYNC | REQ_UNPLUG;
805 805
806 bio->bi_bdev = rdev->bdev; 806 bio->bi_bdev = rdev->bdev;
807 bio->bi_sector = sector; 807 if (metadata_op)
808 bio->bi_sector = sector + rdev->sb_start;
809 else
810 bio->bi_sector = sector + rdev->data_offset;
808 bio_add_page(bio, page, size, 0); 811 bio_add_page(bio, page, size, 0);
809 init_completion(&event); 812 init_completion(&event);
810 bio->bi_private = &event; 813 bio->bi_private = &event;
@@ -829,7 +832,7 @@ static int read_disk_sb(mdk_rdev_t * rdev, int size)
829 return 0; 832 return 0;
830 833
831 834
832 if (!sync_page_io(rdev, rdev->sb_start, size, rdev->sb_page, READ)) 835 if (!sync_page_io(rdev, 0, size, rdev->sb_page, READ, true))
833 goto fail; 836 goto fail;
834 rdev->sb_loaded = 1; 837 rdev->sb_loaded = 1;
835 return 0; 838 return 0;
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 229675a604f7..7e4f358a26a6 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -498,8 +498,8 @@ extern void md_flush_request(mddev_t *mddev, struct bio *bio);
498extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev, 498extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
499 sector_t sector, int size, struct page *page); 499 sector_t sector, int size, struct page *page);
500extern void md_super_wait(mddev_t *mddev); 500extern void md_super_wait(mddev_t *mddev);
501extern int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, 501extern int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size,
502 struct page *page, int rw); 502 struct page *page, int rw, bool metadata_op);
503extern void md_do_sync(mddev_t *mddev); 503extern void md_do_sync(mddev_t *mddev);
504extern void md_new_event(mddev_t *mddev); 504extern void md_new_event(mddev_t *mddev);
505extern int md_allow_write(mddev_t *mddev); 505extern int md_allow_write(mddev_t *mddev);
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index d50056ba596b..a23ffa397ba9 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1365,10 +1365,10 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
1365 */ 1365 */
1366 rdev = conf->mirrors[d].rdev; 1366 rdev = conf->mirrors[d].rdev;
1367 if (sync_page_io(rdev, 1367 if (sync_page_io(rdev,
1368 sect + rdev->data_offset, 1368 sect,
1369 s<<9, 1369 s<<9,
1370 bio->bi_io_vec[idx].bv_page, 1370 bio->bi_io_vec[idx].bv_page,
1371 READ)) { 1371 READ, false)) {
1372 success = 1; 1372 success = 1;
1373 break; 1373 break;
1374 } 1374 }
@@ -1391,10 +1391,10 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
1391 rdev = conf->mirrors[d].rdev; 1391 rdev = conf->mirrors[d].rdev;
1392 atomic_add(s, &rdev->corrected_errors); 1392 atomic_add(s, &rdev->corrected_errors);
1393 if (sync_page_io(rdev, 1393 if (sync_page_io(rdev,
1394 sect + rdev->data_offset, 1394 sect,
1395 s<<9, 1395 s<<9,
1396 bio->bi_io_vec[idx].bv_page, 1396 bio->bi_io_vec[idx].bv_page,
1397 WRITE) == 0) 1397 WRITE, false) == 0)
1398 md_error(mddev, rdev); 1398 md_error(mddev, rdev);
1399 } 1399 }
1400 d = start; 1400 d = start;
@@ -1406,10 +1406,10 @@ static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
1406 continue; 1406 continue;
1407 rdev = conf->mirrors[d].rdev; 1407 rdev = conf->mirrors[d].rdev;
1408 if (sync_page_io(rdev, 1408 if (sync_page_io(rdev,
1409 sect + rdev->data_offset, 1409 sect,
1410 s<<9, 1410 s<<9,
1411 bio->bi_io_vec[idx].bv_page, 1411 bio->bi_io_vec[idx].bv_page,
1412 READ) == 0) 1412 READ, false) == 0)
1413 md_error(mddev, rdev); 1413 md_error(mddev, rdev);
1414 } 1414 }
1415 } else { 1415 } else {
@@ -1489,10 +1489,8 @@ static void fix_read_error(conf_t *conf, int read_disk,
1489 rdev = conf->mirrors[d].rdev; 1489 rdev = conf->mirrors[d].rdev;
1490 if (rdev && 1490 if (rdev &&
1491 test_bit(In_sync, &rdev->flags) && 1491 test_bit(In_sync, &rdev->flags) &&
1492 sync_page_io(rdev, 1492 sync_page_io(rdev, sect, s<<9,
1493 sect + rdev->data_offset, 1493 conf->tmppage, READ, false))
1494 s<<9,
1495 conf->tmppage, READ))
1496 success = 1; 1494 success = 1;
1497 else { 1495 else {
1498 d++; 1496 d++;
@@ -1515,9 +1513,8 @@ static void fix_read_error(conf_t *conf, int read_disk,
1515 rdev = conf->mirrors[d].rdev; 1513 rdev = conf->mirrors[d].rdev;
1516 if (rdev && 1514 if (rdev &&
1517 test_bit(In_sync, &rdev->flags)) { 1515 test_bit(In_sync, &rdev->flags)) {
1518 if (sync_page_io(rdev, 1516 if (sync_page_io(rdev, sect, s<<9,
1519 sect + rdev->data_offset, 1517 conf->tmppage, WRITE, false)
1520 s<<9, conf->tmppage, WRITE)
1521 == 0) 1518 == 0)
1522 /* Well, this device is dead */ 1519 /* Well, this device is dead */
1523 md_error(mddev, rdev); 1520 md_error(mddev, rdev);
@@ -1532,9 +1529,8 @@ static void fix_read_error(conf_t *conf, int read_disk,
1532 rdev = conf->mirrors[d].rdev; 1529 rdev = conf->mirrors[d].rdev;
1533 if (rdev && 1530 if (rdev &&
1534 test_bit(In_sync, &rdev->flags)) { 1531 test_bit(In_sync, &rdev->flags)) {
1535 if (sync_page_io(rdev, 1532 if (sync_page_io(rdev, sect, s<<9,
1536 sect + rdev->data_offset, 1533 conf->tmppage, READ, false)
1537 s<<9, conf->tmppage, READ)
1538 == 0) 1534 == 0)
1539 /* Well, this device is dead */ 1535 /* Well, this device is dead */
1540 md_error(mddev, rdev); 1536 md_error(mddev, rdev);
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 03825cbce2d4..69b659544390 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1560,9 +1560,9 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)
1560 rcu_read_unlock(); 1560 rcu_read_unlock();
1561 success = sync_page_io(rdev, 1561 success = sync_page_io(rdev,
1562 r10_bio->devs[sl].addr + 1562 r10_bio->devs[sl].addr +
1563 sect + rdev->data_offset, 1563 sect,
1564 s<<9, 1564 s<<9,
1565 conf->tmppage, READ); 1565 conf->tmppage, READ, false);
1566 rdev_dec_pending(rdev, mddev); 1566 rdev_dec_pending(rdev, mddev);
1567 rcu_read_lock(); 1567 rcu_read_lock();
1568 if (success) 1568 if (success)
@@ -1599,8 +1599,8 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)
1599 atomic_add(s, &rdev->corrected_errors); 1599 atomic_add(s, &rdev->corrected_errors);
1600 if (sync_page_io(rdev, 1600 if (sync_page_io(rdev,
1601 r10_bio->devs[sl].addr + 1601 r10_bio->devs[sl].addr +
1602 sect + rdev->data_offset, 1602 sect,
1603 s<<9, conf->tmppage, WRITE) 1603 s<<9, conf->tmppage, WRITE, false)
1604 == 0) { 1604 == 0) {
1605 /* Well, this device is dead */ 1605 /* Well, this device is dead */
1606 printk(KERN_NOTICE 1606 printk(KERN_NOTICE
@@ -1636,9 +1636,9 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)
1636 rcu_read_unlock(); 1636 rcu_read_unlock();
1637 if (sync_page_io(rdev, 1637 if (sync_page_io(rdev,
1638 r10_bio->devs[sl].addr + 1638 r10_bio->devs[sl].addr +
1639 sect + rdev->data_offset, 1639 sect,
1640 s<<9, conf->tmppage, 1640 s<<9, conf->tmppage,
1641 READ) == 0) { 1641 READ, false) == 0) {
1642 /* Well, this device is dead */ 1642 /* Well, this device is dead */
1643 printk(KERN_NOTICE 1643 printk(KERN_NOTICE
1644 "md/raid10:%s: unable to read back " 1644 "md/raid10:%s: unable to read back "