[dm-devel] Re: [PATCH v3] dm snapshot: allow live exception store handover between tables
Mike Snitzer
snitzer at redhat.com
Tue Nov 10 03:22:25 UTC 2009
On Mon, Nov 09 2009 at 8:59pm -0500,
Mike Snitzer <snitzer at redhat.com> wrote:
> 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
> @@ -659,7 +796,10 @@ static int snapshot_ctr(struct dm_target
> s->active = 0;
> s->suspended = 0;
> atomic_set(&s->pending_exceptions_count, 0);
> + s->is_handover_destination = 0;
> + s->handover_snap = NULL;
> init_rwsem(&s->lock);
> + INIT_LIST_HEAD(&s->list);
The above s->list initialization was needed to avoid a GPF in
unregister_snapshot() that would occur if handover was skipped by
calling __unlink_snapshots_for_handover().
Skipping handover also implies skipping register_snapshot(). Skipping
register_snapshot() opens us up to new modes of failure in dm-snap.c's
snapshot cleanup paths. One that I missed is the following:
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
index 5e53ee2..1737917 100644
--- a/drivers/md/dm-snap.c
+++ b/drivers/md/dm-snap.c
@@ -386,7 +386,7 @@ static void unregister_snapshot(struct dm_snapshot
*s)
o = __lookup_origin(s->origin->bdev);
list_del(&s->list);
- if (list_empty(&o->snapshots)) {
+ if (o && list_empty(&o->snapshots)) {
list_del(&o->hash_list);
kfree(o);
}
More information about the dm-devel
mailing list