|
@@ -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;
|
|
|
}
|