[dm-devel] [PATCH 4 of 5] dm-exception-store API
Jonathan Brassow
jbrassow at redhat.com
Fri Nov 14 20:39:09 UTC 2008
If this function's purpose is what I'm assuming it to be, then
it will also be necessary for cluster-aware exceptions stores as well.
Using the normal method of preloading exceptions won't be good
enough in a cluster, because node1 will need to be aware of the fact
that node2 caused an exception.
brassow
On Nov 13, 2008, at 4:12 AM, Jonathan Brassow wrote:
> After twiddling with phillips/tomonori's shared snapshot, I believe
> the
> addition of the 'lookup_completed_exception' function to the
> exception store API will be useful. If I understand correctly, it
> allows
> us to defer populating a snapshot's exception cache up front. Instead
> allowing us to look them up as necessary. This is nice, because when
> the exception store is shared, we don't want 60 copies of all the
> exceptions for each snapshot structure. We just want one copy in the
> exceptions store that we can lookup.
>
> - brassow
>
> Index: linux-2.6/drivers/md/dm-exception-store.h
> ===================================================================
> --- linux-2.6.orig/drivers/md/dm-exception-store.h
> +++ linux-2.6/drivers/md/dm-exception-store.h
> @@ -78,6 +78,18 @@ struct dm_exception_store_type {
> void *callback_context);
>
> /*
> + * An exception store implementation can forgo using the
> + * callbacks provided to read_metadata, which would populate
> + * all exception data upfront. Instead, it can choose to
> + * look them up as needed via 'lookup_completed_exception'.
> + * This is especially useful for shared exception store
> + * implementations.
> + */
> + struct dm_snap_exception *
> + (*lookup_completed_exception)(struct dm_exception_store *store,
> + chunk_t chunk);
> +
> + /*
> * The snapshot is invalid, note this in the metadata.
> */
> void (*drop_snapshot) (struct dm_exception_store *store);
> Index: linux-2.6/drivers/md/dm-snap.c
> ===================================================================
> --- linux-2.6.orig/drivers/md/dm-snap.c
> +++ linux-2.6/drivers/md/dm-snap.c
> @@ -417,6 +417,16 @@ static struct dm_snap_exception *lookup_
> return NULL;
> }
>
> +static struct dm_snap_exception *
> +lookup_completed_exception(struct dm_snapshot *s, chunk_t chunk)
> +{
> + if (s->store->type->lookup_completed_exception)
> + return s->store->type->lookup_completed_exception(s->store,
> + chunk);
> + else
> + return lookup_exception(&s->complete, chunk);
> +}
> +
> static struct dm_snap_exception *alloc_exception(void)
> {
> struct dm_snap_exception *e;
> @@ -905,7 +915,7 @@ static struct bio *put_pending_exception
>
> static void pending_complete(struct dm_snap_pending_exception *pe,
> int success)
> {
> - struct dm_snap_exception *e;
> + struct dm_snap_exception *e = NULL;
> struct dm_snapshot *s = pe->snap;
> struct bio *origin_bios = NULL;
> struct bio *snapshot_bios = NULL;
> @@ -919,18 +929,21 @@ static void pending_complete(struct dm_s
> goto out;
> }
>
> - e = alloc_exception();
> - if (!e) {
> - down_write(&s->lock);
> - __invalidate_snapshot(s, -ENOMEM);
> - error = 1;
> - goto out;
> + if (!s->store->type->lookup_completed_exception) {
> + e = alloc_exception();
> + if (!e) {
> + down_write(&s->lock);
> + __invalidate_snapshot(s, -ENOMEM);
> + error = 1;
> + goto out;
> + }
> + *e = pe->e;
> }
> - *e = pe->e;
>
> down_write(&s->lock);
> if (!s->valid) {
> - free_exception(e);
> + if (e)
> + free_exception(e);
> error = 1;
> goto out;
> }
> @@ -946,7 +959,8 @@ static void pending_complete(struct dm_s
> * Add a proper exception, and remove the
> * in-flight exception from the list.
> */
> - insert_completed_exception(s, e);
> + if (e)
> + insert_completed_exception(s, e);
>
> out:
> remove_exception(&pe->e);
> @@ -1113,7 +1127,7 @@ static int snapshot_map(struct dm_target
> }
>
> /* If the block is already remapped - use that, else remap it */
> - e = lookup_exception(&s->complete, chunk);
> + e = lookup_completed_exception(s, chunk);
> if (e) {
> remap_exception(s, e, bio, chunk);
> goto out_unlock;
> @@ -1255,7 +1269,7 @@ static int __origin_write(struct list_he
> * ref_count is initialised to 1 so pending_complete()
> * won't destroy the primary_pe while we're inside this loop.
> */
> - e = lookup_exception(&snap->complete, chunk);
> + e = lookup_completed_exception(snap, chunk);
> if (e)
> goto next_snapshot;
>
>
More information about the dm-devel
mailing list