[PATCH 09/21] UBI: Fastmap: Make ubi_wl_get_fm_peb() return a ubi_wl_entry
Richard Weinberger
richard at nod.at
Wed Jun 13 06:42:06 EDT 2012
...makes life easier
Signed-off-by: Richard Weinberger <richard at nod.at>
---
drivers/mtd/ubi/fastmap.c | 36 +++++++++++-------------------------
drivers/mtd/ubi/ubi.h | 2 +-
drivers/mtd/ubi/wl.c | 8 +++-----
3 files changed, 15 insertions(+), 31 deletions(-)
diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c
index 1d3f724..fb5dae5 100644
--- a/drivers/mtd/ubi/fastmap.c
+++ b/drivers/mtd/ubi/fastmap.c
@@ -1191,24 +1191,6 @@ out:
}
/**
- * get_ec - returns the erase counter of a given PEB
- * @ubi: UBI device object
- * @pnum: PEB number
- */
-static int get_ec(struct ubi_device *ubi, int pnum)
-{
- struct ubi_wl_entry *e;
-
- e = ubi->lookuptbl[pnum];
-
- /* can this really happen? */
- if (!e)
- return ubi->mean_ec ?: 1;
- else
- return e->ec;
-}
-
-/**
* ubi_update_fastmap - will be called by UBI if a volume changes or
* a fastmap pool becomes full.
* @ubi: UBI device object
@@ -1217,6 +1199,7 @@ int ubi_update_fastmap(struct ubi_device *ubi)
{
int ret, i;
struct ubi_fastmap_layout *new_fm, *old_fm;
+ struct ubi_wl_entry *tmp_e;
if (ubi->ro_mode)
return 0;
@@ -1252,12 +1235,12 @@ int ubi_update_fastmap(struct ubi_device *ubi)
ubi->fm = NULL;
spin_lock(&ubi->wl_lock);
- new_fm->e[0]->pnum = ubi_wl_get_fm_peb(ubi, UBI_FM_MAX_START);
+ tmp_e = ubi_wl_get_fm_peb(ubi, UBI_FM_MAX_START);
spin_unlock(&ubi->wl_lock);
if (old_fm) {
/* no fresh early PEB was found, reuse the old one */
- if (new_fm->e[0]->pnum < 0) {
+ if (!tmp_e) {
struct ubi_ec_hdr *ec_hdr;
long long ec;
@@ -1309,6 +1292,7 @@ int ubi_update_fastmap(struct ubi_device *ubi)
}
new_fm->e[0]->pnum = old_fm->e[0]->pnum;
+ new_fm->e[0]->ec = old_fm->e[0]->ec;
} else {
/* we've got a new early PEB, return the old one */
ubi_wl_put_fm_peb(ubi, old_fm->e[0], 0);
@@ -1318,7 +1302,7 @@ int ubi_update_fastmap(struct ubi_device *ubi)
for (i = 1; i < old_fm->used_blocks; i++)
ubi_wl_put_fm_peb(ubi, old_fm->e[i], 0);
} else {
- if (new_fm->e[0]->pnum < 0) {
+ if (!tmp_e) {
ubi_err("could not find an early PEB");
ret = -ENOSPC;
@@ -1326,7 +1310,8 @@ int ubi_update_fastmap(struct ubi_device *ubi)
}
}
- new_fm->e[0]->ec = get_ec(ubi, new_fm->e[0]->pnum);
+ new_fm->e[0]->pnum = tmp_e->pnum;
+ new_fm->e[0]->ec = tmp_e->ec;
if (new_fm->used_blocks > UBI_FM_MAX_BLOCKS) {
ubi_err("fastmap too large");
@@ -1340,10 +1325,10 @@ int ubi_update_fastmap(struct ubi_device *ubi)
for (i = 1; i < new_fm->used_blocks; i++) {
spin_lock(&ubi->wl_lock);
- new_fm->e[i]->pnum = ubi_wl_get_fm_peb(ubi, -1);
+ tmp_e = ubi_wl_get_fm_peb(ubi, -1);
spin_unlock(&ubi->wl_lock);
- if (new_fm->e[i]->pnum < 0) {
+ if (!new_fm->e[i]) {
ubi_err("could not get any free erase block");
while (i--) {
@@ -1355,7 +1340,8 @@ int ubi_update_fastmap(struct ubi_device *ubi)
goto err;
}
- new_fm->e[i]->ec = get_ec(ubi, new_fm->e[i]->pnum);
+ new_fm->e[i]->pnum = tmp_e->pnum;
+ new_fm->e[i]->ec = tmp_e->ec;
}
if (old_fm) {
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index 0db97b0..be1933b 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -730,7 +730,7 @@ int ubi_wl_scrub_peb(struct ubi_device *ubi, int pnum);
int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai);
void ubi_wl_close(struct ubi_device *ubi);
int ubi_thread(void *u);
-int ubi_wl_get_fm_peb(struct ubi_device *ubi, int max_pnum);
+struct ubi_wl_entry *ubi_wl_get_fm_peb(struct ubi_device *ubi, int max_pnum);
int ubi_wl_put_fm_peb(struct ubi_device *ubi, struct ubi_wl_entry *used_e, int torture);
/* io.c */
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c
index 52548e7..15e4895 100644
--- a/drivers/mtd/ubi/wl.c
+++ b/drivers/mtd/ubi/wl.c
@@ -441,10 +441,9 @@ static struct ubi_wl_entry *find_early_wl_entry(struct rb_root *root,
* If max_pnum is negative a PEB with a mean EC will be selected.
* Must be called with wl_lock held!
*/
-int ubi_wl_get_fm_peb(struct ubi_device *ubi, int max_pnum)
+struct ubi_wl_entry *ubi_wl_get_fm_peb(struct ubi_device *ubi, int max_pnum)
{
- int ret = -ENOSPC;
- struct ubi_wl_entry *e;
+ struct ubi_wl_entry *e = NULL;
if (!ubi->free.rb_node) {
ubi_err("no free eraseblocks");
@@ -461,13 +460,12 @@ int ubi_wl_get_fm_peb(struct ubi_device *ubi, int max_pnum)
goto out;
self_check_in_wl_tree(ubi, e, &ubi->free);
- ret = e->pnum;
/* remove it from the free list,
* the wl subsystem does no longer know this erase block */
rb_erase(&e->u.rb, &ubi->free);
out:
- return ret;
+ return e;
}
/**
--
1.7.6.5
More information about the linux-mtd
mailing list