dm-raid1.c (8c57a5e7b2820f349c95b8c8393fec1e0f4070d2) | dm-raid1.c (70246286e94c335b5bea0cbc68a17a96dd620281) |
---|---|
1/* 2 * Copyright (C) 2003 Sistina Software Limited. 3 * Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. 4 * 5 * This file is released under the GPL. 6 */ 7 8#include "dm-bio-record.h" --- 246 unchanged lines hidden (view full) --- 255{ 256 struct mirror_set *ms = ti->private; 257 unsigned long error_bits; 258 259 unsigned int i; 260 struct dm_io_region io[ms->nr_mirrors]; 261 struct mirror *m; 262 struct dm_io_request io_req = { | 1/* 2 * Copyright (C) 2003 Sistina Software Limited. 3 * Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. 4 * 5 * This file is released under the GPL. 6 */ 7 8#include "dm-bio-record.h" --- 246 unchanged lines hidden (view full) --- 255{ 256 struct mirror_set *ms = ti->private; 257 unsigned long error_bits; 258 259 unsigned int i; 260 struct dm_io_region io[ms->nr_mirrors]; 261 struct mirror *m; 262 struct dm_io_request io_req = { |
263 .bi_rw = WRITE_FLUSH, | 263 .bi_op = REQ_OP_WRITE, 264 .bi_op_flags = WRITE_FLUSH, |
264 .mem.type = DM_IO_KMEM, 265 .mem.ptr.addr = NULL, 266 .client = ms->io_client, 267 }; 268 269 for (i = 0, m = ms->mirror; i < ms->nr_mirrors; i++, m++) { 270 io[i].bdev = m->dev->bdev; 271 io[i].sector = 0; --- 250 unchanged lines hidden (view full) --- 522 } 523 524 fail_mirror(m, DM_RAID1_READ_ERROR); 525 526 if (likely(default_ok(m)) || mirror_available(m->ms, bio)) { 527 DMWARN_LIMIT("Read failure on mirror device %s. " 528 "Trying alternative device.", 529 m->dev->name); | 265 .mem.type = DM_IO_KMEM, 266 .mem.ptr.addr = NULL, 267 .client = ms->io_client, 268 }; 269 270 for (i = 0, m = ms->mirror; i < ms->nr_mirrors; i++, m++) { 271 io[i].bdev = m->dev->bdev; 272 io[i].sector = 0; --- 250 unchanged lines hidden (view full) --- 523 } 524 525 fail_mirror(m, DM_RAID1_READ_ERROR); 526 527 if (likely(default_ok(m)) || mirror_available(m->ms, bio)) { 528 DMWARN_LIMIT("Read failure on mirror device %s. " 529 "Trying alternative device.", 530 m->dev->name); |
530 queue_bio(m->ms, bio, bio_rw(bio)); | 531 queue_bio(m->ms, bio, bio_data_dir(bio)); |
531 return; 532 } 533 534 DMERR_LIMIT("Read failure on mirror device %s. Failing I/O.", 535 m->dev->name); 536 bio_io_error(bio); 537} 538 539/* Asynchronous read. */ 540static void read_async_bio(struct mirror *m, struct bio *bio) 541{ 542 struct dm_io_region io; 543 struct dm_io_request io_req = { | 532 return; 533 } 534 535 DMERR_LIMIT("Read failure on mirror device %s. Failing I/O.", 536 m->dev->name); 537 bio_io_error(bio); 538} 539 540/* Asynchronous read. */ 541static void read_async_bio(struct mirror *m, struct bio *bio) 542{ 543 struct dm_io_region io; 544 struct dm_io_request io_req = { |
544 .bi_rw = READ, | 545 .bi_op = REQ_OP_READ, 546 .bi_op_flags = 0, |
545 .mem.type = DM_IO_BIO, 546 .mem.ptr.bio = bio, 547 .notify.fn = read_callback, 548 .notify.context = bio, 549 .client = m->ms->io_client, 550 }; 551 552 map_region(&io, m, bio); --- 66 unchanged lines hidden (view full) --- 619 bio_endio(bio); 620 return; 621 } 622 623 /* 624 * If the bio is discard, return an error, but do not 625 * degrade the array. 626 */ | 547 .mem.type = DM_IO_BIO, 548 .mem.ptr.bio = bio, 549 .notify.fn = read_callback, 550 .notify.context = bio, 551 .client = m->ms->io_client, 552 }; 553 554 map_region(&io, m, bio); --- 66 unchanged lines hidden (view full) --- 621 bio_endio(bio); 622 return; 623 } 624 625 /* 626 * If the bio is discard, return an error, but do not 627 * degrade the array. 628 */ |
627 if (bio->bi_rw & REQ_DISCARD) { | 629 if (bio_op(bio) == REQ_OP_DISCARD) { |
628 bio->bi_error = -EOPNOTSUPP; 629 bio_endio(bio); 630 return; 631 } 632 633 for (i = 0; i < ms->nr_mirrors; i++) 634 if (test_bit(i, &error)) 635 fail_mirror(ms->mirror + i, DM_RAID1_WRITE_ERROR); --- 13 unchanged lines hidden (view full) --- 649} 650 651static void do_write(struct mirror_set *ms, struct bio *bio) 652{ 653 unsigned int i; 654 struct dm_io_region io[ms->nr_mirrors], *dest = io; 655 struct mirror *m; 656 struct dm_io_request io_req = { | 630 bio->bi_error = -EOPNOTSUPP; 631 bio_endio(bio); 632 return; 633 } 634 635 for (i = 0; i < ms->nr_mirrors; i++) 636 if (test_bit(i, &error)) 637 fail_mirror(ms->mirror + i, DM_RAID1_WRITE_ERROR); --- 13 unchanged lines hidden (view full) --- 651} 652 653static void do_write(struct mirror_set *ms, struct bio *bio) 654{ 655 unsigned int i; 656 struct dm_io_region io[ms->nr_mirrors], *dest = io; 657 struct mirror *m; 658 struct dm_io_request io_req = { |
657 .bi_rw = WRITE | (bio->bi_rw & WRITE_FLUSH_FUA), | 659 .bi_op = REQ_OP_WRITE, 660 .bi_op_flags = bio->bi_rw & WRITE_FLUSH_FUA, |
658 .mem.type = DM_IO_BIO, 659 .mem.ptr.bio = bio, 660 .notify.fn = write_callback, 661 .notify.context = bio, 662 .client = ms->io_client, 663 }; 664 | 661 .mem.type = DM_IO_BIO, 662 .mem.ptr.bio = bio, 663 .notify.fn = write_callback, 664 .notify.context = bio, 665 .client = ms->io_client, 666 }; 667 |
665 if (bio->bi_rw & REQ_DISCARD) { 666 io_req.bi_rw |= REQ_DISCARD; | 668 if (bio_op(bio) == REQ_OP_DISCARD) { 669 io_req.bi_op = REQ_OP_DISCARD; |
667 io_req.mem.type = DM_IO_KMEM; 668 io_req.mem.ptr.addr = NULL; 669 } 670 671 for (i = 0, m = ms->mirror; i < ms->nr_mirrors; i++, m++) 672 map_region(dest++, m, bio); 673 674 /* --- 21 unchanged lines hidden (view full) --- 696 * Classify each write. 697 */ 698 bio_list_init(&sync); 699 bio_list_init(&nosync); 700 bio_list_init(&recover); 701 bio_list_init(&requeue); 702 703 while ((bio = bio_list_pop(writes))) { | 670 io_req.mem.type = DM_IO_KMEM; 671 io_req.mem.ptr.addr = NULL; 672 } 673 674 for (i = 0, m = ms->mirror; i < ms->nr_mirrors; i++, m++) 675 map_region(dest++, m, bio); 676 677 /* --- 21 unchanged lines hidden (view full) --- 699 * Classify each write. 700 */ 701 bio_list_init(&sync); 702 bio_list_init(&nosync); 703 bio_list_init(&recover); 704 bio_list_init(&requeue); 705 706 while ((bio = bio_list_pop(writes))) { |
704 if ((bio->bi_rw & REQ_FLUSH) || 705 (bio->bi_rw & REQ_DISCARD)) { | 707 if ((bio->bi_rw & REQ_PREFLUSH) || 708 (bio_op(bio) == REQ_OP_DISCARD)) { |
706 bio_list_add(&sync, bio); 707 continue; 708 } 709 710 region = dm_rh_bio_to_region(ms->rh, bio); 711 712 if (log->type->is_remote_recovering && 713 log->type->is_remote_recovering(log, region)) { --- 471 unchanged lines hidden (view full) --- 1185 free_context(ms, ti, ms->nr_mirrors); 1186} 1187 1188/* 1189 * Mirror mapping function 1190 */ 1191static int mirror_map(struct dm_target *ti, struct bio *bio) 1192{ | 709 bio_list_add(&sync, bio); 710 continue; 711 } 712 713 region = dm_rh_bio_to_region(ms->rh, bio); 714 715 if (log->type->is_remote_recovering && 716 log->type->is_remote_recovering(log, region)) { --- 471 unchanged lines hidden (view full) --- 1188 free_context(ms, ti, ms->nr_mirrors); 1189} 1190 1191/* 1192 * Mirror mapping function 1193 */ 1194static int mirror_map(struct dm_target *ti, struct bio *bio) 1195{ |
1193 int r, rw = bio_rw(bio); | 1196 int r, rw = bio_data_dir(bio); |
1194 struct mirror *m; 1195 struct mirror_set *ms = ti->private; 1196 struct dm_dirty_log *log = dm_rh_dirty_log(ms->rh); 1197 struct dm_raid1_bio_record *bio_record = 1198 dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record)); 1199 1200 bio_record->details.bi_bdev = NULL; 1201 --- 7 unchanged lines hidden (view full) --- 1209 r = log->type->in_sync(log, dm_rh_bio_to_region(ms->rh, bio), 0); 1210 if (r < 0 && r != -EWOULDBLOCK) 1211 return r; 1212 1213 /* 1214 * If region is not in-sync queue the bio. 1215 */ 1216 if (!r || (r == -EWOULDBLOCK)) { | 1197 struct mirror *m; 1198 struct mirror_set *ms = ti->private; 1199 struct dm_dirty_log *log = dm_rh_dirty_log(ms->rh); 1200 struct dm_raid1_bio_record *bio_record = 1201 dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record)); 1202 1203 bio_record->details.bi_bdev = NULL; 1204 --- 7 unchanged lines hidden (view full) --- 1212 r = log->type->in_sync(log, dm_rh_bio_to_region(ms->rh, bio), 0); 1213 if (r < 0 && r != -EWOULDBLOCK) 1214 return r; 1215 1216 /* 1217 * If region is not in-sync queue the bio. 1218 */ 1219 if (!r || (r == -EWOULDBLOCK)) { |
1217 if (rw == READA) | 1220 if (bio->bi_rw & REQ_RAHEAD) |
1218 return -EWOULDBLOCK; 1219 1220 queue_bio(ms, bio, rw); 1221 return DM_MAPIO_SUBMITTED; 1222 } 1223 1224 /* 1225 * The region is in-sync and we can perform reads directly. --- 8 unchanged lines hidden (view full) --- 1234 1235 map_bio(m, bio); 1236 1237 return DM_MAPIO_REMAPPED; 1238} 1239 1240static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) 1241{ | 1221 return -EWOULDBLOCK; 1222 1223 queue_bio(ms, bio, rw); 1224 return DM_MAPIO_SUBMITTED; 1225 } 1226 1227 /* 1228 * The region is in-sync and we can perform reads directly. --- 8 unchanged lines hidden (view full) --- 1237 1238 map_bio(m, bio); 1239 1240 return DM_MAPIO_REMAPPED; 1241} 1242 1243static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) 1244{ |
1242 int rw = bio_rw(bio); | 1245 int rw = bio_data_dir(bio); |
1243 struct mirror_set *ms = (struct mirror_set *) ti->private; 1244 struct mirror *m = NULL; 1245 struct dm_bio_details *bd = NULL; 1246 struct dm_raid1_bio_record *bio_record = 1247 dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record)); 1248 1249 /* 1250 * We need to dec pending if this was a write. 1251 */ 1252 if (rw == WRITE) { | 1246 struct mirror_set *ms = (struct mirror_set *) ti->private; 1247 struct mirror *m = NULL; 1248 struct dm_bio_details *bd = NULL; 1249 struct dm_raid1_bio_record *bio_record = 1250 dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record)); 1251 1252 /* 1253 * We need to dec pending if this was a write. 1254 */ 1255 if (rw == WRITE) { |
1253 if (!(bio->bi_rw & (REQ_FLUSH | REQ_DISCARD))) | 1256 if (!(bio->bi_rw & REQ_PREFLUSH) && 1257 bio_op(bio) != REQ_OP_DISCARD) |
1254 dm_rh_dec(ms->rh, bio_record->write_region); 1255 return error; 1256 } 1257 1258 if (error == -EOPNOTSUPP) 1259 goto out; 1260 1261 if ((error == -EWOULDBLOCK) && (bio->bi_rw & REQ_RAHEAD)) --- 240 unchanged lines hidden --- | 1258 dm_rh_dec(ms->rh, bio_record->write_region); 1259 return error; 1260 } 1261 1262 if (error == -EOPNOTSUPP) 1263 goto out; 1264 1265 if ((error == -EWOULDBLOCK) && (bio->bi_rw & REQ_RAHEAD)) --- 240 unchanged lines hidden --- |