Skip to content

Commit

Permalink
UBIFS: always cleanup the recovered LEB
Browse files Browse the repository at this point in the history
Now when we call 'ubifs_recover_leb()' only for LEBs which are potentially
corrupted (i.e., only for last buds, not for all of them), we can cleanup every
LEB, not only those where we find corruption. The reason - unstable bits. Even
though the LEB may look good now, it might contain unstable bits which may hit
us a bit later.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
  • Loading branch information
Artem Bityutskiy authored and Artem Bityutskiy committed May 16, 2011
1 parent 6179920 commit 7c47bfd
Showing 1 changed file with 9 additions and 20 deletions.
29 changes: 9 additions & 20 deletions fs/ubifs/recovery.c
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ static int drop_incomplete_group(struct ubifs_scan_leb *sleb, int *offs)
struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
int offs, void *sbuf, int grouped)
{
int ret = 0, err, len = c->leb_size - offs, need_clean = 0;
int ret = 0, err, len = c->leb_size - offs;
int start = offs;
struct ubifs_scan_leb *sleb;
void *buf = sbuf + offs;
Expand All @@ -620,9 +620,6 @@ struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
if (IS_ERR(sleb))
return sleb;

if (sleb->ecc)
need_clean = 1;

while (len >= 8) {
dbg_scan("look at LEB %d:%d (%d bytes left)",
lnum, offs, len);
Expand Down Expand Up @@ -665,21 +662,18 @@ struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
}

if (ret == SCANNED_GARBAGE || ret == SCANNED_A_BAD_PAD_NODE) {
if (is_last_write(c, buf, offs)) {
if (is_last_write(c, buf, offs))
clean_buf(c, &buf, lnum, &offs, &len);
need_clean = 1;
} else
else
goto corrupted_rescan;
} else if (ret == SCANNED_A_CORRUPT_NODE) {
if (no_more_nodes(c, buf, len, lnum, offs)) {
if (no_more_nodes(c, buf, len, lnum, offs))
clean_buf(c, &buf, lnum, &offs, &len);
need_clean = 1;
} else
else
goto corrupted_rescan;
} else if (!is_empty(buf, len)) {
if (is_last_write(c, buf, offs)) {
clean_buf(c, &buf, lnum, &offs, &len);
need_clean = 1;
} else {
int corruption = first_non_ff(buf, len);

Expand All @@ -701,21 +695,16 @@ struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
buf = sbuf + offs;
len = c->leb_size - offs;
clean_buf(c, &buf, lnum, &offs, &len);
need_clean = 1;
}

if (offs % c->min_io_size) {
if (offs % c->min_io_size)
clean_buf(c, &buf, lnum, &offs, &len);
need_clean = 1;
}

ubifs_end_scan(c, sleb, lnum, offs);

if (need_clean) {
err = fix_unclean_leb(c, sleb, start);
if (err)
goto error;
}
err = fix_unclean_leb(c, sleb, start);
if (err)
goto error;

return sleb;

Expand Down

0 comments on commit 7c47bfd

Please sign in to comment.