]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/mtd/ubi/build.c
Merge tag 'vfio-v5.6-rc1' of git://github.com/awilliam/linux-vfio
[linux.git] / drivers / mtd / ubi / build.c
index d636bbe214cb9943eadcc3d8f47683f96c893440..25fb72b2efa01a93285f30839ee6643024799e51 100644 (file)
@@ -503,21 +503,42 @@ static void uif_close(struct ubi_device *ubi)
 }
 
 /**
- * ubi_free_internal_volumes - free internal volumes.
+ * ubi_free_volumes_from - free volumes from specific index.
  * @ubi: UBI device description object
+ * @from: the start index used for volume free.
  */
-void ubi_free_internal_volumes(struct ubi_device *ubi)
+static void ubi_free_volumes_from(struct ubi_device *ubi, int from)
 {
        int i;
 
-       for (i = ubi->vtbl_slots;
-            i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
+       for (i = from; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
+               if (!ubi->volumes[i])
+                       continue;
                ubi_eba_replace_table(ubi->volumes[i], NULL);
                ubi_fastmap_destroy_checkmap(ubi->volumes[i]);
                kfree(ubi->volumes[i]);
+               ubi->volumes[i] = NULL;
        }
 }
 
+/**
+ * ubi_free_all_volumes - free all volumes.
+ * @ubi: UBI device description object
+ */
+void ubi_free_all_volumes(struct ubi_device *ubi)
+{
+       ubi_free_volumes_from(ubi, 0);
+}
+
+/**
+ * ubi_free_internal_volumes - free internal volumes.
+ * @ubi: UBI device description object
+ */
+void ubi_free_internal_volumes(struct ubi_device *ubi)
+{
+       ubi_free_volumes_from(ubi, ubi->vtbl_slots);
+}
+
 static int get_bad_peb_limit(const struct ubi_device *ubi, int max_beb_per1024)
 {
        int limit, device_pebs;
@@ -1013,7 +1034,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
 out_detach:
        ubi_devices[ubi_num] = NULL;
        ubi_wl_close(ubi);
-       ubi_free_internal_volumes(ubi);
+       ubi_free_all_volumes(ubi);
        vfree(ubi->vtbl);
 out_free:
        vfree(ubi->peb_buf);