|
@@ -2064,6 +2064,23 @@ static void protection_queue_destroy(struct ubi_device *ubi)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void ubi_fastmap_close(struct ubi_device *ubi)
|
|
|
+{
|
|
|
+#ifdef CONFIG_MTD_UBI_FASTMAP
|
|
|
+ int i;
|
|
|
+
|
|
|
+ flush_work(&ubi->fm_work);
|
|
|
+ return_unused_pool_pebs(ubi, &ubi->fm_pool);
|
|
|
+ return_unused_pool_pebs(ubi, &ubi->fm_wl_pool);
|
|
|
+
|
|
|
+ if (ubi->fm) {
|
|
|
+ for (i = 0; i < ubi->fm->used_blocks; i++)
|
|
|
+ kfree(ubi->fm->e[i]);
|
|
|
+ }
|
|
|
+ kfree(ubi->fm);
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ubi_wl_close - close the wear-leveling sub-system.
|
|
|
* @ubi: UBI device description object
|
|
@@ -2071,6 +2088,7 @@ static void protection_queue_destroy(struct ubi_device *ubi)
|
|
|
void ubi_wl_close(struct ubi_device *ubi)
|
|
|
{
|
|
|
dbg_wl("close the WL sub-system");
|
|
|
+ ubi_fastmap_close(ubi);
|
|
|
shutdown_work(ubi);
|
|
|
protection_queue_destroy(ubi);
|
|
|
tree_destroy(&ubi->used);
|