Skip to content

Commit

Permalink
dm snapshot: extend exception store functions
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Alasdair G Kergon <[email protected]>
  • Loading branch information
jbrassow authored and kergon committed Jan 6, 2009
1 parent 4db6bfe commit a159c1a
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 37 deletions.
1 change: 0 additions & 1 deletion drivers/md/dm-exception-store.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include <linux/pagemap.h>
#include <linux/vmalloc.h>
#include <linux/slab.h>
#include <linux/device-mapper.h>

#define DM_MSG_PREFIX "snapshot exception stores"

Expand Down
13 changes: 10 additions & 3 deletions drivers/md/dm-exception-store.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#define _LINUX_DM_EXCEPTION_STORE

#include <linux/blkdev.h>
#include <linux/device-mapper.h>

/*
* The snapshot code deals with largish chunks of the disk at a
Expand All @@ -37,17 +38,20 @@ struct dm_snap_exception {
* COW device).
*/
struct dm_exception_store {

/*
* Destroys this object when you've finished with it.
*/
void (*destroy) (struct dm_exception_store *store);

/*
* The target shouldn't read the COW device until this is
* called.
* called. As exceptions are read from the COW, they are
* reported back via the callback.
*/
int (*read_metadata) (struct dm_exception_store *store);
int (*read_metadata) (struct dm_exception_store *store,
int (*callback)(void *callback_context,
chunk_t old, chunk_t new),
void *callback_context);

/*
* Find somewhere to store the next exception.
Expand All @@ -68,6 +72,9 @@ struct dm_exception_store {
*/
void (*drop_snapshot) (struct dm_exception_store *store);

int (*status) (struct dm_exception_store *store, status_type_t status,
char *result, unsigned int maxlen);

/*
* Return how full the snapshot is.
*/
Expand Down
42 changes: 26 additions & 16 deletions drivers/md/dm-snap-persistent.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,11 @@ static void write_exception(struct pstore *ps,
* 'full' is filled in to indicate if the area has been
* filled.
*/
static int insert_exceptions(struct pstore *ps, int *full)
static int insert_exceptions(struct pstore *ps,
int (*callback)(void *callback_context,
chunk_t old, chunk_t new),
void *callback_context,
int *full)
{
int r;
unsigned int i;
Expand Down Expand Up @@ -428,15 +432,18 @@ static int insert_exceptions(struct pstore *ps, int *full)
/*
* Otherwise we add the exception to the snapshot.
*/
r = dm_add_exception(ps->snap, de.old_chunk, de.new_chunk);
r = callback(callback_context, de.old_chunk, de.new_chunk);
if (r)
return r;
}

return 0;
}

static int read_exceptions(struct pstore *ps)
static int read_exceptions(struct pstore *ps,
int (*callback)(void *callback_context, chunk_t old,
chunk_t new),
void *callback_context)
{
int r, full = 1;

Expand All @@ -449,7 +456,7 @@ static int read_exceptions(struct pstore *ps)
if (r)
return r;

r = insert_exceptions(ps, &full);
r = insert_exceptions(ps, callback, callback_context, &full);
if (r)
return r;
}
Expand Down Expand Up @@ -482,7 +489,10 @@ static void persistent_destroy(struct dm_exception_store *store)
kfree(ps);
}

static int persistent_read_metadata(struct dm_exception_store *store)
static int persistent_read_metadata(struct dm_exception_store *store,
int (*callback)(void *callback_context,
chunk_t old, chunk_t new),
void *callback_context)
{
int r, uninitialized_var(new_snapshot);
struct pstore *ps = get_info(store);
Expand Down Expand Up @@ -540,16 +550,16 @@ static int persistent_read_metadata(struct dm_exception_store *store)
/*
* Read the metadata.
*/
r = read_exceptions(ps);
r = read_exceptions(ps, callback, callback_context);
if (r)
return r;
}

return 0;
}

static int persistent_prepare(struct dm_exception_store *store,
struct dm_snap_exception *e)
static int persistent_prepare_exception(struct dm_exception_store *store,
struct dm_snap_exception *e)
{
struct pstore *ps = get_info(store);
uint32_t stride;
Expand All @@ -575,10 +585,10 @@ static int persistent_prepare(struct dm_exception_store *store,
return 0;
}

static void persistent_commit(struct dm_exception_store *store,
struct dm_snap_exception *e,
void (*callback) (void *, int success),
void *callback_context)
static void persistent_commit_exception(struct dm_exception_store *store,
struct dm_snap_exception *e,
void (*callback) (void *, int success),
void *callback_context)
{
unsigned int i;
struct pstore *ps = get_info(store);
Expand Down Expand Up @@ -637,7 +647,7 @@ static void persistent_commit(struct dm_exception_store *store,
ps->callback_count = 0;
}

static void persistent_drop(struct dm_exception_store *store)
static void persistent_drop_snapshot(struct dm_exception_store *store)
{
struct pstore *ps = get_info(store);

Expand Down Expand Up @@ -675,9 +685,9 @@ int dm_create_persistent(struct dm_exception_store *store)

store->destroy = persistent_destroy;
store->read_metadata = persistent_read_metadata;
store->prepare_exception = persistent_prepare;
store->commit_exception = persistent_commit;
store->drop_snapshot = persistent_drop;
store->prepare_exception = persistent_prepare_exception;
store->commit_exception = persistent_commit_exception;
store->drop_snapshot = persistent_drop_snapshot;
store->fraction_full = persistent_fraction_full;
store->context = ps;

Expand Down
21 changes: 12 additions & 9 deletions drivers/md/dm-snap-transient.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,16 @@ static void transient_destroy(struct dm_exception_store *store)
kfree(store->context);
}

static int transient_read_metadata(struct dm_exception_store *store)
static int transient_read_metadata(struct dm_exception_store *store,
int (*callback)(void *callback_context,
chunk_t old, chunk_t new),
void *callback_context)
{
return 0;
}

static int transient_prepare(struct dm_exception_store *store,
struct dm_snap_exception *e)
static int transient_prepare_exception(struct dm_exception_store *store,
struct dm_snap_exception *e)
{
struct transient_c *tc = (struct transient_c *) store->context;
sector_t size = get_dev_size(store->snap->cow->bdev);
Expand All @@ -48,10 +51,10 @@ static int transient_prepare(struct dm_exception_store *store,
return 0;
}

static void transient_commit(struct dm_exception_store *store,
struct dm_snap_exception *e,
void (*callback) (void *, int success),
void *callback_context)
static void transient_commit_exception(struct dm_exception_store *store,
struct dm_snap_exception *e,
void (*callback) (void *, int success),
void *callback_context)
{
/* Just succeed */
callback(callback_context, 1);
Expand All @@ -70,8 +73,8 @@ int dm_create_transient(struct dm_exception_store *store)

store->destroy = transient_destroy;
store->read_metadata = transient_read_metadata;
store->prepare_exception = transient_prepare;
store->commit_exception = transient_commit;
store->prepare_exception = transient_prepare_exception;
store->commit_exception = transient_commit_exception;
store->drop_snapshot = NULL;
store->fraction_full = transient_fraction_full;

Expand Down
9 changes: 7 additions & 2 deletions drivers/md/dm-snap.c
Original file line number Diff line number Diff line change
Expand Up @@ -430,8 +430,13 @@ static void insert_completed_exception(struct dm_snapshot *s,
list_add(&new_e->hash_list, e ? &e->hash_list : l);
}

int dm_add_exception(struct dm_snapshot *s, chunk_t old, chunk_t new)
/*
* Callback used by the exception stores to load exceptions when
* initialising.
*/
static int dm_add_exception(void *context, chunk_t old, chunk_t new)
{
struct dm_snapshot *s = context;
struct dm_snap_exception *e;

e = alloc_exception();
Expand Down Expand Up @@ -660,7 +665,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
spin_lock_init(&s->tracked_chunk_lock);

/* Metadata must only be loaded into one table at once */
r = s->store.read_metadata(&s->store);
r = s->store.read_metadata(&s->store, dm_add_exception, (void *)s);
if (r < 0) {
ti->error = "Failed to read snapshot metadata";
goto bad_load_and_register;
Expand Down
6 changes: 0 additions & 6 deletions drivers/md/dm-snap.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,6 @@ struct dm_snapshot {
struct hlist_head tracked_chunk_hash[DM_TRACKED_CHUNK_HASH_SIZE];
};

/*
* Used by the exception stores to load exceptions hen
* initialising.
*/
int dm_add_exception(struct dm_snapshot *s, chunk_t old, chunk_t new);

/*
* Return the number of sectors in the device.
*/
Expand Down

0 comments on commit a159c1a

Please sign in to comment.