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) {
|
if (!lprops) {
|
||||||
lprops = ubifs_fast_find_freeable(c);
|
lprops = ubifs_fast_find_freeable(c);
|
||||||
if (!lprops) {
|
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);
|
lprops = scan_for_leb_for_idx(c);
|
||||||
if (IS_ERR(lprops)) {
|
if (IS_ERR(lprops)) {
|
||||||
err = PTR_ERR(lprops);
|
err = PTR_ERR(lprops);
|
||||||
|
@@ -300,8 +300,11 @@ void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops,
|
|||||||
default:
|
default:
|
||||||
ubifs_assert(0);
|
ubifs_assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
lprops->flags &= ~LPROPS_CAT_MASK;
|
lprops->flags &= ~LPROPS_CAT_MASK;
|
||||||
lprops->flags |= cat;
|
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:
|
default:
|
||||||
ubifs_assert(0);
|
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)
|
* @freeable_list: list of freeable non-index LEBs (free + dirty == @leb_size)
|
||||||
* @frdi_idx_list: list of freeable 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
|
* @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_lnum: LEB number of LPT's own lprops table
|
||||||
* @ltab_offs: offset 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 freeable_list;
|
||||||
struct list_head frdi_idx_list;
|
struct list_head frdi_idx_list;
|
||||||
int freeable_cnt;
|
int freeable_cnt;
|
||||||
|
int in_a_category_cnt;
|
||||||
|
|
||||||
int ltab_lnum;
|
int ltab_lnum;
|
||||||
int ltab_offs;
|
int ltab_offs;
|
||||||
|
Reference in New Issue
Block a user