Merge tag 'upstream-3.7-rc6' of git://git.infradead.org/linux-ubifs
Pull UBIFS fixes from Artem Bityutskiy: "Two patches which fix a problem reported by several people in the past, but only fixed now because no one gave enough material for debugging. Anyway, these fix the problem that sometimes after a power cut the file-system is not mountable with the following symptom: grab_empty_leb: could not find an empty LEB The fixes make the file-system mountable again." * tag 'upstream-3.7-rc6' of git://git.infradead.org/linux-ubifs: UBIFS: fix mounting problems after power cuts UBIFS: introduce categorized lprops counter
This commit is contained in:
@ -681,8 +681,16 @@ int ubifs_find_free_leb_for_idx(struct ubifs_info *c)
|
||||
if (!lprops) {
|
||||
lprops = ubifs_fast_find_freeable(c);
|
||||
if (!lprops) {
|
||||
ubifs_assert(c->freeable_cnt == 0);
|
||||
if (c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) {
|
||||
/*
|
||||
* The first condition means the following: go scan the
|
||||
* LPT if there are uncategorized lprops, which means
|
||||
* there may be freeable LEBs there (UBIFS does not
|
||||
* store the information about freeable LEBs in the
|
||||
* master node).
|
||||
*/
|
||||
if (c->in_a_category_cnt != c->main_lebs ||
|
||||
c->lst.empty_lebs - c->lst.taken_empty_lebs > 0) {
|
||||
ubifs_assert(c->freeable_cnt == 0);
|
||||
lprops = scan_for_leb_for_idx(c);
|
||||
if (IS_ERR(lprops)) {
|
||||
err = PTR_ERR(lprops);
|
||||
|
@ -300,8 +300,11 @@ void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops,
|
||||
default:
|
||||
ubifs_assert(0);
|
||||
}
|
||||
|
||||
lprops->flags &= ~LPROPS_CAT_MASK;
|
||||
lprops->flags |= cat;
|
||||
c->in_a_category_cnt += 1;
|
||||
ubifs_assert(c->in_a_category_cnt <= c->main_lebs);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -334,6 +337,9 @@ static void ubifs_remove_from_cat(struct ubifs_info *c,
|
||||
default:
|
||||
ubifs_assert(0);
|
||||
}
|
||||
|
||||
c->in_a_category_cnt -= 1;
|
||||
ubifs_assert(c->in_a_category_cnt >= 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1183,6 +1183,8 @@ struct ubifs_debug_info;
|
||||
* @freeable_list: list of freeable non-index LEBs (free + dirty == @leb_size)
|
||||
* @frdi_idx_list: list of freeable index LEBs (free + dirty == @leb_size)
|
||||
* @freeable_cnt: number of freeable LEBs in @freeable_list
|
||||
* @in_a_category_cnt: count of lprops which are in a certain category, which
|
||||
* basically meants that they were loaded from the flash
|
||||
*
|
||||
* @ltab_lnum: LEB number of LPT's own lprops table
|
||||
* @ltab_offs: offset of LPT's own lprops table
|
||||
@ -1412,6 +1414,7 @@ struct ubifs_info {
|
||||
struct list_head freeable_list;
|
||||
struct list_head frdi_idx_list;
|
||||
int freeable_cnt;
|
||||
int in_a_category_cnt;
|
||||
|
||||
int ltab_lnum;
|
||||
int ltab_offs;
|
||||
|
Reference in New Issue
Block a user