ubi: fastmap: Check each mapping only once
[linux-2.6-microblaze.git] / drivers / mtd / ubi / vtbl.c
index 263743e..94d7a86 100644 (file)
@@ -534,7 +534,7 @@ static int init_volumes(struct ubi_device *ubi,
                        const struct ubi_attach_info *ai,
                        const struct ubi_vtbl_record *vtbl)
 {
-       int i, reserved_pebs = 0;
+       int i, err, reserved_pebs = 0;
        struct ubi_ainf_volume *av;
        struct ubi_volume *vol;
 
@@ -620,6 +620,16 @@ static int init_volumes(struct ubi_device *ubi,
                        (long long)(vol->used_ebs - 1) * vol->usable_leb_size;
                vol->used_bytes += av->last_data_size;
                vol->last_eb_bytes = av->last_data_size;
+
+               /*
+                * We use ubi->peb_count and not vol->reserved_pebs because
+                * we want to keep the code simple. Otherwise we'd have to
+                * resize/check the bitmap upon volume resize too.
+                * Allocating a few bytes more does not hurt.
+                */
+               err = ubi_fastmap_init_checkmap(vol, ubi->peb_count);
+               if (err)
+                       return err;
        }
 
        /* And add the layout volume */
@@ -645,6 +655,9 @@ static int init_volumes(struct ubi_device *ubi,
        reserved_pebs += vol->reserved_pebs;
        ubi->vol_count += 1;
        vol->ubi = ubi;
+       err = ubi_fastmap_init_checkmap(vol, UBI_LAYOUT_VOLUME_EBS);
+       if (err)
+               return err;
 
        if (reserved_pebs > ubi->avail_pebs) {
                ubi_err(ubi, "not enough PEBs, required %d, available %d",
@@ -849,6 +862,7 @@ int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_attach_info *ai)
 out_free:
        vfree(ubi->vtbl);
        for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) {
+               ubi_fastmap_destroy_checkmap(ubi->volumes[i]);
                kfree(ubi->volumes[i]);
                ubi->volumes[i] = NULL;
        }