Merge branch 'for-next/ubi'
This commit is contained in:
commit
07e5ba98e5
|
@ -893,10 +893,9 @@ static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
||||||
* number.
|
* number.
|
||||||
*/
|
*/
|
||||||
image_seq = be32_to_cpu(ech->image_seq);
|
image_seq = be32_to_cpu(ech->image_seq);
|
||||||
if (!ubi->image_seq && image_seq)
|
if (!ubi->image_seq)
|
||||||
ubi->image_seq = image_seq;
|
ubi->image_seq = image_seq;
|
||||||
if (ubi->image_seq && image_seq &&
|
if (image_seq && ubi->image_seq != image_seq) {
|
||||||
ubi->image_seq != image_seq) {
|
|
||||||
ubi_err("bad image sequence number %d in PEB %d, expected %d",
|
ubi_err("bad image sequence number %d in PEB %d, expected %d",
|
||||||
image_seq, pnum, ubi->image_seq);
|
image_seq, pnum, ubi->image_seq);
|
||||||
ubi_dump_ec_hdr(ech);
|
ubi_dump_ec_hdr(ech);
|
||||||
|
@ -1397,9 +1396,11 @@ int ubi_attach(struct ubi_device *ubi, int force_scan)
|
||||||
ai = alloc_ai("ubi_aeb_slab_cache2");
|
ai = alloc_ai("ubi_aeb_slab_cache2");
|
||||||
if (!ai)
|
if (!ai)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
|
|
||||||
err = scan_all(ubi, ai, UBI_FM_MAX_START);
|
err = scan_all(ubi, ai, 0);
|
||||||
|
} else {
|
||||||
|
err = scan_all(ubi, ai, UBI_FM_MAX_START);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -406,6 +406,7 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < pool_size; i++) {
|
for (i = 0; i < pool_size; i++) {
|
||||||
int scrub = 0;
|
int scrub = 0;
|
||||||
|
int image_seq;
|
||||||
|
|
||||||
pnum = be32_to_cpu(pebs[i]);
|
pnum = be32_to_cpu(pebs[i]);
|
||||||
|
|
||||||
|
@ -424,10 +425,16 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
||||||
} else if (ret == UBI_IO_BITFLIPS)
|
} else if (ret == UBI_IO_BITFLIPS)
|
||||||
scrub = 1;
|
scrub = 1;
|
||||||
|
|
||||||
if (be32_to_cpu(ech->image_seq) != ubi->image_seq) {
|
/*
|
||||||
|
* Older UBI implementations have image_seq set to zero, so
|
||||||
|
* we shouldn't fail if image_seq == 0.
|
||||||
|
*/
|
||||||
|
image_seq = be32_to_cpu(ech->image_seq);
|
||||||
|
|
||||||
|
if (image_seq && (image_seq != ubi->image_seq)) {
|
||||||
ubi_err("bad image seq: 0x%x, expected: 0x%x",
|
ubi_err("bad image seq: 0x%x, expected: 0x%x",
|
||||||
be32_to_cpu(ech->image_seq), ubi->image_seq);
|
be32_to_cpu(ech->image_seq), ubi->image_seq);
|
||||||
err = UBI_BAD_FASTMAP;
|
ret = UBI_BAD_FASTMAP;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,6 +815,10 @@ static int ubi_attach_fastmap(struct ubi_device *ubi,
|
||||||
list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &lfree, u.list)
|
list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &lfree, u.list)
|
||||||
list_move_tail(&tmp_aeb->u.list, &ai->free);
|
list_move_tail(&tmp_aeb->u.list, &ai->free);
|
||||||
|
|
||||||
|
ubi_assert(list_empty(&used));
|
||||||
|
ubi_assert(list_empty(&eba_orphans));
|
||||||
|
ubi_assert(list_empty(&lfree));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If fastmap is leaking PEBs (must not happen), raise a
|
* If fastmap is leaking PEBs (must not happen), raise a
|
||||||
* fat warning and fall back to scanning mode.
|
* fat warning and fall back to scanning mode.
|
||||||
|
@ -823,6 +834,19 @@ static int ubi_attach_fastmap(struct ubi_device *ubi,
|
||||||
fail_bad:
|
fail_bad:
|
||||||
ret = UBI_BAD_FASTMAP;
|
ret = UBI_BAD_FASTMAP;
|
||||||
fail:
|
fail:
|
||||||
|
list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &used, u.list) {
|
||||||
|
free(tmp_aeb);
|
||||||
|
list_del(&tmp_aeb->u.list);
|
||||||
|
}
|
||||||
|
list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &eba_orphans, u.list) {
|
||||||
|
free(tmp_aeb);
|
||||||
|
list_del(&tmp_aeb->u.list);
|
||||||
|
}
|
||||||
|
list_for_each_entry_safe(tmp_aeb, _tmp_aeb, &lfree, u.list) {
|
||||||
|
free(tmp_aeb);
|
||||||
|
list_del(&tmp_aeb->u.list);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -911,6 +935,8 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < used_blocks; i++) {
|
for (i = 0; i < used_blocks; i++) {
|
||||||
|
int image_seq;
|
||||||
|
|
||||||
pnum = be32_to_cpu(fmsb->block_loc[i]);
|
pnum = be32_to_cpu(fmsb->block_loc[i]);
|
||||||
|
|
||||||
if (ubi_io_is_bad(ubi, pnum)) {
|
if (ubi_io_is_bad(ubi, pnum)) {
|
||||||
|
@ -928,10 +954,17 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
|
||||||
} else if (ret == UBI_IO_BITFLIPS)
|
} else if (ret == UBI_IO_BITFLIPS)
|
||||||
fm->to_be_tortured[i] = 1;
|
fm->to_be_tortured[i] = 1;
|
||||||
|
|
||||||
|
image_seq = be32_to_cpu(ech->image_seq);
|
||||||
if (!ubi->image_seq)
|
if (!ubi->image_seq)
|
||||||
ubi->image_seq = be32_to_cpu(ech->image_seq);
|
ubi->image_seq = image_seq;
|
||||||
|
|
||||||
if (be32_to_cpu(ech->image_seq) != ubi->image_seq) {
|
/*
|
||||||
|
* Older UBI implementations have image_seq set to zero, so
|
||||||
|
* we shouldn't fail if image_seq == 0.
|
||||||
|
*/
|
||||||
|
if (image_seq && (image_seq != ubi->image_seq)) {
|
||||||
|
ubi_err("wrong image seq:%d instead of %d",
|
||||||
|
be32_to_cpu(ech->image_seq), ubi->image_seq);
|
||||||
ret = UBI_BAD_FASTMAP;
|
ret = UBI_BAD_FASTMAP;
|
||||||
goto free_hdr;
|
goto free_hdr;
|
||||||
}
|
}
|
||||||
|
@ -1338,7 +1371,7 @@ out:
|
||||||
static int invalidate_fastmap(struct ubi_device *ubi,
|
static int invalidate_fastmap(struct ubi_device *ubi,
|
||||||
struct ubi_fastmap_layout *fm)
|
struct ubi_fastmap_layout *fm)
|
||||||
{
|
{
|
||||||
int ret, i;
|
int ret;
|
||||||
struct ubi_vid_hdr *vh;
|
struct ubi_vid_hdr *vh;
|
||||||
|
|
||||||
ret = erase_block(ubi, fm->e[0]->pnum);
|
ret = erase_block(ubi, fm->e[0]->pnum);
|
||||||
|
@ -1355,9 +1388,6 @@ static int invalidate_fastmap(struct ubi_device *ubi,
|
||||||
vh->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
|
vh->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
|
||||||
ret = ubi_io_write_vid_hdr(ubi, fm->e[0]->pnum, vh);
|
ret = ubi_io_write_vid_hdr(ubi, fm->e[0]->pnum, vh);
|
||||||
|
|
||||||
for (i = 0; i < fm->used_blocks; i++)
|
|
||||||
ubi_wl_put_fm_peb(ubi, fm->e[i], i, fm->to_be_tortured[i]);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -572,10 +572,6 @@ static void refill_wl_user_pool(struct ubi_device *ubi)
|
||||||
return_unused_pool_pebs(ubi, pool);
|
return_unused_pool_pebs(ubi, pool);
|
||||||
|
|
||||||
for (pool->size = 0; pool->size < pool->max_size; pool->size++) {
|
for (pool->size = 0; pool->size < pool->max_size; pool->size++) {
|
||||||
if (!ubi->free.rb_node ||
|
|
||||||
(ubi->free_count - ubi->beb_rsvd_pebs < 1))
|
|
||||||
break;
|
|
||||||
|
|
||||||
pool->pebs[pool->size] = __wl_get_peb(ubi);
|
pool->pebs[pool->size] = __wl_get_peb(ubi);
|
||||||
if (pool->pebs[pool->size] < 0)
|
if (pool->pebs[pool->size] < 0)
|
||||||
break;
|
break;
|
||||||
|
@ -1020,6 +1016,9 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,
|
||||||
if (!(e2->ec - e1->ec >= UBI_WL_THRESHOLD)) {
|
if (!(e2->ec - e1->ec >= UBI_WL_THRESHOLD)) {
|
||||||
dbg_wl("no WL needed: min used EC %d, max free EC %d",
|
dbg_wl("no WL needed: min used EC %d, max free EC %d",
|
||||||
e1->ec, e2->ec);
|
e1->ec, e2->ec);
|
||||||
|
|
||||||
|
/* Give the unused PEB back */
|
||||||
|
wl_tree_add(e2, &ubi->free);
|
||||||
goto out_cancel;
|
goto out_cancel;
|
||||||
}
|
}
|
||||||
self_check_in_wl_tree(ubi, e1, &ubi->used);
|
self_check_in_wl_tree(ubi, e1, &ubi->used);
|
||||||
|
|
Loading…
Reference in New Issue