Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce95a36b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents 006b9568 a28ad42a
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -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) {
			/*
			 * 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);
				ubifs_assert(c->freeable_cnt == 0);
			if (c->lst.empty_lebs - c->lst.taken_empty_lebs > 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);
+6 −0
Original line number Original line Diff line number Diff line
@@ -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);
}
}


/**
/**
+3 −0
Original line number Original line Diff line number Diff line
@@ -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;