aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm-exception-store.c1
-rw-r--r--drivers/md/dm-exception-store.h13
-rw-r--r--drivers/md/dm-snap-persistent.c42
-rw-r--r--drivers/md/dm-snap-transient.c21
-rw-r--r--drivers/md/dm-snap.c9
-rw-r--r--drivers/md/dm-snap.h6
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 */
39struct dm_exception_store { 40struct 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 */
398static int insert_exceptions(struct pstore *ps, int *full) 398static 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
439static int read_exceptions(struct pstore *ps) 443static 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
485static int persistent_read_metadata(struct dm_exception_store *store) 492static 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
551static int persistent_prepare(struct dm_exception_store *store, 561static 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
578static void persistent_commit(struct dm_exception_store *store, 588static 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
640static void persistent_drop(struct dm_exception_store *store) 650static 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
31static int transient_read_metadata(struct dm_exception_store *store) 31static 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
36static int transient_prepare(struct dm_exception_store *store, 39static 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
51static void transient_commit(struct dm_exception_store *store, 54static 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
433int 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 */
437static 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 */
82int 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 */
87static inline sector_t get_dev_size(struct block_device *bdev) 81static inline sector_t get_dev_size(struct block_device *bdev)