diff options
-rw-r--r-- | fs/ubifs/debug.c | 2 | ||||
-rw-r--r-- | fs/ubifs/gc.c | 2 | ||||
-rw-r--r-- | fs/ubifs/log.c | 2 | ||||
-rw-r--r-- | fs/ubifs/lprops.c | 2 | ||||
-rw-r--r-- | fs/ubifs/master.c | 4 | ||||
-rw-r--r-- | fs/ubifs/orphan.c | 4 | ||||
-rw-r--r-- | fs/ubifs/recovery.c | 4 | ||||
-rw-r--r-- | fs/ubifs/replay.c | 6 | ||||
-rw-r--r-- | fs/ubifs/scan.c | 32 | ||||
-rw-r--r-- | fs/ubifs/tnc_commit.c | 2 | ||||
-rw-r--r-- | fs/ubifs/ubifs.h | 2 |
11 files changed, 37 insertions, 25 deletions
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index ce2cd8343618..8183ee0d4f9d 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c | |||
@@ -724,7 +724,7 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum) | |||
724 | 724 | ||
725 | printk(KERN_DEBUG "(pid %d) start dumping LEB %d\n", | 725 | printk(KERN_DEBUG "(pid %d) start dumping LEB %d\n", |
726 | current->pid, lnum); | 726 | current->pid, lnum); |
727 | sleb = ubifs_scan(c, lnum, 0, c->dbg->buf); | 727 | sleb = ubifs_scan(c, lnum, 0, c->dbg->buf, 0); |
728 | if (IS_ERR(sleb)) { | 728 | if (IS_ERR(sleb)) { |
729 | ubifs_err("scan error %d", (int)PTR_ERR(sleb)); | 729 | ubifs_err("scan error %d", (int)PTR_ERR(sleb)); |
730 | return; | 730 | return; |
diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c index f0f5f15d384e..618c2701d3a7 100644 --- a/fs/ubifs/gc.c +++ b/fs/ubifs/gc.c | |||
@@ -529,7 +529,7 @@ int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp) | |||
529 | * We scan the entire LEB even though we only really need to scan up to | 529 | * We scan the entire LEB even though we only really need to scan up to |
530 | * (c->leb_size - lp->free). | 530 | * (c->leb_size - lp->free). |
531 | */ | 531 | */ |
532 | sleb = ubifs_scan(c, lnum, 0, c->sbuf); | 532 | sleb = ubifs_scan(c, lnum, 0, c->sbuf, 0); |
533 | if (IS_ERR(sleb)) | 533 | if (IS_ERR(sleb)) |
534 | return PTR_ERR(sleb); | 534 | return PTR_ERR(sleb); |
535 | 535 | ||
diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c index 56e33772a1ee..60dcf6cbd61b 100644 --- a/fs/ubifs/log.c +++ b/fs/ubifs/log.c | |||
@@ -695,7 +695,7 @@ int ubifs_consolidate_log(struct ubifs_info *c) | |||
695 | lnum = c->ltail_lnum; | 695 | lnum = c->ltail_lnum; |
696 | write_lnum = lnum; | 696 | write_lnum = lnum; |
697 | while (1) { | 697 | while (1) { |
698 | sleb = ubifs_scan(c, lnum, 0, c->sbuf); | 698 | sleb = ubifs_scan(c, lnum, 0, c->sbuf, 0); |
699 | if (IS_ERR(sleb)) { | 699 | if (IS_ERR(sleb)) { |
700 | err = PTR_ERR(sleb); | 700 | err = PTR_ERR(sleb); |
701 | goto out_free; | 701 | goto out_free; |
diff --git a/fs/ubifs/lprops.c b/fs/ubifs/lprops.c index 4cdd284dea56..00f19b445aab 100644 --- a/fs/ubifs/lprops.c +++ b/fs/ubifs/lprops.c | |||
@@ -1096,7 +1096,7 @@ static int scan_check_cb(struct ubifs_info *c, | |||
1096 | } | 1096 | } |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | sleb = ubifs_scan(c, lnum, 0, c->dbg->buf); | 1099 | sleb = ubifs_scan(c, lnum, 0, c->dbg->buf, 0); |
1100 | if (IS_ERR(sleb)) { | 1100 | if (IS_ERR(sleb)) { |
1101 | /* | 1101 | /* |
1102 | * After an unclean unmount, empty and freeable LEBs | 1102 | * After an unclean unmount, empty and freeable LEBs |
diff --git a/fs/ubifs/master.c b/fs/ubifs/master.c index a88f33801b98..6f95a168a56f 100644 --- a/fs/ubifs/master.c +++ b/fs/ubifs/master.c | |||
@@ -40,7 +40,7 @@ static int scan_for_master(struct ubifs_info *c) | |||
40 | 40 | ||
41 | lnum = UBIFS_MST_LNUM; | 41 | lnum = UBIFS_MST_LNUM; |
42 | 42 | ||
43 | sleb = ubifs_scan(c, lnum, 0, c->sbuf); | 43 | sleb = ubifs_scan(c, lnum, 0, c->sbuf, 1); |
44 | if (IS_ERR(sleb)) | 44 | if (IS_ERR(sleb)) |
45 | return PTR_ERR(sleb); | 45 | return PTR_ERR(sleb); |
46 | nodes_cnt = sleb->nodes_cnt; | 46 | nodes_cnt = sleb->nodes_cnt; |
@@ -56,7 +56,7 @@ static int scan_for_master(struct ubifs_info *c) | |||
56 | 56 | ||
57 | lnum += 1; | 57 | lnum += 1; |
58 | 58 | ||
59 | sleb = ubifs_scan(c, lnum, 0, c->sbuf); | 59 | sleb = ubifs_scan(c, lnum, 0, c->sbuf, 1); |
60 | if (IS_ERR(sleb)) | 60 | if (IS_ERR(sleb)) |
61 | return PTR_ERR(sleb); | 61 | return PTR_ERR(sleb); |
62 | if (sleb->nodes_cnt != nodes_cnt) | 62 | if (sleb->nodes_cnt != nodes_cnt) |
diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c index 152a7b34a141..3119af3cdc51 100644 --- a/fs/ubifs/orphan.c +++ b/fs/ubifs/orphan.c | |||
@@ -670,7 +670,7 @@ static int kill_orphans(struct ubifs_info *c) | |||
670 | struct ubifs_scan_leb *sleb; | 670 | struct ubifs_scan_leb *sleb; |
671 | 671 | ||
672 | dbg_rcvry("LEB %d", lnum); | 672 | dbg_rcvry("LEB %d", lnum); |
673 | sleb = ubifs_scan(c, lnum, 0, c->sbuf); | 673 | sleb = ubifs_scan(c, lnum, 0, c->sbuf, 1); |
674 | if (IS_ERR(sleb)) { | 674 | if (IS_ERR(sleb)) { |
675 | sleb = ubifs_recover_leb(c, lnum, 0, c->sbuf, 0); | 675 | sleb = ubifs_recover_leb(c, lnum, 0, c->sbuf, 0); |
676 | if (IS_ERR(sleb)) { | 676 | if (IS_ERR(sleb)) { |
@@ -899,7 +899,7 @@ static int dbg_scan_orphans(struct ubifs_info *c, struct check_info *ci) | |||
899 | for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) { | 899 | for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) { |
900 | struct ubifs_scan_leb *sleb; | 900 | struct ubifs_scan_leb *sleb; |
901 | 901 | ||
902 | sleb = ubifs_scan(c, lnum, 0, c->dbg->buf); | 902 | sleb = ubifs_scan(c, lnum, 0, c->dbg->buf, 0); |
903 | if (IS_ERR(sleb)) { | 903 | if (IS_ERR(sleb)) { |
904 | err = PTR_ERR(sleb); | 904 | err = PTR_ERR(sleb); |
905 | break; | 905 | break; |
diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c index e5f6cf8a1155..f94ddf7efba0 100644 --- a/fs/ubifs/recovery.c +++ b/fs/ubifs/recovery.c | |||
@@ -286,7 +286,7 @@ int ubifs_recover_master_node(struct ubifs_info *c) | |||
286 | mst = mst2; | 286 | mst = mst2; |
287 | } | 287 | } |
288 | 288 | ||
289 | dbg_rcvry("recovered master node from LEB %d", | 289 | ubifs_msg("recovered master node from LEB %d", |
290 | (mst == mst1 ? UBIFS_MST_LNUM : UBIFS_MST_LNUM + 1)); | 290 | (mst == mst1 ? UBIFS_MST_LNUM : UBIFS_MST_LNUM + 1)); |
291 | 291 | ||
292 | memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ); | 292 | memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ); |
@@ -790,7 +790,7 @@ struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum, | |||
790 | * We can only recover at the end of the log, so check that the | 790 | * We can only recover at the end of the log, so check that the |
791 | * next log LEB is empty or out of date. | 791 | * next log LEB is empty or out of date. |
792 | */ | 792 | */ |
793 | sleb = ubifs_scan(c, next_lnum, 0, sbuf); | 793 | sleb = ubifs_scan(c, next_lnum, 0, sbuf, 0); |
794 | if (IS_ERR(sleb)) | 794 | if (IS_ERR(sleb)) |
795 | return sleb; | 795 | return sleb; |
796 | if (sleb->nodes_cnt) { | 796 | if (sleb->nodes_cnt) { |
diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c index 2970500f32df..5c2d6d759a3e 100644 --- a/fs/ubifs/replay.c +++ b/fs/ubifs/replay.c | |||
@@ -506,7 +506,7 @@ static int replay_bud(struct ubifs_info *c, int lnum, int offs, int jhead, | |||
506 | if (c->need_recovery) | 506 | if (c->need_recovery) |
507 | sleb = ubifs_recover_leb(c, lnum, offs, c->sbuf, jhead != GCHD); | 507 | sleb = ubifs_recover_leb(c, lnum, offs, c->sbuf, jhead != GCHD); |
508 | else | 508 | else |
509 | sleb = ubifs_scan(c, lnum, offs, c->sbuf); | 509 | sleb = ubifs_scan(c, lnum, offs, c->sbuf, 0); |
510 | if (IS_ERR(sleb)) | 510 | if (IS_ERR(sleb)) |
511 | return PTR_ERR(sleb); | 511 | return PTR_ERR(sleb); |
512 | 512 | ||
@@ -836,8 +836,8 @@ static int replay_log_leb(struct ubifs_info *c, int lnum, int offs, void *sbuf) | |||
836 | const struct ubifs_cs_node *node; | 836 | const struct ubifs_cs_node *node; |
837 | 837 | ||
838 | dbg_mnt("replay log LEB %d:%d", lnum, offs); | 838 | dbg_mnt("replay log LEB %d:%d", lnum, offs); |
839 | sleb = ubifs_scan(c, lnum, offs, sbuf); | 839 | sleb = ubifs_scan(c, lnum, offs, sbuf, c->need_recovery); |
840 | if (IS_ERR(sleb) ) { | 840 | if (IS_ERR(sleb)) { |
841 | if (PTR_ERR(sleb) != -EUCLEAN || !c->need_recovery) | 841 | if (PTR_ERR(sleb) != -EUCLEAN || !c->need_recovery) |
842 | return PTR_ERR(sleb); | 842 | return PTR_ERR(sleb); |
843 | sleb = ubifs_recover_log_leb(c, lnum, offs, sbuf); | 843 | sleb = ubifs_recover_log_leb(c, lnum, offs, sbuf); |
diff --git a/fs/ubifs/scan.c b/fs/ubifs/scan.c index 892ebfee4fe5..96c525384191 100644 --- a/fs/ubifs/scan.c +++ b/fs/ubifs/scan.c | |||
@@ -108,10 +108,9 @@ int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum, | |||
108 | 108 | ||
109 | /* Make the node pads to 8-byte boundary */ | 109 | /* Make the node pads to 8-byte boundary */ |
110 | if ((node_len + pad_len) & 7) { | 110 | if ((node_len + pad_len) & 7) { |
111 | if (!quiet) { | 111 | if (!quiet) |
112 | dbg_err("bad padding length %d - %d", | 112 | dbg_err("bad padding length %d - %d", |
113 | offs, offs + node_len + pad_len); | 113 | offs, offs + node_len + pad_len); |
114 | } | ||
115 | return SCANNED_A_BAD_PAD_NODE; | 114 | return SCANNED_A_BAD_PAD_NODE; |
116 | } | 115 | } |
117 | 116 | ||
@@ -253,15 +252,19 @@ void ubifs_scanned_corruption(const struct ubifs_info *c, int lnum, int offs, | |||
253 | * @c: UBIFS file-system description object | 252 | * @c: UBIFS file-system description object |
254 | * @lnum: logical eraseblock number | 253 | * @lnum: logical eraseblock number |
255 | * @offs: offset to start at (usually zero) | 254 | * @offs: offset to start at (usually zero) |
256 | * @sbuf: scan buffer (must be c->leb_size) | 255 | * @sbuf: scan buffer (must be of @c->leb_size bytes in size) |
256 | * @quiet: print no messages | ||
257 | * | 257 | * |
258 | * This function scans LEB number @lnum and returns complete information about | 258 | * This function scans LEB number @lnum and returns complete information about |
259 | * its contents. Returns the scaned information in case of success and, | 259 | * its contents. Returns the scaned information in case of success and, |
260 | * %-EUCLEAN if the LEB neads recovery, and other negative error codes in case | 260 | * %-EUCLEAN if the LEB neads recovery, and other negative error codes in case |
261 | * of failure. | 261 | * of failure. |
262 | * | ||
263 | * If @quiet is non-zero, this function does not print large and scary | ||
264 | * error messages and flash dumps in case of errors. | ||
262 | */ | 265 | */ |
263 | struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, | 266 | struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, |
264 | int offs, void *sbuf) | 267 | int offs, void *sbuf, int quiet) |
265 | { | 268 | { |
266 | void *buf = sbuf + offs; | 269 | void *buf = sbuf + offs; |
267 | int err, len = c->leb_size - offs; | 270 | int err, len = c->leb_size - offs; |
@@ -280,7 +283,7 @@ struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, | |||
280 | 283 | ||
281 | cond_resched(); | 284 | cond_resched(); |
282 | 285 | ||
283 | ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 0); | 286 | ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet); |
284 | if (ret > 0) { | 287 | if (ret > 0) { |
285 | /* Padding bytes or a valid padding node */ | 288 | /* Padding bytes or a valid padding node */ |
286 | offs += ret; | 289 | offs += ret; |
@@ -320,7 +323,9 @@ struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, | |||
320 | } | 323 | } |
321 | 324 | ||
322 | if (offs % c->min_io_size) { | 325 | if (offs % c->min_io_size) { |
323 | ubifs_err("empty space starts at non-aligned offset %d", offs); | 326 | if (!quiet) |
327 | ubifs_err("empty space starts at non-aligned offset %d", | ||
328 | offs); | ||
324 | goto corrupted;; | 329 | goto corrupted;; |
325 | } | 330 | } |
326 | 331 | ||
@@ -331,18 +336,25 @@ struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, | |||
331 | break; | 336 | break; |
332 | for (; len; offs++, buf++, len--) | 337 | for (; len; offs++, buf++, len--) |
333 | if (*(uint8_t *)buf != 0xff) { | 338 | if (*(uint8_t *)buf != 0xff) { |
334 | ubifs_err("corrupt empty space at LEB %d:%d", | 339 | if (!quiet) |
335 | lnum, offs); | 340 | ubifs_err("corrupt empty space at LEB %d:%d", |
341 | lnum, offs); | ||
336 | goto corrupted; | 342 | goto corrupted; |
337 | } | 343 | } |
338 | 344 | ||
339 | return sleb; | 345 | return sleb; |
340 | 346 | ||
341 | corrupted: | 347 | corrupted: |
342 | ubifs_scanned_corruption(c, lnum, offs, buf); | 348 | if (!quiet) { |
349 | ubifs_scanned_corruption(c, lnum, offs, buf); | ||
350 | ubifs_err("LEB %d scanning failed", lnum); | ||
351 | } | ||
343 | err = -EUCLEAN; | 352 | err = -EUCLEAN; |
353 | ubifs_scan_destroy(sleb); | ||
354 | return ERR_PTR(err); | ||
355 | |||
344 | error: | 356 | error: |
345 | ubifs_err("LEB %d scanning failed", lnum); | 357 | ubifs_err("LEB %d scanning failed, error %d", lnum, err); |
346 | ubifs_scan_destroy(sleb); | 358 | ubifs_scan_destroy(sleb); |
347 | return ERR_PTR(err); | 359 | return ERR_PTR(err); |
348 | } | 360 | } |
diff --git a/fs/ubifs/tnc_commit.c b/fs/ubifs/tnc_commit.c index fde8d127c768..53288e5d604e 100644 --- a/fs/ubifs/tnc_commit.c +++ b/fs/ubifs/tnc_commit.c | |||
@@ -245,7 +245,7 @@ static int layout_leb_in_gaps(struct ubifs_info *c, int *p) | |||
245 | * it is more comprehensive and less efficient than is needed for this | 245 | * it is more comprehensive and less efficient than is needed for this |
246 | * purpose. | 246 | * purpose. |
247 | */ | 247 | */ |
248 | sleb = ubifs_scan(c, lnum, 0, c->ileb_buf); | 248 | sleb = ubifs_scan(c, lnum, 0, c->ileb_buf, 0); |
249 | c->ileb_len = 0; | 249 | c->ileb_len = 0; |
250 | if (IS_ERR(sleb)) | 250 | if (IS_ERR(sleb)) |
251 | return PTR_ERR(sleb); | 251 | return PTR_ERR(sleb); |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index a29349094422..9782e7cf8f2b 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
@@ -1451,7 +1451,7 @@ int ubifs_sync_wbufs_by_inode(struct ubifs_info *c, struct inode *inode); | |||
1451 | 1451 | ||
1452 | /* scan.c */ | 1452 | /* scan.c */ |
1453 | struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, | 1453 | struct ubifs_scan_leb *ubifs_scan(const struct ubifs_info *c, int lnum, |
1454 | int offs, void *sbuf); | 1454 | int offs, void *sbuf, int quiet); |
1455 | void ubifs_scan_destroy(struct ubifs_scan_leb *sleb); | 1455 | void ubifs_scan_destroy(struct ubifs_scan_leb *sleb); |
1456 | int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum, | 1456 | int ubifs_scan_a_node(const struct ubifs_info *c, void *buf, int len, int lnum, |
1457 | int offs, int quiet); | 1457 | int offs, int quiet); |