diff options
author | Jonathan Brassow <jbrassow@redhat.com> | 2009-01-05 22:05:19 -0500 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2009-01-05 22:05:19 -0500 |
commit | a159c1ac5f33c6cf0f5aa3c9d1ccdc82c907ee46 (patch) | |
tree | 2cb6bfd3f376e2366f3e3820ebd07a0a86a01cfc | |
parent | 4db6bfe02bdc7dc5048f46dd682a94801d029adc (diff) |
dm snapshot: extend exception store functions
Supply dm_add_exception as a callback to the read_metadata function.
Add a status function ready for a later patch and name the functions
consistently.
Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
-rw-r--r-- | drivers/md/dm-exception-store.c | 1 | ||||
-rw-r--r-- | drivers/md/dm-exception-store.h | 13 | ||||
-rw-r--r-- | drivers/md/dm-snap-persistent.c | 42 | ||||
-rw-r--r-- | drivers/md/dm-snap-transient.c | 21 | ||||
-rw-r--r-- | drivers/md/dm-snap.c | 9 | ||||
-rw-r--r-- | drivers/md/dm-snap.h | 6 |
6 files changed, 55 insertions, 37 deletions
diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index 74777e0f80df..dccbfb0e010f 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <linux/pagemap.h> | 11 | #include <linux/pagemap.h> |
12 | #include <linux/vmalloc.h> | 12 | #include <linux/vmalloc.h> |
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/device-mapper.h> | ||
15 | 14 | ||
16 | #define DM_MSG_PREFIX "snapshot exception stores" | 15 | #define DM_MSG_PREFIX "snapshot exception stores" |
17 | 16 | ||
diff --git a/drivers/md/dm-exception-store.h b/drivers/md/dm-exception-store.h index 78d1acec77e9..bb9f33d5daa2 100644 --- a/drivers/md/dm-exception-store.h +++ b/drivers/md/dm-exception-store.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #define _LINUX_DM_EXCEPTION_STORE | 11 | #define _LINUX_DM_EXCEPTION_STORE |
12 | 12 | ||
13 | #include <linux/blkdev.h> | 13 | #include <linux/blkdev.h> |
14 | #include <linux/device-mapper.h> | ||
14 | 15 | ||
15 | /* | 16 | /* |
16 | * The snapshot code deals with largish chunks of the disk at a | 17 | * The snapshot code deals with largish chunks of the disk at a |
@@ -37,7 +38,6 @@ struct dm_snap_exception { | |||
37 | * COW device). | 38 | * COW device). |
38 | */ | 39 | */ |
39 | struct dm_exception_store { | 40 | struct dm_exception_store { |
40 | |||
41 | /* | 41 | /* |
42 | * Destroys this object when you've finished with it. | 42 | * Destroys this object when you've finished with it. |
43 | */ | 43 | */ |
@@ -45,9 +45,13 @@ struct dm_exception_store { | |||
45 | 45 | ||
46 | /* | 46 | /* |
47 | * The target shouldn't read the COW device until this is | 47 | * The target shouldn't read the COW device until this is |
48 | * called. | 48 | * called. As exceptions are read from the COW, they are |
49 | * reported back via the callback. | ||
49 | */ | 50 | */ |
50 | int (*read_metadata) (struct dm_exception_store *store); | 51 | int (*read_metadata) (struct dm_exception_store *store, |
52 | int (*callback)(void *callback_context, | ||
53 | chunk_t old, chunk_t new), | ||
54 | void *callback_context); | ||
51 | 55 | ||
52 | /* | 56 | /* |
53 | * Find somewhere to store the next exception. | 57 | * Find somewhere to store the next exception. |
@@ -68,6 +72,9 @@ struct dm_exception_store { | |||
68 | */ | 72 | */ |
69 | void (*drop_snapshot) (struct dm_exception_store *store); | 73 | void (*drop_snapshot) (struct dm_exception_store *store); |
70 | 74 | ||
75 | int (*status) (struct dm_exception_store *store, status_type_t status, | ||
76 | char *result, unsigned int maxlen); | ||
77 | |||
71 | /* | 78 | /* |
72 | * Return how full the snapshot is. | 79 | * Return how full the snapshot is. |
73 | */ | 80 | */ |
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index 57c946c69ee7..936b34e0959f 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c | |||
@@ -395,7 +395,11 @@ static void write_exception(struct pstore *ps, | |||
395 | * 'full' is filled in to indicate if the area has been | 395 | * 'full' is filled in to indicate if the area has been |
396 | * filled. | 396 | * filled. |
397 | */ | 397 | */ |
398 | static int insert_exceptions(struct pstore *ps, int *full) | 398 | static int insert_exceptions(struct pstore *ps, |
399 | int (*callback)(void *callback_context, | ||
400 | chunk_t old, chunk_t new), | ||
401 | void *callback_context, | ||
402 | int *full) | ||
399 | { | 403 | { |
400 | int r; | 404 | int r; |
401 | unsigned int i; | 405 | unsigned int i; |
@@ -428,7 +432,7 @@ static int insert_exceptions(struct pstore *ps, int *full) | |||
428 | /* | 432 | /* |
429 | * Otherwise we add the exception to the snapshot. | 433 | * Otherwise we add the exception to the snapshot. |
430 | */ | 434 | */ |
431 | r = dm_add_exception(ps->snap, de.old_chunk, de.new_chunk); | 435 | r = callback(callback_context, de.old_chunk, de.new_chunk); |
432 | if (r) | 436 | if (r) |
433 | return r; | 437 | return r; |
434 | } | 438 | } |
@@ -436,7 +440,10 @@ static int insert_exceptions(struct pstore *ps, int *full) | |||
436 | return 0; | 440 | return 0; |
437 | } | 441 | } |
438 | 442 | ||
439 | static int read_exceptions(struct pstore *ps) | 443 | static int read_exceptions(struct pstore *ps, |
444 | int (*callback)(void *callback_context, chunk_t old, | ||
445 | chunk_t new), | ||
446 | void *callback_context) | ||
440 | { | 447 | { |
441 | int r, full = 1; | 448 | int r, full = 1; |
442 | 449 | ||
@@ -449,7 +456,7 @@ static int read_exceptions(struct pstore *ps) | |||
449 | if (r) | 456 | if (r) |
450 | return r; | 457 | return r; |
451 | 458 | ||
452 | r = insert_exceptions(ps, &full); | 459 | r = insert_exceptions(ps, callback, callback_context, &full); |
453 | if (r) | 460 | if (r) |
454 | return r; | 461 | return r; |
455 | } | 462 | } |
@@ -482,7 +489,10 @@ static void persistent_destroy(struct dm_exception_store *store) | |||
482 | kfree(ps); | 489 | kfree(ps); |
483 | } | 490 | } |
484 | 491 | ||
485 | static int persistent_read_metadata(struct dm_exception_store *store) | 492 | static int persistent_read_metadata(struct dm_exception_store *store, |
493 | int (*callback)(void *callback_context, | ||
494 | chunk_t old, chunk_t new), | ||
495 | void *callback_context) | ||
486 | { | 496 | { |
487 | int r, uninitialized_var(new_snapshot); | 497 | int r, uninitialized_var(new_snapshot); |
488 | struct pstore *ps = get_info(store); | 498 | struct pstore *ps = get_info(store); |
@@ -540,7 +550,7 @@ static int persistent_read_metadata(struct dm_exception_store *store) | |||
540 | /* | 550 | /* |
541 | * Read the metadata. | 551 | * Read the metadata. |
542 | */ | 552 | */ |
543 | r = read_exceptions(ps); | 553 | r = read_exceptions(ps, callback, callback_context); |
544 | if (r) | 554 | if (r) |
545 | return r; | 555 | return r; |
546 | } | 556 | } |
@@ -548,8 +558,8 @@ static int persistent_read_metadata(struct dm_exception_store *store) | |||
548 | return 0; | 558 | return 0; |
549 | } | 559 | } |
550 | 560 | ||
551 | static int persistent_prepare(struct dm_exception_store *store, | 561 | static int persistent_prepare_exception(struct dm_exception_store *store, |
552 | struct dm_snap_exception *e) | 562 | struct dm_snap_exception *e) |
553 | { | 563 | { |
554 | struct pstore *ps = get_info(store); | 564 | struct pstore *ps = get_info(store); |
555 | uint32_t stride; | 565 | uint32_t stride; |
@@ -575,10 +585,10 @@ static int persistent_prepare(struct dm_exception_store *store, | |||
575 | return 0; | 585 | return 0; |
576 | } | 586 | } |
577 | 587 | ||
578 | static void persistent_commit(struct dm_exception_store *store, | 588 | static void persistent_commit_exception(struct dm_exception_store *store, |
579 | struct dm_snap_exception *e, | 589 | struct dm_snap_exception *e, |
580 | void (*callback) (void *, int success), | 590 | void (*callback) (void *, int success), |
581 | void *callback_context) | 591 | void *callback_context) |
582 | { | 592 | { |
583 | unsigned int i; | 593 | unsigned int i; |
584 | struct pstore *ps = get_info(store); | 594 | struct pstore *ps = get_info(store); |
@@ -637,7 +647,7 @@ static void persistent_commit(struct dm_exception_store *store, | |||
637 | ps->callback_count = 0; | 647 | ps->callback_count = 0; |
638 | } | 648 | } |
639 | 649 | ||
640 | static void persistent_drop(struct dm_exception_store *store) | 650 | static void persistent_drop_snapshot(struct dm_exception_store *store) |
641 | { | 651 | { |
642 | struct pstore *ps = get_info(store); | 652 | struct pstore *ps = get_info(store); |
643 | 653 | ||
@@ -675,9 +685,9 @@ int dm_create_persistent(struct dm_exception_store *store) | |||
675 | 685 | ||
676 | store->destroy = persistent_destroy; | 686 | store->destroy = persistent_destroy; |
677 | store->read_metadata = persistent_read_metadata; | 687 | store->read_metadata = persistent_read_metadata; |
678 | store->prepare_exception = persistent_prepare; | 688 | store->prepare_exception = persistent_prepare_exception; |
679 | store->commit_exception = persistent_commit; | 689 | store->commit_exception = persistent_commit_exception; |
680 | store->drop_snapshot = persistent_drop; | 690 | store->drop_snapshot = persistent_drop_snapshot; |
681 | store->fraction_full = persistent_fraction_full; | 691 | store->fraction_full = persistent_fraction_full; |
682 | store->context = ps; | 692 | store->context = ps; |
683 | 693 | ||
diff --git a/drivers/md/dm-snap-transient.c b/drivers/md/dm-snap-transient.c index 2a781df57fef..7f6e2e6dcb0d 100644 --- a/drivers/md/dm-snap-transient.c +++ b/drivers/md/dm-snap-transient.c | |||
@@ -28,13 +28,16 @@ static void transient_destroy(struct dm_exception_store *store) | |||
28 | kfree(store->context); | 28 | kfree(store->context); |
29 | } | 29 | } |
30 | 30 | ||
31 | static int transient_read_metadata(struct dm_exception_store *store) | 31 | static int transient_read_metadata(struct dm_exception_store *store, |
32 | int (*callback)(void *callback_context, | ||
33 | chunk_t old, chunk_t new), | ||
34 | void *callback_context) | ||
32 | { | 35 | { |
33 | return 0; | 36 | return 0; |
34 | } | 37 | } |
35 | 38 | ||
36 | static int transient_prepare(struct dm_exception_store *store, | 39 | static int transient_prepare_exception(struct dm_exception_store *store, |
37 | struct dm_snap_exception *e) | 40 | struct dm_snap_exception *e) |
38 | { | 41 | { |
39 | struct transient_c *tc = (struct transient_c *) store->context; | 42 | struct transient_c *tc = (struct transient_c *) store->context; |
40 | sector_t size = get_dev_size(store->snap->cow->bdev); | 43 | sector_t size = get_dev_size(store->snap->cow->bdev); |
@@ -48,10 +51,10 @@ static int transient_prepare(struct dm_exception_store *store, | |||
48 | return 0; | 51 | return 0; |
49 | } | 52 | } |
50 | 53 | ||
51 | static void transient_commit(struct dm_exception_store *store, | 54 | static void transient_commit_exception(struct dm_exception_store *store, |
52 | struct dm_snap_exception *e, | 55 | struct dm_snap_exception *e, |
53 | void (*callback) (void *, int success), | 56 | void (*callback) (void *, int success), |
54 | void *callback_context) | 57 | void *callback_context) |
55 | { | 58 | { |
56 | /* Just succeed */ | 59 | /* Just succeed */ |
57 | callback(callback_context, 1); | 60 | callback(callback_context, 1); |
@@ -70,8 +73,8 @@ int dm_create_transient(struct dm_exception_store *store) | |||
70 | 73 | ||
71 | store->destroy = transient_destroy; | 74 | store->destroy = transient_destroy; |
72 | store->read_metadata = transient_read_metadata; | 75 | store->read_metadata = transient_read_metadata; |
73 | store->prepare_exception = transient_prepare; | 76 | store->prepare_exception = transient_prepare_exception; |
74 | store->commit_exception = transient_commit; | 77 | store->commit_exception = transient_commit_exception; |
75 | store->drop_snapshot = NULL; | 78 | store->drop_snapshot = NULL; |
76 | store->fraction_full = transient_fraction_full; | 79 | store->fraction_full = transient_fraction_full; |
77 | 80 | ||
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 018b567fc758..65ff82ff124e 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -430,8 +430,13 @@ out: | |||
430 | list_add(&new_e->hash_list, e ? &e->hash_list : l); | 430 | list_add(&new_e->hash_list, e ? &e->hash_list : l); |
431 | } | 431 | } |
432 | 432 | ||
433 | int dm_add_exception(struct dm_snapshot *s, chunk_t old, chunk_t new) | 433 | /* |
434 | * Callback used by the exception stores to load exceptions when | ||
435 | * initialising. | ||
436 | */ | ||
437 | static int dm_add_exception(void *context, chunk_t old, chunk_t new) | ||
434 | { | 438 | { |
439 | struct dm_snapshot *s = context; | ||
435 | struct dm_snap_exception *e; | 440 | struct dm_snap_exception *e; |
436 | 441 | ||
437 | e = alloc_exception(); | 442 | e = alloc_exception(); |
@@ -660,7 +665,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
660 | spin_lock_init(&s->tracked_chunk_lock); | 665 | spin_lock_init(&s->tracked_chunk_lock); |
661 | 666 | ||
662 | /* Metadata must only be loaded into one table at once */ | 667 | /* Metadata must only be loaded into one table at once */ |
663 | r = s->store.read_metadata(&s->store); | 668 | r = s->store.read_metadata(&s->store, dm_add_exception, (void *)s); |
664 | if (r < 0) { | 669 | if (r < 0) { |
665 | ti->error = "Failed to read snapshot metadata"; | 670 | ti->error = "Failed to read snapshot metadata"; |
666 | goto bad_load_and_register; | 671 | goto bad_load_and_register; |
diff --git a/drivers/md/dm-snap.h b/drivers/md/dm-snap.h index 928123657024..d9e62b43cf85 100644 --- a/drivers/md/dm-snap.h +++ b/drivers/md/dm-snap.h | |||
@@ -76,12 +76,6 @@ struct dm_snapshot { | |||
76 | }; | 76 | }; |
77 | 77 | ||
78 | /* | 78 | /* |
79 | * Used by the exception stores to load exceptions hen | ||
80 | * initialising. | ||
81 | */ | ||
82 | int dm_add_exception(struct dm_snapshot *s, chunk_t old, chunk_t new); | ||
83 | |||
84 | /* | ||
85 | * Return the number of sectors in the device. | 79 | * Return the number of sectors in the device. |
86 | */ | 80 | */ |
87 | static inline sector_t get_dev_size(struct block_device *bdev) | 81 | static inline sector_t get_dev_size(struct block_device *bdev) |