From patchwork Sat Aug 7 08:26:15 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [5/7] UBIFS: do not look up junk nodes Date: Fri, 06 Aug 2010 22:26:15 -0000 From: Artem Bityutskiy X-Patchwork-Id: 61166 Message-Id: <1281169577-18664-6-git-send-email-dedekind1@gmail.com> To: linux-mtd@lists.infradead.org Cc: Matthieu CASTET , Adrian Hunter From: Artem Bityutskiy When moving nodes, do not try to look up truncation and padding nodes in TNC, because they do not exist there. This bug was most probably harmless, because the TNC look-up probably failed for all padding and truncation nodes, but it could also succeed and lead to various "interesting" errors. This patch fixes the issue. Signed-off-by: Artem Bityutskiy --- fs/ubifs/gc.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c index fbb9272..f68e58d 100644 --- a/fs/ubifs/gc.c +++ b/fs/ubifs/gc.c @@ -227,9 +227,26 @@ static int sort_nodes(struct ubifs_info *c, struct ubifs_scan_leb *sleb, list_for_each_entry_safe(snod, tmp, &sleb->nodes, list) { int err; - ubifs_assert(snod->type != UBIFS_IDX_NODE); - ubifs_assert(snod->type != UBIFS_REF_NODE); - ubifs_assert(snod->type != UBIFS_CS_NODE); + ubifs_assert(snod->type == UBIFS_INO_NODE || + snod->type == UBIFS_DATA_NODE || + snod->type == UBIFS_DENT_NODE || + snod->type == UBIFS_XENT_NODE || + snod->type == UBIFS_TRUN_NODE || + snod->type == UBIFS_PAD_NODE); + 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); + + if (snod->type != UBIFS_INO_NODE && + snod->type != UBIFS_DATA_NODE && + snod->type != UBIFS_DENT_NODE && + snod->type != UBIFS_XENT_NODE) { + /* Truncation or padding node, zap it */ + list_del(&snod->list); + kfree(snod); + continue; + } err = ubifs_tnc_has_node(c, &snod->key, 0, sleb->lnum, snod->offs, 0);