Call dm_put_target_type() *after* calling the destructor.
--- diff/drivers/md/dm-table.c	2002-11-18 10:45:12.000000000 +0000
+++ source/drivers/md/dm-table.c	2002-12-17 15:59:03.000000000 +0000
@@ -207,12 +207,12 @@
 
 	/* free the targets */
 	for (i = 0; i < t->num_targets; i++) {
-		struct dm_target *tgt = &t->targets[i];
-
-		dm_put_target_type(t->targets[i].type);
+		struct dm_target *tgt = t->targets + i;
 
 		if (tgt->type->dtr)
 			tgt->type->dtr(tgt);
+
+		dm_put_target_type(tgt->type);
 	}
 
 	vfree(t->highs);