raid10.c (8e8c668927b029f6ccc350eb1aa936864cc4eb6f) raid10.c (288dab8a35a0bde426a09870943c8d3ee3a50dab)
1/*
2 * raid10.c : Multiple Devices driver for Linux
3 *
4 * Copyright (C) 2000-2004 Neil Brown
5 *
6 * RAID-10 support for md.
7 *
8 * Base on code in raid1.c. See raid1.c for further copyright information.

--- 851 unchanged lines hidden (view full) ---

860 /* flush any pending bitmap writes to disk
861 * before proceeding w/ I/O */
862 bitmap_unplug(conf->mddev->bitmap);
863 wake_up(&conf->wait_barrier);
864
865 while (bio) { /* submit pending writes */
866 struct bio *next = bio->bi_next;
867 bio->bi_next = NULL;
1/*
2 * raid10.c : Multiple Devices driver for Linux
3 *
4 * Copyright (C) 2000-2004 Neil Brown
5 *
6 * RAID-10 support for md.
7 *
8 * Base on code in raid1.c. See raid1.c for further copyright information.

--- 851 unchanged lines hidden (view full) ---

860 /* flush any pending bitmap writes to disk
861 * before proceeding w/ I/O */
862 bitmap_unplug(conf->mddev->bitmap);
863 wake_up(&conf->wait_barrier);
864
865 while (bio) { /* submit pending writes */
866 struct bio *next = bio->bi_next;
867 bio->bi_next = NULL;
868 if (unlikely((bio->bi_rw & REQ_DISCARD) &&
868 if (unlikely((bio_op(bio) == REQ_OP_DISCARD) &&
869 !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
870 /* Just ignore it */
871 bio_endio(bio);
872 else
873 generic_make_request(bio);
874 bio = next;
875 }
876 } else

--- 159 unchanged lines hidden (view full) ---

1036 /* we aren't scheduling, so we can do the write-out directly. */
1037 bio = bio_list_get(&plug->pending);
1038 bitmap_unplug(mddev->bitmap);
1039 wake_up(&conf->wait_barrier);
1040
1041 while (bio) { /* submit pending writes */
1042 struct bio *next = bio->bi_next;
1043 bio->bi_next = NULL;
869 !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
870 /* Just ignore it */
871 bio_endio(bio);
872 else
873 generic_make_request(bio);
874 bio = next;
875 }
876 } else

--- 159 unchanged lines hidden (view full) ---

1036 /* we aren't scheduling, so we can do the write-out directly. */
1037 bio = bio_list_get(&plug->pending);
1038 bitmap_unplug(mddev->bitmap);
1039 wake_up(&conf->wait_barrier);
1040
1041 while (bio) { /* submit pending writes */
1042 struct bio *next = bio->bi_next;
1043 bio->bi_next = NULL;
1044 if (unlikely((bio->bi_rw & REQ_DISCARD) &&
1044 if (unlikely((bio_op(bio) == REQ_OP_DISCARD) &&
1045 !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
1046 /* Just ignore it */
1047 bio_endio(bio);
1048 else
1049 generic_make_request(bio);
1050 bio = next;
1051 }
1052 kfree(plug);
1053}
1054
1055static void __make_request(struct mddev *mddev, struct bio *bio)
1056{
1057 struct r10conf *conf = mddev->private;
1058 struct r10bio *r10_bio;
1059 struct bio *read_bio;
1060 int i;
1045 !blk_queue_discard(bdev_get_queue(bio->bi_bdev))))
1046 /* Just ignore it */
1047 bio_endio(bio);
1048 else
1049 generic_make_request(bio);
1050 bio = next;
1051 }
1052 kfree(plug);
1053}
1054
1055static void __make_request(struct mddev *mddev, struct bio *bio)
1056{
1057 struct r10conf *conf = mddev->private;
1058 struct r10bio *r10_bio;
1059 struct bio *read_bio;
1060 int i;
1061 const int op = bio_op(bio);
1061 const int rw = bio_data_dir(bio);
1062 const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
1063 const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
1062 const int rw = bio_data_dir(bio);
1063 const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
1064 const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
1064 const unsigned long do_discard = (bio->bi_rw
1065 & (REQ_DISCARD | REQ_SECURE));
1066 const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME);
1067 unsigned long flags;
1068 struct md_rdev *blocked_rdev;
1069 struct blk_plug_cb *cb;
1070 struct raid10_plug_cb *plug = NULL;
1071 int sectors_handled;
1072 int max_sectors;
1073 int sectors;
1074

--- 76 unchanged lines hidden (view full) ---

1151
1152 r10_bio->devs[slot].bio = read_bio;
1153 r10_bio->devs[slot].rdev = rdev;
1154
1155 read_bio->bi_iter.bi_sector = r10_bio->devs[slot].addr +
1156 choose_data_offset(r10_bio, rdev);
1157 read_bio->bi_bdev = rdev->bdev;
1158 read_bio->bi_end_io = raid10_end_read_request;
1065 unsigned long flags;
1066 struct md_rdev *blocked_rdev;
1067 struct blk_plug_cb *cb;
1068 struct raid10_plug_cb *plug = NULL;
1069 int sectors_handled;
1070 int max_sectors;
1071 int sectors;
1072

--- 76 unchanged lines hidden (view full) ---

1149
1150 r10_bio->devs[slot].bio = read_bio;
1151 r10_bio->devs[slot].rdev = rdev;
1152
1153 read_bio->bi_iter.bi_sector = r10_bio->devs[slot].addr +
1154 choose_data_offset(r10_bio, rdev);
1155 read_bio->bi_bdev = rdev->bdev;
1156 read_bio->bi_end_io = raid10_end_read_request;
1159 read_bio->bi_rw = READ | do_sync;
1157 bio_set_op_attrs(read_bio, op, do_sync);
1160 read_bio->bi_private = r10_bio;
1161
1162 if (max_sectors < r10_bio->sectors) {
1163 /* Could not read all from this device, so we will
1164 * need another r10_bio.
1165 */
1166 sectors_handled = (r10_bio->sector + max_sectors
1167 - bio->bi_iter.bi_sector);

--- 190 unchanged lines hidden (view full) ---

1358 max_sectors);
1359 r10_bio->devs[i].bio = mbio;
1360
1361 mbio->bi_iter.bi_sector = (r10_bio->devs[i].addr+
1362 choose_data_offset(r10_bio,
1363 rdev));
1364 mbio->bi_bdev = rdev->bdev;
1365 mbio->bi_end_io = raid10_end_write_request;
1158 read_bio->bi_private = r10_bio;
1159
1160 if (max_sectors < r10_bio->sectors) {
1161 /* Could not read all from this device, so we will
1162 * need another r10_bio.
1163 */
1164 sectors_handled = (r10_bio->sector + max_sectors
1165 - bio->bi_iter.bi_sector);

--- 190 unchanged lines hidden (view full) ---

1356 max_sectors);
1357 r10_bio->devs[i].bio = mbio;
1358
1359 mbio->bi_iter.bi_sector = (r10_bio->devs[i].addr+
1360 choose_data_offset(r10_bio,
1361 rdev));
1362 mbio->bi_bdev = rdev->bdev;
1363 mbio->bi_end_io = raid10_end_write_request;
1366 mbio->bi_rw =
1367 WRITE | do_sync | do_fua | do_discard | do_same;
1364 bio_set_op_attrs(mbio, op, do_sync | do_fua);
1368 mbio->bi_private = r10_bio;
1369
1370 atomic_inc(&r10_bio->remaining);
1371
1372 cb = blk_check_plugged(raid10_unplug, mddev,
1373 sizeof(*plug));
1374 if (cb)
1375 plug = container_of(cb, struct raid10_plug_cb,

--- 25 unchanged lines hidden (view full) ---

1401 max_sectors);
1402 r10_bio->devs[i].repl_bio = mbio;
1403
1404 mbio->bi_iter.bi_sector = (r10_bio->devs[i].addr +
1405 choose_data_offset(
1406 r10_bio, rdev));
1407 mbio->bi_bdev = rdev->bdev;
1408 mbio->bi_end_io = raid10_end_write_request;
1365 mbio->bi_private = r10_bio;
1366
1367 atomic_inc(&r10_bio->remaining);
1368
1369 cb = blk_check_plugged(raid10_unplug, mddev,
1370 sizeof(*plug));
1371 if (cb)
1372 plug = container_of(cb, struct raid10_plug_cb,

--- 25 unchanged lines hidden (view full) ---

1398 max_sectors);
1399 r10_bio->devs[i].repl_bio = mbio;
1400
1401 mbio->bi_iter.bi_sector = (r10_bio->devs[i].addr +
1402 choose_data_offset(
1403 r10_bio, rdev));
1404 mbio->bi_bdev = rdev->bdev;
1405 mbio->bi_end_io = raid10_end_write_request;
1409 mbio->bi_rw =
1410 WRITE | do_sync | do_fua | do_discard | do_same;
1406 bio_set_op_attrs(mbio, op, do_sync | do_fua);
1411 mbio->bi_private = r10_bio;
1412
1413 atomic_inc(&r10_bio->remaining);
1414 spin_lock_irqsave(&conf->device_lock, flags);
1415 bio_list_add(&conf->pending_bio_list, mbio);
1416 conf->pending_count++;
1417 spin_unlock_irqrestore(&conf->device_lock, flags);
1418 if (!mddev_check_plugged(mddev))

--- 26 unchanged lines hidden (view full) ---

1445static void raid10_make_request(struct mddev *mddev, struct bio *bio)
1446{
1447 struct r10conf *conf = mddev->private;
1448 sector_t chunk_mask = (conf->geo.chunk_mask & conf->prev.chunk_mask);
1449 int chunk_sects = chunk_mask + 1;
1450
1451 struct bio *split;
1452
1407 mbio->bi_private = r10_bio;
1408
1409 atomic_inc(&r10_bio->remaining);
1410 spin_lock_irqsave(&conf->device_lock, flags);
1411 bio_list_add(&conf->pending_bio_list, mbio);
1412 conf->pending_count++;
1413 spin_unlock_irqrestore(&conf->device_lock, flags);
1414 if (!mddev_check_plugged(mddev))

--- 26 unchanged lines hidden (view full) ---

1441static void raid10_make_request(struct mddev *mddev, struct bio *bio)
1442{
1443 struct r10conf *conf = mddev->private;
1444 sector_t chunk_mask = (conf->geo.chunk_mask & conf->prev.chunk_mask);
1445 int chunk_sects = chunk_mask + 1;
1446
1447 struct bio *split;
1448
1453 if (unlikely(bio->bi_rw & REQ_FLUSH)) {
1449 if (unlikely(bio->bi_rw & REQ_PREFLUSH)) {
1454 md_flush_request(mddev, bio);
1455 return;
1456 }
1457
1458 md_write_start(mddev, bio);
1459
1460 do {
1461

--- 525 unchanged lines hidden (view full) ---

1987 * inconsistency or to correct an unreadable block.
1988 * First we need to fixup bv_offset, bv_len and
1989 * bi_vecs, as the read request might have corrupted these
1990 */
1991 bio_reset(tbio);
1992
1993 tbio->bi_vcnt = vcnt;
1994 tbio->bi_iter.bi_size = fbio->bi_iter.bi_size;
1450 md_flush_request(mddev, bio);
1451 return;
1452 }
1453
1454 md_write_start(mddev, bio);
1455
1456 do {
1457

--- 525 unchanged lines hidden (view full) ---

1983 * inconsistency or to correct an unreadable block.
1984 * First we need to fixup bv_offset, bv_len and
1985 * bi_vecs, as the read request might have corrupted these
1986 */
1987 bio_reset(tbio);
1988
1989 tbio->bi_vcnt = vcnt;
1990 tbio->bi_iter.bi_size = fbio->bi_iter.bi_size;
1995 tbio->bi_rw = WRITE;
1996 tbio->bi_private = r10_bio;
1997 tbio->bi_iter.bi_sector = r10_bio->devs[i].addr;
1998 tbio->bi_end_io = end_sync_write;
1991 tbio->bi_private = r10_bio;
1992 tbio->bi_iter.bi_sector = r10_bio->devs[i].addr;
1993 tbio->bi_end_io = end_sync_write;
1994 bio_set_op_attrs(tbio, REQ_OP_WRITE, 0);
1999
2000 bio_copy_data(tbio, fbio);
2001
2002 d = r10_bio->devs[i].devnum;
2003 atomic_inc(&conf->mirrors[d].rdev->nr_pending);
2004 atomic_inc(&r10_bio->remaining);
2005 md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(tbio));
2006

--- 66 unchanged lines hidden (view full) ---

2073 s = PAGE_SIZE >> 9;
2074
2075 rdev = conf->mirrors[dr].rdev;
2076 addr = r10_bio->devs[0].addr + sect,
2077 ok = sync_page_io(rdev,
2078 addr,
2079 s << 9,
2080 bio->bi_io_vec[idx].bv_page,
1995
1996 bio_copy_data(tbio, fbio);
1997
1998 d = r10_bio->devs[i].devnum;
1999 atomic_inc(&conf->mirrors[d].rdev->nr_pending);
2000 atomic_inc(&r10_bio->remaining);
2001 md_sync_acct(conf->mirrors[d].rdev->bdev, bio_sectors(tbio));
2002

--- 66 unchanged lines hidden (view full) ---

2069 s = PAGE_SIZE >> 9;
2070
2071 rdev = conf->mirrors[dr].rdev;
2072 addr = r10_bio->devs[0].addr + sect,
2073 ok = sync_page_io(rdev,
2074 addr,
2075 s << 9,
2076 bio->bi_io_vec[idx].bv_page,
2081 READ, false);
2077 REQ_OP_READ, 0, false);
2082 if (ok) {
2083 rdev = conf->mirrors[dw].rdev;
2084 addr = r10_bio->devs[1].addr + sect;
2085 ok = sync_page_io(rdev,
2086 addr,
2087 s << 9,
2088 bio->bi_io_vec[idx].bv_page,
2078 if (ok) {
2079 rdev = conf->mirrors[dw].rdev;
2080 addr = r10_bio->devs[1].addr + sect;
2081 ok = sync_page_io(rdev,
2082 addr,
2083 s << 9,
2084 bio->bi_io_vec[idx].bv_page,
2089 WRITE, false);
2085 REQ_OP_WRITE, 0, false);
2090 if (!ok) {
2091 set_bit(WriteErrorSeen, &rdev->flags);
2092 if (!test_and_set_bit(WantReplacement,
2093 &rdev->flags))
2094 set_bit(MD_RECOVERY_NEEDED,
2095 &rdev->mddev->recovery);
2096 }
2097 }

--- 110 unchanged lines hidden (view full) ---

2208 int sectors, struct page *page, int rw)
2209{
2210 sector_t first_bad;
2211 int bad_sectors;
2212
2213 if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors)
2214 && (rw == READ || test_bit(WriteErrorSeen, &rdev->flags)))
2215 return -1;
2086 if (!ok) {
2087 set_bit(WriteErrorSeen, &rdev->flags);
2088 if (!test_and_set_bit(WantReplacement,
2089 &rdev->flags))
2090 set_bit(MD_RECOVERY_NEEDED,
2091 &rdev->mddev->recovery);
2092 }
2093 }

--- 110 unchanged lines hidden (view full) ---

2204 int sectors, struct page *page, int rw)
2205{
2206 sector_t first_bad;
2207 int bad_sectors;
2208
2209 if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors)
2210 && (rw == READ || test_bit(WriteErrorSeen, &rdev->flags)))
2211 return -1;
2216 if (sync_page_io(rdev, sector, sectors << 9, page, rw, false))
2212 if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false))
2217 /* success */
2218 return 1;
2219 if (rw == WRITE) {
2220 set_bit(WriteErrorSeen, &rdev->flags);
2221 if (!test_and_set_bit(WantReplacement, &rdev->flags))
2222 set_bit(MD_RECOVERY_NEEDED,
2223 &rdev->mddev->recovery);
2224 }

--- 69 unchanged lines hidden (view full) ---

2294 is_badblock(rdev, r10_bio->devs[sl].addr + sect, s,
2295 &first_bad, &bad_sectors) == 0) {
2296 atomic_inc(&rdev->nr_pending);
2297 rcu_read_unlock();
2298 success = sync_page_io(rdev,
2299 r10_bio->devs[sl].addr +
2300 sect,
2301 s<<9,
2213 /* success */
2214 return 1;
2215 if (rw == WRITE) {
2216 set_bit(WriteErrorSeen, &rdev->flags);
2217 if (!test_and_set_bit(WantReplacement, &rdev->flags))
2218 set_bit(MD_RECOVERY_NEEDED,
2219 &rdev->mddev->recovery);
2220 }

--- 69 unchanged lines hidden (view full) ---

2290 is_badblock(rdev, r10_bio->devs[sl].addr + sect, s,
2291 &first_bad, &bad_sectors) == 0) {
2292 atomic_inc(&rdev->nr_pending);
2293 rcu_read_unlock();
2294 success = sync_page_io(rdev,
2295 r10_bio->devs[sl].addr +
2296 sect,
2297 s<<9,
2302 conf->tmppage, READ, false);
2298 conf->tmppage,
2299 REQ_OP_READ, 0, false);
2303 rdev_dec_pending(rdev, mddev);
2304 rcu_read_lock();
2305 if (success)
2306 break;
2307 }
2308 sl++;
2309 if (sl == conf->copies)
2310 sl = 0;

--- 158 unchanged lines hidden (view full) ---

2469 sectors = sect_to_write;
2470 /* Write at 'sector' for 'sectors' */
2471 wbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
2472 bio_trim(wbio, sector - bio->bi_iter.bi_sector, sectors);
2473 wbio->bi_iter.bi_sector = (r10_bio->devs[i].addr+
2474 choose_data_offset(r10_bio, rdev) +
2475 (sector - r10_bio->sector));
2476 wbio->bi_bdev = rdev->bdev;
2300 rdev_dec_pending(rdev, mddev);
2301 rcu_read_lock();
2302 if (success)
2303 break;
2304 }
2305 sl++;
2306 if (sl == conf->copies)
2307 sl = 0;

--- 158 unchanged lines hidden (view full) ---

2466 sectors = sect_to_write;
2467 /* Write at 'sector' for 'sectors' */
2468 wbio = bio_clone_mddev(bio, GFP_NOIO, mddev);
2469 bio_trim(wbio, sector - bio->bi_iter.bi_sector, sectors);
2470 wbio->bi_iter.bi_sector = (r10_bio->devs[i].addr+
2471 choose_data_offset(r10_bio, rdev) +
2472 (sector - r10_bio->sector));
2473 wbio->bi_bdev = rdev->bdev;
2477 if (submit_bio_wait(WRITE, wbio) < 0)
2474 bio_set_op_attrs(wbio, REQ_OP_WRITE, 0);
2475
2476 if (submit_bio_wait(wbio) < 0)
2478 /* Failure! */
2479 ok = rdev_set_badblocks(rdev, sector,
2480 sectors, 0)
2481 && ok;
2482
2483 bio_put(wbio);
2484 sect_to_write -= sectors;
2485 sector += sectors;

--- 57 unchanged lines hidden (view full) ---

2543 bio = bio_clone_mddev(r10_bio->master_bio,
2544 GFP_NOIO, mddev);
2545 bio_trim(bio, r10_bio->sector - bio->bi_iter.bi_sector, max_sectors);
2546 r10_bio->devs[slot].bio = bio;
2547 r10_bio->devs[slot].rdev = rdev;
2548 bio->bi_iter.bi_sector = r10_bio->devs[slot].addr
2549 + choose_data_offset(r10_bio, rdev);
2550 bio->bi_bdev = rdev->bdev;
2477 /* Failure! */
2478 ok = rdev_set_badblocks(rdev, sector,
2479 sectors, 0)
2480 && ok;
2481
2482 bio_put(wbio);
2483 sect_to_write -= sectors;
2484 sector += sectors;

--- 57 unchanged lines hidden (view full) ---

2542 bio = bio_clone_mddev(r10_bio->master_bio,
2543 GFP_NOIO, mddev);
2544 bio_trim(bio, r10_bio->sector - bio->bi_iter.bi_sector, max_sectors);
2545 r10_bio->devs[slot].bio = bio;
2546 r10_bio->devs[slot].rdev = rdev;
2547 bio->bi_iter.bi_sector = r10_bio->devs[slot].addr
2548 + choose_data_offset(r10_bio, rdev);
2549 bio->bi_bdev = rdev->bdev;
2551 bio->bi_rw = READ | do_sync;
2550 bio_set_op_attrs(bio, REQ_OP_READ, do_sync);
2552 bio->bi_private = r10_bio;
2553 bio->bi_end_io = raid10_end_read_request;
2554 if (max_sectors < r10_bio->sectors) {
2555 /* Drat - have to split this up more */
2556 struct bio *mbio = r10_bio->master_bio;
2557 int sectors_handled =
2558 r10_bio->sector + max_sectors
2559 - mbio->bi_iter.bi_sector;

--- 473 unchanged lines hidden (view full) ---

3033 }
3034 }
3035 bio = r10_bio->devs[0].bio;
3036 bio_reset(bio);
3037 bio->bi_next = biolist;
3038 biolist = bio;
3039 bio->bi_private = r10_bio;
3040 bio->bi_end_io = end_sync_read;
2551 bio->bi_private = r10_bio;
2552 bio->bi_end_io = raid10_end_read_request;
2553 if (max_sectors < r10_bio->sectors) {
2554 /* Drat - have to split this up more */
2555 struct bio *mbio = r10_bio->master_bio;
2556 int sectors_handled =
2557 r10_bio->sector + max_sectors
2558 - mbio->bi_iter.bi_sector;

--- 473 unchanged lines hidden (view full) ---

3032 }
3033 }
3034 bio = r10_bio->devs[0].bio;
3035 bio_reset(bio);
3036 bio->bi_next = biolist;
3037 biolist = bio;
3038 bio->bi_private = r10_bio;
3039 bio->bi_end_io = end_sync_read;
3041 bio->bi_rw = READ;
3040 bio_set_op_attrs(bio, REQ_OP_READ, 0);
3042 from_addr = r10_bio->devs[j].addr;
3043 bio->bi_iter.bi_sector = from_addr +
3044 rdev->data_offset;
3045 bio->bi_bdev = rdev->bdev;
3046 atomic_inc(&rdev->nr_pending);
3047 /* and we write to 'i' (if not in_sync) */
3048
3049 for (k=0; k<conf->copies; k++)

--- 9 unchanged lines hidden (view full) ---

3059 rdev = mirror->rdev;
3060 if (!test_bit(In_sync, &rdev->flags)) {
3061 bio = r10_bio->devs[1].bio;
3062 bio_reset(bio);
3063 bio->bi_next = biolist;
3064 biolist = bio;
3065 bio->bi_private = r10_bio;
3066 bio->bi_end_io = end_sync_write;
3041 from_addr = r10_bio->devs[j].addr;
3042 bio->bi_iter.bi_sector = from_addr +
3043 rdev->data_offset;
3044 bio->bi_bdev = rdev->bdev;
3045 atomic_inc(&rdev->nr_pending);
3046 /* and we write to 'i' (if not in_sync) */
3047
3048 for (k=0; k<conf->copies; k++)

--- 9 unchanged lines hidden (view full) ---

3058 rdev = mirror->rdev;
3059 if (!test_bit(In_sync, &rdev->flags)) {
3060 bio = r10_bio->devs[1].bio;
3061 bio_reset(bio);
3062 bio->bi_next = biolist;
3063 biolist = bio;
3064 bio->bi_private = r10_bio;
3065 bio->bi_end_io = end_sync_write;
3067 bio->bi_rw = WRITE;
3066 bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
3068 bio->bi_iter.bi_sector = to_addr
3069 + rdev->data_offset;
3070 bio->bi_bdev = rdev->bdev;
3071 atomic_inc(&r10_bio->remaining);
3072 } else
3073 r10_bio->devs[1].bio->bi_end_io = NULL;
3074
3075 /* and maybe write to replacement */

--- 12 unchanged lines hidden (view full) ---

3088 if (rdev == NULL || bio == NULL ||
3089 test_bit(Faulty, &rdev->flags))
3090 break;
3091 bio_reset(bio);
3092 bio->bi_next = biolist;
3093 biolist = bio;
3094 bio->bi_private = r10_bio;
3095 bio->bi_end_io = end_sync_write;
3067 bio->bi_iter.bi_sector = to_addr
3068 + rdev->data_offset;
3069 bio->bi_bdev = rdev->bdev;
3070 atomic_inc(&r10_bio->remaining);
3071 } else
3072 r10_bio->devs[1].bio->bi_end_io = NULL;
3073
3074 /* and maybe write to replacement */

--- 12 unchanged lines hidden (view full) ---

3087 if (rdev == NULL || bio == NULL ||
3088 test_bit(Faulty, &rdev->flags))
3089 break;
3090 bio_reset(bio);
3091 bio->bi_next = biolist;
3092 biolist = bio;
3093 bio->bi_private = r10_bio;
3094 bio->bi_end_io = end_sync_write;
3096 bio->bi_rw = WRITE;
3095 bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
3097 bio->bi_iter.bi_sector = to_addr +
3098 rdev->data_offset;
3099 bio->bi_bdev = rdev->bdev;
3100 atomic_inc(&r10_bio->remaining);
3101 break;
3102 }
3103 if (j == conf->copies) {
3104 /* Cannot recover, so abort the recovery or

--- 103 unchanged lines hidden (view full) ---

3208 }
3209 }
3210 atomic_inc(&conf->mirrors[d].rdev->nr_pending);
3211 atomic_inc(&r10_bio->remaining);
3212 bio->bi_next = biolist;
3213 biolist = bio;
3214 bio->bi_private = r10_bio;
3215 bio->bi_end_io = end_sync_read;
3096 bio->bi_iter.bi_sector = to_addr +
3097 rdev->data_offset;
3098 bio->bi_bdev = rdev->bdev;
3099 atomic_inc(&r10_bio->remaining);
3100 break;
3101 }
3102 if (j == conf->copies) {
3103 /* Cannot recover, so abort the recovery or

--- 103 unchanged lines hidden (view full) ---

3207 }
3208 }
3209 atomic_inc(&conf->mirrors[d].rdev->nr_pending);
3210 atomic_inc(&r10_bio->remaining);
3211 bio->bi_next = biolist;
3212 biolist = bio;
3213 bio->bi_private = r10_bio;
3214 bio->bi_end_io = end_sync_read;
3216 bio->bi_rw = READ;
3215 bio_set_op_attrs(bio, REQ_OP_READ, 0);
3217 bio->bi_iter.bi_sector = sector +
3218 conf->mirrors[d].rdev->data_offset;
3219 bio->bi_bdev = conf->mirrors[d].rdev->bdev;
3220 count++;
3221
3222 if (conf->mirrors[d].replacement == NULL ||
3223 test_bit(Faulty,
3224 &conf->mirrors[d].replacement->flags))

--- 5 unchanged lines hidden (view full) ---

3230 bio->bi_error = -EIO;
3231
3232 sector = r10_bio->devs[i].addr;
3233 atomic_inc(&conf->mirrors[d].rdev->nr_pending);
3234 bio->bi_next = biolist;
3235 biolist = bio;
3236 bio->bi_private = r10_bio;
3237 bio->bi_end_io = end_sync_write;
3216 bio->bi_iter.bi_sector = sector +
3217 conf->mirrors[d].rdev->data_offset;
3218 bio->bi_bdev = conf->mirrors[d].rdev->bdev;
3219 count++;
3220
3221 if (conf->mirrors[d].replacement == NULL ||
3222 test_bit(Faulty,
3223 &conf->mirrors[d].replacement->flags))

--- 5 unchanged lines hidden (view full) ---

3229 bio->bi_error = -EIO;
3230
3231 sector = r10_bio->devs[i].addr;
3232 atomic_inc(&conf->mirrors[d].rdev->nr_pending);
3233 bio->bi_next = biolist;
3234 biolist = bio;
3235 bio->bi_private = r10_bio;
3236 bio->bi_end_io = end_sync_write;
3238 bio->bi_rw = WRITE;
3237 bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
3239 bio->bi_iter.bi_sector = sector +
3240 conf->mirrors[d].replacement->data_offset;
3241 bio->bi_bdev = conf->mirrors[d].replacement->bdev;
3242 count++;
3243 }
3244
3245 if (count < 2) {
3246 for (i=0; i<conf->copies; i++) {

--- 1068 unchanged lines hidden (view full) ---

4315
4316 read_bio = bio_alloc_mddev(GFP_KERNEL, RESYNC_PAGES, mddev);
4317
4318 read_bio->bi_bdev = rdev->bdev;
4319 read_bio->bi_iter.bi_sector = (r10_bio->devs[r10_bio->read_slot].addr
4320 + rdev->data_offset);
4321 read_bio->bi_private = r10_bio;
4322 read_bio->bi_end_io = end_sync_read;
3238 bio->bi_iter.bi_sector = sector +
3239 conf->mirrors[d].replacement->data_offset;
3240 bio->bi_bdev = conf->mirrors[d].replacement->bdev;
3241 count++;
3242 }
3243
3244 if (count < 2) {
3245 for (i=0; i<conf->copies; i++) {

--- 1068 unchanged lines hidden (view full) ---

4314
4315 read_bio = bio_alloc_mddev(GFP_KERNEL, RESYNC_PAGES, mddev);
4316
4317 read_bio->bi_bdev = rdev->bdev;
4318 read_bio->bi_iter.bi_sector = (r10_bio->devs[r10_bio->read_slot].addr
4319 + rdev->data_offset);
4320 read_bio->bi_private = r10_bio;
4321 read_bio->bi_end_io = end_sync_read;
4323 read_bio->bi_rw = READ;
4322 bio_set_op_attrs(read_bio, REQ_OP_READ, 0);
4324 read_bio->bi_flags &= (~0UL << BIO_RESET_BITS);
4325 read_bio->bi_error = 0;
4326 read_bio->bi_vcnt = 0;
4327 read_bio->bi_iter.bi_size = 0;
4328 r10_bio->master_bio = read_bio;
4329 r10_bio->read_slot = r10_bio->devs[r10_bio->read_slot].devnum;
4330
4331 /* Now find the locations in the new layout */

--- 17 unchanged lines hidden (view full) ---

4349 continue;
4350
4351 bio_reset(b);
4352 b->bi_bdev = rdev2->bdev;
4353 b->bi_iter.bi_sector = r10_bio->devs[s/2].addr +
4354 rdev2->new_data_offset;
4355 b->bi_private = r10_bio;
4356 b->bi_end_io = end_reshape_write;
4323 read_bio->bi_flags &= (~0UL << BIO_RESET_BITS);
4324 read_bio->bi_error = 0;
4325 read_bio->bi_vcnt = 0;
4326 read_bio->bi_iter.bi_size = 0;
4327 r10_bio->master_bio = read_bio;
4328 r10_bio->read_slot = r10_bio->devs[r10_bio->read_slot].devnum;
4329
4330 /* Now find the locations in the new layout */

--- 17 unchanged lines hidden (view full) ---

4348 continue;
4349
4350 bio_reset(b);
4351 b->bi_bdev = rdev2->bdev;
4352 b->bi_iter.bi_sector = r10_bio->devs[s/2].addr +
4353 rdev2->new_data_offset;
4354 b->bi_private = r10_bio;
4355 b->bi_end_io = end_reshape_write;
4357 b->bi_rw = WRITE;
4356 bio_set_op_attrs(b, REQ_OP_WRITE, 0);
4358 b->bi_next = blist;
4359 blist = b;
4360 }
4361
4362 /* Now add as many pages as possible to all of these bios. */
4363
4364 nr_sectors = 0;
4365 for (s = 0 ; s < max_sectors; s += PAGE_SIZE >> 9) {

--- 151 unchanged lines hidden (view full) ---

4517 !test_bit(In_sync, &rdev->flags))
4518 goto failed;
4519
4520 addr = r10b->devs[slot].addr + idx * PAGE_SIZE;
4521 success = sync_page_io(rdev,
4522 addr,
4523 s << 9,
4524 bvec[idx].bv_page,
4357 b->bi_next = blist;
4358 blist = b;
4359 }
4360
4361 /* Now add as many pages as possible to all of these bios. */
4362
4363 nr_sectors = 0;
4364 for (s = 0 ; s < max_sectors; s += PAGE_SIZE >> 9) {

--- 151 unchanged lines hidden (view full) ---

4516 !test_bit(In_sync, &rdev->flags))
4517 goto failed;
4518
4519 addr = r10b->devs[slot].addr + idx * PAGE_SIZE;
4520 success = sync_page_io(rdev,
4521 addr,
4522 s << 9,
4523 bvec[idx].bv_page,
4525 READ, false);
4524 REQ_OP_READ, 0, false);
4526 if (success)
4527 break;
4528 failed:
4529 slot++;
4530 if (slot >= conf->copies)
4531 slot = 0;
4532 if (slot == first_slot)
4533 break;

--- 131 unchanged lines hidden ---
4525 if (success)
4526 break;
4527 failed:
4528 slot++;
4529 if (slot >= conf->copies)
4530 slot = 0;
4531 if (slot == first_slot)
4532 break;

--- 131 unchanged lines hidden ---