forked from Minki/linux
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. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQpQcdAAoJECmIfjd9wqK0iOAP/RbkGdtNznPpm4henealAx+d 9R5kDsmVT3iSmVC7ryAwCapDoe0JUhzN9OiaAMzH66Hmw0isFoOFY5VGd+jPmbMd biIUTvQ9AmmrTuLW0zkU8SmUwLDxmZD48IhJnzkmEaUAzF1cN1eLox5FDTzs9a/p RW+m1RXJWX2tPpGs9WRtltVfaLaieQcfFbuSmuY48vyR9TM9svoMOqW2hEABlMFA xvJFwir/H1w1mE+QVcB7FhvvUTB3fMcCNnxIEiLec2QLlQwJXfIO03ZpMJAN7Z/s s7lgRl29pI6vCwbyV1u9P3hfPg02a0hB71U4nk3HXE5rGBJMTf2qgXJnBE8sDxVu kO8yIcGv9f/rD6JFmFbQ1VmMH7XCBb6Glyyqbz8hkRR6hnkyeDiGz3UnO48cqM2d gApoRlRGPwG3vqjIxKdKY2qzkPgtw86ktKgS2K7X8Owh+yYgcGYKstK5OtRn83aW 2s5Z6n10i/ucI0bVNYoBr7I1NnSg7b2AETbeNdnQiAmOS+6022HaOaSVxJQTlY7n p/WhsRMHp3vUeok7M42+ObXOMe8tJF00NnlneNx9bpPmlTOvnKxB7/WcPNEqGSwo vBkrFTp+HCo+mLCT/4ug2XSxMQD42oGUv5wYSjNwpsT9gCsrpC2ZUD++yk6ifliq dXSypO7Gd4jLSF7sHtq0 =1iao -----END PGP SIGNATURE----- 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:
commit
ce95a36bb9
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user