diff --git a/drivers/md/dm-bow.c b/drivers/md/dm-bow.c index cfd1fa63ff97..9bdffb302410 100644 --- a/drivers/md/dm-bow.c +++ b/drivers/md/dm-bow.c @@ -599,13 +599,6 @@ static void dm_bow_dtr(struct dm_target *ti) struct bow_context *bc = (struct bow_context *) ti->private; struct kobject *kobj; - while (rb_first(&bc->ranges)) { - struct bow_range *br = container_of(rb_first(&bc->ranges), - struct bow_range, node); - - rb_erase(&br->node, &bc->ranges); - kfree(br); - } if (bc->workqueue) destroy_workqueue(bc->workqueue); if (bc->bufio) @@ -617,6 +610,15 @@ static void dm_bow_dtr(struct dm_target *ti) wait_for_completion(dm_get_completion_from_kobject(kobj)); } + while (rb_first(&bc->ranges)) { + struct bow_range *br = container_of(rb_first(&bc->ranges), + struct bow_range, node); + + rb_erase(&br->node, &bc->ranges); + kfree(br); + } + + mutex_destroy(&bc->ranges_lock); kfree(bc->log_sector); kfree(bc); }