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 */ |