diff options
Diffstat (limited to 'drivers/md/dm-raid1.c')
| -rw-r--r-- | drivers/md/dm-raid1.c | 132 |
1 files changed, 66 insertions, 66 deletions
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 762cb086bb7f..ff05fe893083 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
| @@ -7,9 +7,6 @@ | |||
| 7 | #include "dm.h" | 7 | #include "dm.h" |
| 8 | #include "dm-bio-list.h" | 8 | #include "dm-bio-list.h" |
| 9 | #include "dm-bio-record.h" | 9 | #include "dm-bio-record.h" |
| 10 | #include "dm-io.h" | ||
| 11 | #include "dm-log.h" | ||
| 12 | #include "kcopyd.h" | ||
| 13 | 10 | ||
| 14 | #include <linux/ctype.h> | 11 | #include <linux/ctype.h> |
| 15 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| @@ -22,6 +19,9 @@ | |||
| 22 | #include <linux/workqueue.h> | 19 | #include <linux/workqueue.h> |
| 23 | #include <linux/log2.h> | 20 | #include <linux/log2.h> |
| 24 | #include <linux/hardirq.h> | 21 | #include <linux/hardirq.h> |
| 22 | #include <linux/dm-io.h> | ||
| 23 | #include <linux/dm-dirty-log.h> | ||
| 24 | #include <linux/dm-kcopyd.h> | ||
| 25 | 25 | ||
| 26 | #define DM_MSG_PREFIX "raid1" | 26 | #define DM_MSG_PREFIX "raid1" |
| 27 | #define DM_IO_PAGES 64 | 27 | #define DM_IO_PAGES 64 |
| @@ -74,7 +74,7 @@ struct region_hash { | |||
| 74 | unsigned region_shift; | 74 | unsigned region_shift; |
| 75 | 75 | ||
| 76 | /* holds persistent region state */ | 76 | /* holds persistent region state */ |
| 77 | struct dirty_log *log; | 77 | struct dm_dirty_log *log; |
| 78 | 78 | ||
| 79 | /* hash table */ | 79 | /* hash table */ |
| 80 | rwlock_t hash_lock; | 80 | rwlock_t hash_lock; |
| @@ -133,7 +133,7 @@ struct mirror_set { | |||
| 133 | struct dm_target *ti; | 133 | struct dm_target *ti; |
| 134 | struct list_head list; | 134 | struct list_head list; |
| 135 | struct region_hash rh; | 135 | struct region_hash rh; |
| 136 | struct kcopyd_client *kcopyd_client; | 136 | struct dm_kcopyd_client *kcopyd_client; |
| 137 | uint64_t features; | 137 | uint64_t features; |
| 138 | 138 | ||
| 139 | spinlock_t lock; /* protects the lists */ | 139 | spinlock_t lock; /* protects the lists */ |
| @@ -154,6 +154,9 @@ struct mirror_set { | |||
| 154 | 154 | ||
| 155 | struct workqueue_struct *kmirrord_wq; | 155 | struct workqueue_struct *kmirrord_wq; |
| 156 | struct work_struct kmirrord_work; | 156 | struct work_struct kmirrord_work; |
| 157 | struct timer_list timer; | ||
| 158 | unsigned long timer_pending; | ||
| 159 | |||
| 157 | struct work_struct trigger_event; | 160 | struct work_struct trigger_event; |
| 158 | 161 | ||
| 159 | unsigned int nr_mirrors; | 162 | unsigned int nr_mirrors; |
| @@ -178,13 +181,32 @@ static void wake(struct mirror_set *ms) | |||
| 178 | queue_work(ms->kmirrord_wq, &ms->kmirrord_work); | 181 | queue_work(ms->kmirrord_wq, &ms->kmirrord_work); |
| 179 | } | 182 | } |
| 180 | 183 | ||
| 184 | static void delayed_wake_fn(unsigned long data) | ||
| 185 | { | ||
| 186 | struct mirror_set *ms = (struct mirror_set *) data; | ||
| 187 | |||
| 188 | clear_bit(0, &ms->timer_pending); | ||
| 189 | wake(ms); | ||
| 190 | } | ||
| 191 | |||
| 192 | static void delayed_wake(struct mirror_set *ms) | ||
| 193 | { | ||
| 194 | if (test_and_set_bit(0, &ms->timer_pending)) | ||
| 195 | return; | ||
| 196 | |||
| 197 | ms->timer.expires = jiffies + HZ / 5; | ||
| 198 | ms->timer.data = (unsigned long) ms; | ||
| 199 | ms->timer.function = delayed_wake_fn; | ||
| 200 | add_timer(&ms->timer); | ||
| 201 | } | ||
| 202 | |||
| 181 | /* FIXME move this */ | 203 | /* FIXME move this */ |
| 182 | static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw); | 204 | static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw); |
| 183 | 205 | ||
| 184 | #define MIN_REGIONS 64 | 206 | #define MIN_REGIONS 64 |
| 185 | #define MAX_RECOVERY 1 | 207 | #define MAX_RECOVERY 1 |
| 186 | static int rh_init(struct region_hash *rh, struct mirror_set *ms, | 208 | static int rh_init(struct region_hash *rh, struct mirror_set *ms, |
| 187 | struct dirty_log *log, uint32_t region_size, | 209 | struct dm_dirty_log *log, uint32_t region_size, |
| 188 | region_t nr_regions) | 210 | region_t nr_regions) |
| 189 | { | 211 | { |
| 190 | unsigned int nr_buckets, max_buckets; | 212 | unsigned int nr_buckets, max_buckets; |
| @@ -249,7 +271,7 @@ static void rh_exit(struct region_hash *rh) | |||
| 249 | } | 271 | } |
| 250 | 272 | ||
| 251 | if (rh->log) | 273 | if (rh->log) |
| 252 | dm_destroy_dirty_log(rh->log); | 274 | dm_dirty_log_destroy(rh->log); |
| 253 | if (rh->region_pool) | 275 | if (rh->region_pool) |
| 254 | mempool_destroy(rh->region_pool); | 276 | mempool_destroy(rh->region_pool); |
| 255 | vfree(rh->buckets); | 277 | vfree(rh->buckets); |
| @@ -405,24 +427,22 @@ static void rh_update_states(struct region_hash *rh) | |||
| 405 | write_lock_irq(&rh->hash_lock); | 427 | write_lock_irq(&rh->hash_lock); |
| 406 | spin_lock(&rh->region_lock); | 428 | spin_lock(&rh->region_lock); |
| 407 | if (!list_empty(&rh->clean_regions)) { | 429 | if (!list_empty(&rh->clean_regions)) { |
| 408 | list_splice(&rh->clean_regions, &clean); | 430 | list_splice_init(&rh->clean_regions, &clean); |
| 409 | INIT_LIST_HEAD(&rh->clean_regions); | ||
| 410 | 431 | ||
| 411 | list_for_each_entry(reg, &clean, list) | 432 | list_for_each_entry(reg, &clean, list) |
| 412 | list_del(®->hash_list); | 433 | list_del(®->hash_list); |
| 413 | } | 434 | } |
| 414 | 435 | ||
| 415 | if (!list_empty(&rh->recovered_regions)) { | 436 | if (!list_empty(&rh->recovered_regions)) { |
| 416 | list_splice(&rh->recovered_regions, &recovered); | 437 | list_splice_init(&rh->recovered_regions, &recovered); |
| 417 | INIT_LIST_HEAD(&rh->recovered_regions); | ||
| 418 | 438 | ||
| 419 | list_for_each_entry (reg, &recovered, list) | 439 | list_for_each_entry (reg, &recovered, list) |
| 420 | list_del(®->hash_list); | 440 | list_del(®->hash_list); |
| 421 | } | 441 | } |
| 422 | 442 | ||
| 423 | if (!list_empty(&rh->failed_recovered_regions)) { | 443 | if (!list_empty(&rh->failed_recovered_regions)) { |
| 424 | list_splice(&rh->failed_recovered_regions, &failed_recovered); | 444 | list_splice_init(&rh->failed_recovered_regions, |
| 425 | INIT_LIST_HEAD(&rh->failed_recovered_regions); | 445 | &failed_recovered); |
| 426 | 446 | ||
| 427 | list_for_each_entry(reg, &failed_recovered, list) | 447 | list_for_each_entry(reg, &failed_recovered, list) |
| 428 | list_del(®->hash_list); | 448 | list_del(®->hash_list); |
| @@ -790,7 +810,7 @@ static int recover(struct mirror_set *ms, struct region *reg) | |||
| 790 | { | 810 | { |
| 791 | int r; | 811 | int r; |
| 792 | unsigned int i; | 812 | unsigned int i; |
| 793 | struct io_region from, to[KCOPYD_MAX_REGIONS], *dest; | 813 | struct dm_io_region from, to[DM_KCOPYD_MAX_REGIONS], *dest; |
| 794 | struct mirror *m; | 814 | struct mirror *m; |
| 795 | unsigned long flags = 0; | 815 | unsigned long flags = 0; |
| 796 | 816 | ||
| @@ -822,9 +842,9 @@ static int recover(struct mirror_set *ms, struct region *reg) | |||
| 822 | } | 842 | } |
| 823 | 843 | ||
| 824 | /* hand to kcopyd */ | 844 | /* hand to kcopyd */ |
| 825 | set_bit(KCOPYD_IGNORE_ERROR, &flags); | 845 | set_bit(DM_KCOPYD_IGNORE_ERROR, &flags); |
| 826 | r = kcopyd_copy(ms->kcopyd_client, &from, ms->nr_mirrors - 1, to, flags, | 846 | r = dm_kcopyd_copy(ms->kcopyd_client, &from, ms->nr_mirrors - 1, to, |
| 827 | recovery_complete, reg); | 847 | flags, recovery_complete, reg); |
| 828 | 848 | ||
| 829 | return r; | 849 | return r; |
| 830 | } | 850 | } |
| @@ -833,7 +853,7 @@ static void do_recovery(struct mirror_set *ms) | |||
| 833 | { | 853 | { |
| 834 | int r; | 854 | int r; |
| 835 | struct region *reg; | 855 | struct region *reg; |
| 836 | struct dirty_log *log = ms->rh.log; | 856 | struct dm_dirty_log *log = ms->rh.log; |
| 837 | 857 | ||
| 838 | /* | 858 | /* |
| 839 | * Start quiescing some regions. | 859 | * Start quiescing some regions. |
| @@ -909,7 +929,7 @@ static void map_bio(struct mirror *m, struct bio *bio) | |||
| 909 | bio->bi_sector = map_sector(m, bio); | 929 | bio->bi_sector = map_sector(m, bio); |
| 910 | } | 930 | } |
| 911 | 931 | ||
| 912 | static void map_region(struct io_region *io, struct mirror *m, | 932 | static void map_region(struct dm_io_region *io, struct mirror *m, |
| 913 | struct bio *bio) | 933 | struct bio *bio) |
| 914 | { | 934 | { |
| 915 | io->bdev = m->dev->bdev; | 935 | io->bdev = m->dev->bdev; |
| @@ -951,7 +971,7 @@ static void read_callback(unsigned long error, void *context) | |||
| 951 | /* Asynchronous read. */ | 971 | /* Asynchronous read. */ |
| 952 | static void read_async_bio(struct mirror *m, struct bio *bio) | 972 | static void read_async_bio(struct mirror *m, struct bio *bio) |
| 953 | { | 973 | { |
| 954 | struct io_region io; | 974 | struct dm_io_region io; |
| 955 | struct dm_io_request io_req = { | 975 | struct dm_io_request io_req = { |
| 956 | .bi_rw = READ, | 976 | .bi_rw = READ, |
| 957 | .mem.type = DM_IO_BVEC, | 977 | .mem.type = DM_IO_BVEC, |
| @@ -1019,7 +1039,7 @@ static void __bio_mark_nosync(struct mirror_set *ms, | |||
| 1019 | { | 1039 | { |
| 1020 | unsigned long flags; | 1040 | unsigned long flags; |
| 1021 | struct region_hash *rh = &ms->rh; | 1041 | struct region_hash *rh = &ms->rh; |
| 1022 | struct dirty_log *log = ms->rh.log; | 1042 | struct dm_dirty_log *log = ms->rh.log; |
| 1023 | struct region *reg; | 1043 | struct region *reg; |
| 1024 | region_t region = bio_to_region(rh, bio); | 1044 | region_t region = bio_to_region(rh, bio); |
| 1025 | int recovering = 0; | 1045 | int recovering = 0; |
| @@ -1107,7 +1127,7 @@ out: | |||
| 1107 | static void do_write(struct mirror_set *ms, struct bio *bio) | 1127 | static void do_write(struct mirror_set *ms, struct bio *bio) |
| 1108 | { | 1128 | { |
| 1109 | unsigned int i; | 1129 | unsigned int i; |
| 1110 | struct io_region io[ms->nr_mirrors], *dest = io; | 1130 | struct dm_io_region io[ms->nr_mirrors], *dest = io; |
| 1111 | struct mirror *m; | 1131 | struct mirror *m; |
| 1112 | struct dm_io_request io_req = { | 1132 | struct dm_io_request io_req = { |
| 1113 | .bi_rw = WRITE, | 1133 | .bi_rw = WRITE, |
| @@ -1182,6 +1202,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) | |||
| 1182 | spin_lock_irq(&ms->lock); | 1202 | spin_lock_irq(&ms->lock); |
| 1183 | bio_list_merge(&ms->failures, &sync); | 1203 | bio_list_merge(&ms->failures, &sync); |
| 1184 | spin_unlock_irq(&ms->lock); | 1204 | spin_unlock_irq(&ms->lock); |
| 1205 | wake(ms); | ||
| 1185 | } else | 1206 | } else |
| 1186 | while ((bio = bio_list_pop(&sync))) | 1207 | while ((bio = bio_list_pop(&sync))) |
| 1187 | do_write(ms, bio); | 1208 | do_write(ms, bio); |
| @@ -1241,7 +1262,7 @@ static void do_failures(struct mirror_set *ms, struct bio_list *failures) | |||
| 1241 | bio_list_merge(&ms->failures, failures); | 1262 | bio_list_merge(&ms->failures, failures); |
| 1242 | spin_unlock_irq(&ms->lock); | 1263 | spin_unlock_irq(&ms->lock); |
| 1243 | 1264 | ||
| 1244 | wake(ms); | 1265 | delayed_wake(ms); |
| 1245 | } | 1266 | } |
| 1246 | 1267 | ||
| 1247 | static void trigger_event(struct work_struct *work) | 1268 | static void trigger_event(struct work_struct *work) |
| @@ -1255,7 +1276,7 @@ static void trigger_event(struct work_struct *work) | |||
| 1255 | /*----------------------------------------------------------------- | 1276 | /*----------------------------------------------------------------- |
| 1256 | * kmirrord | 1277 | * kmirrord |
| 1257 | *---------------------------------------------------------------*/ | 1278 | *---------------------------------------------------------------*/ |
| 1258 | static int _do_mirror(struct work_struct *work) | 1279 | static void do_mirror(struct work_struct *work) |
| 1259 | { | 1280 | { |
| 1260 | struct mirror_set *ms =container_of(work, struct mirror_set, | 1281 | struct mirror_set *ms =container_of(work, struct mirror_set, |
| 1261 | kmirrord_work); | 1282 | kmirrord_work); |
| @@ -1277,23 +1298,7 @@ static int _do_mirror(struct work_struct *work) | |||
| 1277 | do_writes(ms, &writes); | 1298 | do_writes(ms, &writes); |
| 1278 | do_failures(ms, &failures); | 1299 | do_failures(ms, &failures); |
| 1279 | 1300 | ||
| 1280 | return (ms->failures.head) ? 1 : 0; | 1301 | dm_table_unplug_all(ms->ti->table); |
| 1281 | } | ||
| 1282 | |||
| 1283 | static void do_mirror(struct work_struct *work) | ||
| 1284 | { | ||
| 1285 | /* | ||
| 1286 | * If _do_mirror returns 1, we give it | ||
| 1287 | * another shot. This helps for cases like | ||
| 1288 | * 'suspend' where we call flush_workqueue | ||
| 1289 | * and expect all work to be finished. If | ||
| 1290 | * a failure happens during a suspend, we | ||
| 1291 | * couldn't issue a 'wake' because it would | ||
| 1292 | * not be honored. Therefore, we return '1' | ||
| 1293 | * from _do_mirror, and retry here. | ||
| 1294 | */ | ||
| 1295 | while (_do_mirror(work)) | ||
| 1296 | schedule(); | ||
| 1297 | } | 1302 | } |
| 1298 | 1303 | ||
| 1299 | 1304 | ||
| @@ -1303,7 +1308,7 @@ static void do_mirror(struct work_struct *work) | |||
| 1303 | static struct mirror_set *alloc_context(unsigned int nr_mirrors, | 1308 | static struct mirror_set *alloc_context(unsigned int nr_mirrors, |
| 1304 | uint32_t region_size, | 1309 | uint32_t region_size, |
| 1305 | struct dm_target *ti, | 1310 | struct dm_target *ti, |
| 1306 | struct dirty_log *dl) | 1311 | struct dm_dirty_log *dl) |
| 1307 | { | 1312 | { |
| 1308 | size_t len; | 1313 | size_t len; |
| 1309 | struct mirror_set *ms = NULL; | 1314 | struct mirror_set *ms = NULL; |
| @@ -1403,12 +1408,12 @@ static int get_mirror(struct mirror_set *ms, struct dm_target *ti, | |||
| 1403 | /* | 1408 | /* |
| 1404 | * Create dirty log: log_type #log_params <log_params> | 1409 | * Create dirty log: log_type #log_params <log_params> |
| 1405 | */ | 1410 | */ |
| 1406 | static struct dirty_log *create_dirty_log(struct dm_target *ti, | 1411 | static struct dm_dirty_log *create_dirty_log(struct dm_target *ti, |
| 1407 | unsigned int argc, char **argv, | 1412 | unsigned int argc, char **argv, |
| 1408 | unsigned int *args_used) | 1413 | unsigned int *args_used) |
| 1409 | { | 1414 | { |
| 1410 | unsigned int param_count; | 1415 | unsigned int param_count; |
| 1411 | struct dirty_log *dl; | 1416 | struct dm_dirty_log *dl; |
| 1412 | 1417 | ||
| 1413 | if (argc < 2) { | 1418 | if (argc < 2) { |
| 1414 | ti->error = "Insufficient mirror log arguments"; | 1419 | ti->error = "Insufficient mirror log arguments"; |
| @@ -1427,7 +1432,7 @@ static struct dirty_log *create_dirty_log(struct dm_target *ti, | |||
| 1427 | return NULL; | 1432 | return NULL; |
| 1428 | } | 1433 | } |
| 1429 | 1434 | ||
| 1430 | dl = dm_create_dirty_log(argv[0], ti, param_count, argv + 2); | 1435 | dl = dm_dirty_log_create(argv[0], ti, param_count, argv + 2); |
| 1431 | if (!dl) { | 1436 | if (!dl) { |
| 1432 | ti->error = "Error creating mirror dirty log"; | 1437 | ti->error = "Error creating mirror dirty log"; |
| 1433 | return NULL; | 1438 | return NULL; |
| @@ -1435,7 +1440,7 @@ static struct dirty_log *create_dirty_log(struct dm_target *ti, | |||
| 1435 | 1440 | ||
| 1436 | if (!_check_region_size(ti, dl->type->get_region_size(dl))) { | 1441 | if (!_check_region_size(ti, dl->type->get_region_size(dl))) { |
| 1437 | ti->error = "Invalid region size"; | 1442 | ti->error = "Invalid region size"; |
| 1438 | dm_destroy_dirty_log(dl); | 1443 | dm_dirty_log_destroy(dl); |
| 1439 | return NULL; | 1444 | return NULL; |
| 1440 | } | 1445 | } |
| 1441 | 1446 | ||
| @@ -1496,7 +1501,7 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1496 | int r; | 1501 | int r; |
| 1497 | unsigned int nr_mirrors, m, args_used; | 1502 | unsigned int nr_mirrors, m, args_used; |
| 1498 | struct mirror_set *ms; | 1503 | struct mirror_set *ms; |
| 1499 | struct dirty_log *dl; | 1504 | struct dm_dirty_log *dl; |
| 1500 | 1505 | ||
| 1501 | dl = create_dirty_log(ti, argc, argv, &args_used); | 1506 | dl = create_dirty_log(ti, argc, argv, &args_used); |
| 1502 | if (!dl) | 1507 | if (!dl) |
| @@ -1506,9 +1511,9 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1506 | argc -= args_used; | 1511 | argc -= args_used; |
| 1507 | 1512 | ||
| 1508 | if (!argc || sscanf(argv[0], "%u", &nr_mirrors) != 1 || | 1513 | if (!argc || sscanf(argv[0], "%u", &nr_mirrors) != 1 || |
| 1509 | nr_mirrors < 2 || nr_mirrors > KCOPYD_MAX_REGIONS + 1) { | 1514 | nr_mirrors < 2 || nr_mirrors > DM_KCOPYD_MAX_REGIONS + 1) { |
| 1510 | ti->error = "Invalid number of mirrors"; | 1515 | ti->error = "Invalid number of mirrors"; |
| 1511 | dm_destroy_dirty_log(dl); | 1516 | dm_dirty_log_destroy(dl); |
| 1512 | return -EINVAL; | 1517 | return -EINVAL; |
| 1513 | } | 1518 | } |
| 1514 | 1519 | ||
| @@ -1516,13 +1521,13 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1516 | 1521 | ||
| 1517 | if (argc < nr_mirrors * 2) { | 1522 | if (argc < nr_mirrors * 2) { |
| 1518 | ti->error = "Too few mirror arguments"; | 1523 | ti->error = "Too few mirror arguments"; |
| 1519 | dm_destroy_dirty_log(dl); | 1524 | dm_dirty_log_destroy(dl); |
| 1520 | return -EINVAL; | 1525 | return -EINVAL; |
| 1521 | } | 1526 | } |
| 1522 | 1527 | ||
| 1523 | ms = alloc_context(nr_mirrors, dl->type->get_region_size(dl), ti, dl); | 1528 | ms = alloc_context(nr_mirrors, dl->type->get_region_size(dl), ti, dl); |
| 1524 | if (!ms) { | 1529 | if (!ms) { |
| 1525 | dm_destroy_dirty_log(dl); | 1530 | dm_dirty_log_destroy(dl); |
| 1526 | return -ENOMEM; | 1531 | return -ENOMEM; |
| 1527 | } | 1532 | } |
| 1528 | 1533 | ||
| @@ -1547,6 +1552,8 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1547 | goto err_free_context; | 1552 | goto err_free_context; |
| 1548 | } | 1553 | } |
| 1549 | INIT_WORK(&ms->kmirrord_work, do_mirror); | 1554 | INIT_WORK(&ms->kmirrord_work, do_mirror); |
| 1555 | init_timer(&ms->timer); | ||
| 1556 | ms->timer_pending = 0; | ||
| 1550 | INIT_WORK(&ms->trigger_event, trigger_event); | 1557 | INIT_WORK(&ms->trigger_event, trigger_event); |
| 1551 | 1558 | ||
| 1552 | r = parse_features(ms, argc, argv, &args_used); | 1559 | r = parse_features(ms, argc, argv, &args_used); |
| @@ -1571,7 +1578,7 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1571 | goto err_destroy_wq; | 1578 | goto err_destroy_wq; |
| 1572 | } | 1579 | } |
| 1573 | 1580 | ||
| 1574 | r = kcopyd_client_create(DM_IO_PAGES, &ms->kcopyd_client); | 1581 | r = dm_kcopyd_client_create(DM_IO_PAGES, &ms->kcopyd_client); |
| 1575 | if (r) | 1582 | if (r) |
| 1576 | goto err_destroy_wq; | 1583 | goto err_destroy_wq; |
| 1577 | 1584 | ||
| @@ -1589,8 +1596,9 @@ static void mirror_dtr(struct dm_target *ti) | |||
| 1589 | { | 1596 | { |
| 1590 | struct mirror_set *ms = (struct mirror_set *) ti->private; | 1597 | struct mirror_set *ms = (struct mirror_set *) ti->private; |
| 1591 | 1598 | ||
| 1599 | del_timer_sync(&ms->timer); | ||
| 1592 | flush_workqueue(ms->kmirrord_wq); | 1600 | flush_workqueue(ms->kmirrord_wq); |
| 1593 | kcopyd_client_destroy(ms->kcopyd_client); | 1601 | dm_kcopyd_client_destroy(ms->kcopyd_client); |
| 1594 | destroy_workqueue(ms->kmirrord_wq); | 1602 | destroy_workqueue(ms->kmirrord_wq); |
| 1595 | free_context(ms, ti, ms->nr_mirrors); | 1603 | free_context(ms, ti, ms->nr_mirrors); |
| 1596 | } | 1604 | } |
| @@ -1734,7 +1742,7 @@ out: | |||
| 1734 | static void mirror_presuspend(struct dm_target *ti) | 1742 | static void mirror_presuspend(struct dm_target *ti) |
| 1735 | { | 1743 | { |
| 1736 | struct mirror_set *ms = (struct mirror_set *) ti->private; | 1744 | struct mirror_set *ms = (struct mirror_set *) ti->private; |
| 1737 | struct dirty_log *log = ms->rh.log; | 1745 | struct dm_dirty_log *log = ms->rh.log; |
| 1738 | 1746 | ||
| 1739 | atomic_set(&ms->suspend, 1); | 1747 | atomic_set(&ms->suspend, 1); |
| 1740 | 1748 | ||
| @@ -1763,7 +1771,7 @@ static void mirror_presuspend(struct dm_target *ti) | |||
| 1763 | static void mirror_postsuspend(struct dm_target *ti) | 1771 | static void mirror_postsuspend(struct dm_target *ti) |
| 1764 | { | 1772 | { |
| 1765 | struct mirror_set *ms = ti->private; | 1773 | struct mirror_set *ms = ti->private; |
| 1766 | struct dirty_log *log = ms->rh.log; | 1774 | struct dm_dirty_log *log = ms->rh.log; |
| 1767 | 1775 | ||
| 1768 | if (log->type->postsuspend && log->type->postsuspend(log)) | 1776 | if (log->type->postsuspend && log->type->postsuspend(log)) |
| 1769 | /* FIXME: need better error handling */ | 1777 | /* FIXME: need better error handling */ |
| @@ -1773,7 +1781,7 @@ static void mirror_postsuspend(struct dm_target *ti) | |||
| 1773 | static void mirror_resume(struct dm_target *ti) | 1781 | static void mirror_resume(struct dm_target *ti) |
| 1774 | { | 1782 | { |
| 1775 | struct mirror_set *ms = ti->private; | 1783 | struct mirror_set *ms = ti->private; |
| 1776 | struct dirty_log *log = ms->rh.log; | 1784 | struct dm_dirty_log *log = ms->rh.log; |
| 1777 | 1785 | ||
| 1778 | atomic_set(&ms->suspend, 0); | 1786 | atomic_set(&ms->suspend, 0); |
| 1779 | if (log->type->resume && log->type->resume(log)) | 1787 | if (log->type->resume && log->type->resume(log)) |
| @@ -1811,7 +1819,7 @@ static int mirror_status(struct dm_target *ti, status_type_t type, | |||
| 1811 | { | 1819 | { |
| 1812 | unsigned int m, sz = 0; | 1820 | unsigned int m, sz = 0; |
| 1813 | struct mirror_set *ms = (struct mirror_set *) ti->private; | 1821 | struct mirror_set *ms = (struct mirror_set *) ti->private; |
| 1814 | struct dirty_log *log = ms->rh.log; | 1822 | struct dm_dirty_log *log = ms->rh.log; |
| 1815 | char buffer[ms->nr_mirrors + 1]; | 1823 | char buffer[ms->nr_mirrors + 1]; |
| 1816 | 1824 | ||
| 1817 | switch (type) { | 1825 | switch (type) { |
| @@ -1864,15 +1872,9 @@ static int __init dm_mirror_init(void) | |||
| 1864 | { | 1872 | { |
| 1865 | int r; | 1873 | int r; |
| 1866 | 1874 | ||
| 1867 | r = dm_dirty_log_init(); | ||
| 1868 | if (r) | ||
| 1869 | return r; | ||
| 1870 | |||
| 1871 | r = dm_register_target(&mirror_target); | 1875 | r = dm_register_target(&mirror_target); |
| 1872 | if (r < 0) { | 1876 | if (r < 0) |
| 1873 | DMERR("Failed to register mirror target"); | 1877 | DMERR("Failed to register mirror target"); |
| 1874 | dm_dirty_log_exit(); | ||
| 1875 | } | ||
| 1876 | 1878 | ||
| 1877 | return r; | 1879 | return r; |
| 1878 | } | 1880 | } |
| @@ -1884,8 +1886,6 @@ static void __exit dm_mirror_exit(void) | |||
| 1884 | r = dm_unregister_target(&mirror_target); | 1886 | r = dm_unregister_target(&mirror_target); |
| 1885 | if (r < 0) | 1887 | if (r < 0) |
| 1886 | DMERR("unregister failed %d", r); | 1888 | DMERR("unregister failed %d", r); |
| 1887 | |||
| 1888 | dm_dirty_log_exit(); | ||
| 1889 | } | 1889 | } |
| 1890 | 1890 | ||
| 1891 | /* Module hooks */ | 1891 | /* Module hooks */ |
