mirror of https://gitee.com/openkylin/linux.git
UBI: add a helper function for updatting on-flash layout volumes
Signed-off-by: Sheng Yong <shengyong1@huawei.com> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
e96a8a3bb6
commit
2848594a20
|
@ -69,6 +69,26 @@ static void self_vtbl_check(const struct ubi_device *ubi);
|
||||||
/* Empty volume table record */
|
/* Empty volume table record */
|
||||||
static struct ubi_vtbl_record empty_vtbl_record;
|
static struct ubi_vtbl_record empty_vtbl_record;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ubi_update_layout_vol - helper for updatting layout volumes on flash
|
||||||
|
* @ubi: UBI device description object
|
||||||
|
*/
|
||||||
|
static int ubi_update_layout_vol(struct ubi_device *ubi)
|
||||||
|
{
|
||||||
|
struct ubi_volume *layout_vol;
|
||||||
|
int i, err;
|
||||||
|
|
||||||
|
layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
|
||||||
|
for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
|
||||||
|
err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl,
|
||||||
|
ubi->vtbl_size);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ubi_change_vtbl_record - change volume table record.
|
* ubi_change_vtbl_record - change volume table record.
|
||||||
* @ubi: UBI device description object
|
* @ubi: UBI device description object
|
||||||
|
@ -83,12 +103,10 @@ static struct ubi_vtbl_record empty_vtbl_record;
|
||||||
int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
|
int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
|
||||||
struct ubi_vtbl_record *vtbl_rec)
|
struct ubi_vtbl_record *vtbl_rec)
|
||||||
{
|
{
|
||||||
int i, err;
|
int err;
|
||||||
uint32_t crc;
|
uint32_t crc;
|
||||||
struct ubi_volume *layout_vol;
|
|
||||||
|
|
||||||
ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
|
ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
|
||||||
layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
|
|
||||||
|
|
||||||
if (!vtbl_rec)
|
if (!vtbl_rec)
|
||||||
vtbl_rec = &empty_vtbl_record;
|
vtbl_rec = &empty_vtbl_record;
|
||||||
|
@ -98,15 +116,10 @@ int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
|
memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
|
||||||
for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
|
err = ubi_update_layout_vol(ubi);
|
||||||
err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl,
|
|
||||||
ubi->vtbl_size);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
self_vtbl_check(ubi);
|
self_vtbl_check(ubi);
|
||||||
return 0;
|
return err ? err : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,9 +134,7 @@ int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
|
||||||
int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
|
int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
|
||||||
struct list_head *rename_list)
|
struct list_head *rename_list)
|
||||||
{
|
{
|
||||||
int i, err;
|
|
||||||
struct ubi_rename_entry *re;
|
struct ubi_rename_entry *re;
|
||||||
struct ubi_volume *layout_vol;
|
|
||||||
|
|
||||||
list_for_each_entry(re, rename_list, list) {
|
list_for_each_entry(re, rename_list, list) {
|
||||||
uint32_t crc;
|
uint32_t crc;
|
||||||
|
@ -145,15 +156,7 @@ int ubi_vtbl_rename_volumes(struct ubi_device *ubi,
|
||||||
vtbl_rec->crc = cpu_to_be32(crc);
|
vtbl_rec->crc = cpu_to_be32(crc);
|
||||||
}
|
}
|
||||||
|
|
||||||
layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];
|
return ubi_update_layout_vol(ubi);
|
||||||
for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
|
|
||||||
err = ubi_eba_atomic_leb_change(ubi, layout_vol, i, ubi->vtbl,
|
|
||||||
ubi->vtbl_size);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue