===================================================================
@@ -237,6 +237,9 @@ void dm_table_destroy(struct dm_table *t
{
unsigned int i;
+ if (!t)
+ return;
+
while (atomic_read(&t->holders))
msleep(1);
smp_mb();
===================================================================
@@ -2070,7 +2070,10 @@ static int __bind(struct mapped_device *
return 0;
}
-static void __unbind(struct mapped_device *md)
+/*
+ * Returns unbound table for the caller to free.
+ */
+struct dm_table *__unbind(struct mapped_device *md)
{
struct dm_table *map = md->map;
unsigned long flags;
@@ -2082,7 +2085,8 @@ static void __unbind(struct mapped_devic
write_lock_irqsave(&md->map_lock, flags);
md->map = NULL;
write_unlock_irqrestore(&md->map_lock, flags);
- dm_table_destroy(map);
+
+ return map;
}
/*
@@ -2175,7 +2179,7 @@ void dm_put(struct mapped_device *md)
}
dm_sysfs_exit(md);
dm_table_put(map);
- __unbind(md);
+ dm_table_destroy(__unbind(md));
free_dev(md);
}
}
@@ -2381,8 +2385,9 @@ int dm_swap_table(struct mapped_device *
goto out;
}
- __unbind(md);
+ map = __unbind(md);
r = __bind(md, table, &limits);
+ dm_table_destroy(map);
out:
mutex_unlock(&md->suspend_lock);