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

Commit 44ec83b8 authored by Artem Bityutskiy's avatar Artem Bityutskiy
Browse files

UBIFS: do not look up truncation nodes



When moving nodes in GC, do not try to look up truncation nodes in TNC,
because they do not exist there. This would be harmless, because the TNC
look-up would fail, if we did not have bug 'ubifs_add_snod()' which reads
garbage into 'snod->key'. But in any case, it is less error prone to
explicitly ignore everything but inode, data, dentry and xentry nodes.

Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
parent e3408ad4
Loading
Loading
Loading
Loading
+20 −3
Original line number Original line Diff line number Diff line
@@ -233,9 +233,26 @@ static int sort_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
	list_for_each_entry_safe(snod, tmp, &sleb->nodes, list) {
	list_for_each_entry_safe(snod, tmp, &sleb->nodes, list) {
		int err;
		int err;


		ubifs_assert(snod->type != UBIFS_IDX_NODE);
		ubifs_assert(snod->type == UBIFS_INO_NODE  ||
		ubifs_assert(snod->type != UBIFS_REF_NODE);
			     snod->type == UBIFS_DATA_NODE ||
		ubifs_assert(snod->type != UBIFS_CS_NODE);
			     snod->type == UBIFS_DENT_NODE ||
			     snod->type == UBIFS_XENT_NODE ||
			     snod->type == UBIFS_TRUN_NODE);

		if (snod->type != UBIFS_INO_NODE  &&
		    snod->type != UBIFS_DATA_NODE &&
		    snod->type != UBIFS_DENT_NODE &&
		    snod->type != UBIFS_XENT_NODE) {
			/* Probably truncation node, zap it */
			list_del(&snod->list);
			kfree(snod);
			continue;
		}

		ubifs_assert(key_type(c, &snod->key) == UBIFS_DATA_KEY ||
			     key_type(c, &snod->key) == UBIFS_INO_KEY  ||
			     key_type(c, &snod->key) == UBIFS_DENT_KEY ||
			     key_type(c, &snod->key) == UBIFS_XENT_KEY);


		err = ubifs_tnc_has_node(c, &snod->key, 0, sleb->lnum,
		err = ubifs_tnc_has_node(c, &snod->key, 0, sleb->lnum,
					 snod->offs, 0);
					 snod->offs, 0);