diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-02-06 09:41:06 -0500 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-02-06 11:59:30 -0500 |
commit | be7b42a5cb4c5050bcab4f57022007155c119d45 (patch) | |
tree | eb5a75d2e816747e1e953ba515097d4f865ebdf4 /fs/ubifs | |
parent | 822ed64c5b5d15474c6abb1834726643e2cff558 (diff) |
UBIFS: describe UBIFS recovery logic some more
This patch adds more commentaries about UBIFS recovery logic which should
explain the famous UBIFS "corrupt empty space" errors.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'fs/ubifs')
-rw-r--r-- | fs/ubifs/recovery.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c index 77e9b874b6c2..6ecbc91ef9ac 100644 --- a/fs/ubifs/recovery.c +++ b/fs/ubifs/recovery.c | |||
@@ -28,6 +28,23 @@ | |||
28 | * UBIFS always cleans away all remnants of an unclean un-mount, so that | 28 | * UBIFS always cleans away all remnants of an unclean un-mount, so that |
29 | * errors do not accumulate. However UBIFS defers recovery if it is mounted | 29 | * errors do not accumulate. However UBIFS defers recovery if it is mounted |
30 | * read-only, and the flash is not modified in that case. | 30 | * read-only, and the flash is not modified in that case. |
31 | * | ||
32 | * The general UBIFS approach to the recovery is that it recovers from | ||
33 | * corruptions which could be caused by power cuts, but it refuses to recover | ||
34 | * from corruption caused by other reasons. And UBIFS tries to distinguish | ||
35 | * between these 2 reasons of corruptions and silently recover in the former | ||
36 | * case and loudly complain in the latter case. | ||
37 | * | ||
38 | * UBIFS writes only to erased LEBs, so it writes only to the flash space | ||
39 | * containing only 0xFFs. UBIFS also always writes strictly from the beginning | ||
40 | * of the LEB to the end. And UBIFS assumes that the underlying flash media | ||
41 | * writes in @c->min_io_unit bytes at a time. | ||
42 | * | ||
43 | * Hence, if UBIFS finds a corrupted node at offset X, it expects only the min. | ||
44 | * I/O unit corresponding to offset X to contain corrupted data, all the | ||
45 | * following min. I/O units have to contain empty space (all 0xFFs). If this is | ||
46 | * not true, the corruption cannot be the result of a power cut, and UBIFS | ||
47 | * refuses to mount. | ||
31 | */ | 48 | */ |
32 | 49 | ||
33 | #include <linux/crc32.h> | 50 | #include <linux/crc32.h> |
@@ -671,6 +688,10 @@ struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, | |||
671 | } else { | 688 | } else { |
672 | int corruption = first_non_ff(buf, len); | 689 | int corruption = first_non_ff(buf, len); |
673 | 690 | ||
691 | /* | ||
692 | * See header comment for this file for more | ||
693 | * explanations about the reasons we have this check. | ||
694 | */ | ||
674 | ubifs_err("corrupt empty space LEB %d:%d, corruption " | 695 | ubifs_err("corrupt empty space LEB %d:%d, corruption " |
675 | "starts at %d", lnum, offs, corruption); | 696 | "starts at %d", lnum, offs, corruption); |
676 | /* Make sure we dump interesting non-0xFF data */ | 697 | /* Make sure we dump interesting non-0xFF data */ |