UBI: Fastmap: Introduce may_reserve_for_fm()
...and kill another #ifdef. Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
acfda79f88
commit
2f84c2469e
3 changed files with 28 additions and 6 deletions
|
@ -359,3 +359,22 @@ static void ubi_fastmap_close(struct ubi_device *ubi)
|
||||||
}
|
}
|
||||||
kfree(ubi->fm);
|
kfree(ubi->fm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* may_reserve_for_fm - tests whether a PEB shall be reserved for fastmap.
|
||||||
|
* See find_mean_wl_entry()
|
||||||
|
*
|
||||||
|
* @ubi: UBI device description object
|
||||||
|
* @e: physical eraseblock to return
|
||||||
|
* @root: RB tree to test against.
|
||||||
|
*/
|
||||||
|
static struct ubi_wl_entry *may_reserve_for_fm(struct ubi_device *ubi,
|
||||||
|
struct ubi_wl_entry *e,
|
||||||
|
struct rb_root *root) {
|
||||||
|
if (e && !ubi->fm_disabled && !ubi->fm &&
|
||||||
|
e->pnum < UBI_FM_MAX_START)
|
||||||
|
e = rb_entry(rb_next(root->rb_node),
|
||||||
|
struct ubi_wl_entry, u.rb);
|
||||||
|
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
|
@ -361,15 +361,10 @@ static struct ubi_wl_entry *find_mean_wl_entry(struct ubi_device *ubi,
|
||||||
if (last->ec - first->ec < WL_FREE_MAX_DIFF) {
|
if (last->ec - first->ec < WL_FREE_MAX_DIFF) {
|
||||||
e = rb_entry(root->rb_node, struct ubi_wl_entry, u.rb);
|
e = rb_entry(root->rb_node, struct ubi_wl_entry, u.rb);
|
||||||
|
|
||||||
#ifdef CONFIG_MTD_UBI_FASTMAP
|
|
||||||
/* If no fastmap has been written and this WL entry can be used
|
/* If no fastmap has been written and this WL entry can be used
|
||||||
* as anchor PEB, hold it back and return the second best
|
* as anchor PEB, hold it back and return the second best
|
||||||
* WL entry such that fastmap can use the anchor PEB later. */
|
* WL entry such that fastmap can use the anchor PEB later. */
|
||||||
if (e && !ubi->fm_disabled && !ubi->fm &&
|
e = may_reserve_for_fm(ubi, e, root);
|
||||||
e->pnum < UBI_FM_MAX_START)
|
|
||||||
e = rb_entry(rb_next(root->rb_node),
|
|
||||||
struct ubi_wl_entry, u.rb);
|
|
||||||
#endif
|
|
||||||
} else
|
} else
|
||||||
e = find_wl_entry(ubi, root, WL_FREE_MAX_DIFF/2);
|
e = find_wl_entry(ubi, root, WL_FREE_MAX_DIFF/2);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,9 @@ static inline void ubi_fastmap_init(struct ubi_device *ubi, int *count)
|
||||||
*count += (ubi->fm_size / ubi->leb_size) * 2;
|
*count += (ubi->fm_size / ubi->leb_size) * 2;
|
||||||
INIT_WORK(&ubi->fm_work, update_fastmap_work_fn);
|
INIT_WORK(&ubi->fm_work, update_fastmap_work_fn);
|
||||||
}
|
}
|
||||||
|
static struct ubi_wl_entry *may_reserve_for_fm(struct ubi_device *ubi,
|
||||||
|
struct ubi_wl_entry *e,
|
||||||
|
struct rb_root *root);
|
||||||
#else /* !CONFIG_MTD_UBI_FASTMAP */
|
#else /* !CONFIG_MTD_UBI_FASTMAP */
|
||||||
static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi);
|
static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi);
|
||||||
static inline int is_fm_block(struct ubi_device *ubi, int pnum)
|
static inline int is_fm_block(struct ubi_device *ubi, int pnum)
|
||||||
|
@ -21,5 +24,10 @@ static inline int is_fm_block(struct ubi_device *ubi, int pnum)
|
||||||
}
|
}
|
||||||
static inline void ubi_fastmap_close(struct ubi_device *ubi) { }
|
static inline void ubi_fastmap_close(struct ubi_device *ubi) { }
|
||||||
static inline void ubi_fastmap_init(struct ubi_device *ubi, int *count) { }
|
static inline void ubi_fastmap_init(struct ubi_device *ubi, int *count) { }
|
||||||
|
static struct ubi_wl_entry *may_reserve_for_fm(struct ubi_device *ubi,
|
||||||
|
struct ubi_wl_entry *e,
|
||||||
|
struct rb_root *root) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
#endif /* CONFIG_MTD_UBI_FASTMAP */
|
#endif /* CONFIG_MTD_UBI_FASTMAP */
|
||||||
#endif /* UBI_WL_H */
|
#endif /* UBI_WL_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue