UBIFS: fix corruption dump
In the 'ubifs_recover_leb()' function, when we find corrupted empty space, we dump 8K starting from the offset where the last node ends. This is OK if the corrupted empty space is somewhere near that offset. But if the corruption is far at the end of the LEB, we will dump all 0xFF bytes and complitely ignore the interesting data. This is observed on a PPC ("kilauea") with NOR flash. This patch changes the behavior and teaches UBIFS to print only interesting data. I.e., now we find where corruption starts and start dumping from that offset. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Reviewed-by: Adrian Hunter <Adrian.Hunter@nokia.com>
This commit is contained in:
parent
431102fed3
commit
0611254760
|
@ -52,6 +52,25 @@ static int is_empty(void *buf, int len)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* first_non_ff - find offset of the first non-0xff byte.
|
||||||
|
* @buf: buffer to search in
|
||||||
|
* @len: length of buffer
|
||||||
|
*
|
||||||
|
* This function returns offset of the first non-0xff byte in @buf or %-1 if
|
||||||
|
* the buffer contains only 0xff bytes.
|
||||||
|
*/
|
||||||
|
static int first_non_ff(void *buf, int len)
|
||||||
|
{
|
||||||
|
uint8_t *p = buf;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
if (*p++ != 0xff)
|
||||||
|
return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_master_node - get the last valid master node allowing for corruption.
|
* get_master_node - get the last valid master node allowing for corruption.
|
||||||
* @c: UBIFS file-system description object
|
* @c: UBIFS file-system description object
|
||||||
|
@ -649,8 +668,13 @@ struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
|
||||||
clean_buf(c, &buf, lnum, &offs, &len);
|
clean_buf(c, &buf, lnum, &offs, &len);
|
||||||
need_clean = 1;
|
need_clean = 1;
|
||||||
} else {
|
} else {
|
||||||
ubifs_err("corrupt empty space at LEB %d:%d",
|
int corruption = first_non_ff(buf, len);
|
||||||
lnum, offs);
|
|
||||||
|
ubifs_err("corrupt empty space LEB %d:%d, corruption "
|
||||||
|
"starts at %d", lnum, offs, corruption);
|
||||||
|
/* Make sure we dump interesting non-0xFF data */
|
||||||
|
offs = corruption;
|
||||||
|
buf += corruption;
|
||||||
goto corrupted;
|
goto corrupted;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue