ubi: fastmap: Check each mapping only once
Maintain a bitmap to keep track of which LEB->PEB mapping was checked already. That way we have to read back VID headers only once. Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user