1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#ifndef __UBOOT__
39#include <log.h>
40#include <dm/devres.h>
41#include <linux/crc32.h>
42#include <linux/slab.h>
43#include <u-boot/crc.h>
44#else
45#include <linux/err.h>
46#endif
47#include "ubifs.h"
48
49
50
51
52
53
54
55
56
57static int is_empty(void *buf, int len)
58{
59 uint8_t *p = buf;
60 int i;
61
62 for (i = 0; i < len; i++)
63 if (*p++ != 0xff)
64 return 0;
65 return 1;
66}
67
68
69
70
71
72
73
74
75
76static int first_non_ff(void *buf, int len)
77{
78 uint8_t *p = buf;
79 int i;
80
81 for (i = 0; i < len; i++)
82 if (*p++ != 0xff)
83 return i;
84 return -1;
85}
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104static int get_master_node(const struct ubifs_info *c, int lnum, void **pbuf,
105 struct ubifs_mst_node **mst, void **cor)
106{
107 const int sz = c->mst_node_alsz;
108 int err, offs, len;
109 void *sbuf, *buf;
110
111 sbuf = vmalloc(c->leb_size);
112 if (!sbuf)
113 return -ENOMEM;
114
115 err = ubifs_leb_read(c, lnum, sbuf, 0, c->leb_size, 0);
116 if (err && err != -EBADMSG)
117 goto out_free;
118
119
120 offs = 0;
121 buf = sbuf;
122 len = c->leb_size;
123 while (offs + UBIFS_MST_NODE_SZ <= c->leb_size) {
124 struct ubifs_ch *ch = buf;
125
126 if (le32_to_cpu(ch->magic) != UBIFS_NODE_MAGIC)
127 break;
128 offs += sz;
129 buf += sz;
130 len -= sz;
131 }
132
133 if (offs) {
134 int ret;
135
136 offs -= sz;
137 buf -= sz;
138 len += sz;
139 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
140 if (ret != SCANNED_A_NODE && offs) {
141
142 offs -= sz;
143 buf -= sz;
144 len += sz;
145 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
146 if (ret != SCANNED_A_NODE)
147
148
149
150
151
152 goto out_err;
153 }
154 if (ret == SCANNED_A_NODE) {
155 struct ubifs_ch *ch = buf;
156
157 if (ch->node_type != UBIFS_MST_NODE)
158 goto out_err;
159 dbg_rcvry("found a master node at %d:%d", lnum, offs);
160 *mst = buf;
161 offs += sz;
162 buf += sz;
163 len -= sz;
164 }
165 }
166
167 if (offs < c->leb_size) {
168 if (!is_empty(buf, min_t(int, len, sz))) {
169 *cor = buf;
170 dbg_rcvry("found corruption at %d:%d", lnum, offs);
171 }
172 offs += sz;
173 buf += sz;
174 len -= sz;
175 }
176
177 if (offs < c->leb_size)
178 if (!is_empty(buf, len))
179 goto out_err;
180 *pbuf = sbuf;
181 return 0;
182
183out_err:
184 err = -EINVAL;
185out_free:
186 vfree(sbuf);
187 *mst = NULL;
188 *cor = NULL;
189 return err;
190}
191
192
193
194
195
196
197
198
199static int write_rcvrd_mst_node(struct ubifs_info *c,
200 struct ubifs_mst_node *mst)
201{
202 int err = 0, lnum = UBIFS_MST_LNUM, sz = c->mst_node_alsz;
203 __le32 save_flags;
204
205 dbg_rcvry("recovery");
206
207 save_flags = mst->flags;
208 mst->flags |= cpu_to_le32(UBIFS_MST_RCVRY);
209
210 ubifs_prepare_node(c, mst, UBIFS_MST_NODE_SZ, 1);
211 err = ubifs_leb_change(c, lnum, mst, sz);
212 if (err)
213 goto out;
214 err = ubifs_leb_change(c, lnum + 1, mst, sz);
215 if (err)
216 goto out;
217out:
218 mst->flags = save_flags;
219 return err;
220}
221
222
223
224
225
226
227
228
229
230
231int ubifs_recover_master_node(struct ubifs_info *c)
232{
233 void *buf1 = NULL, *buf2 = NULL, *cor1 = NULL, *cor2 = NULL;
234 struct ubifs_mst_node *mst1 = NULL, *mst2 = NULL, *mst;
235 const int sz = c->mst_node_alsz;
236 int err, offs1, offs2;
237
238 dbg_rcvry("recovery");
239
240 err = get_master_node(c, UBIFS_MST_LNUM, &buf1, &mst1, &cor1);
241 if (err)
242 goto out_free;
243
244 err = get_master_node(c, UBIFS_MST_LNUM + 1, &buf2, &mst2, &cor2);
245 if (err)
246 goto out_free;
247
248 if (mst1) {
249 offs1 = (void *)mst1 - buf1;
250 if ((le32_to_cpu(mst1->flags) & UBIFS_MST_RCVRY) &&
251 (offs1 == 0 && !cor1)) {
252
253
254
255
256 dbg_rcvry("recovery recovery");
257 mst = mst1;
258 } else if (mst2) {
259 offs2 = (void *)mst2 - buf2;
260 if (offs1 == offs2) {
261
262 if (memcmp((void *)mst1 + UBIFS_CH_SZ,
263 (void *)mst2 + UBIFS_CH_SZ,
264 UBIFS_MST_NODE_SZ - UBIFS_CH_SZ))
265 goto out_err;
266 mst = mst1;
267 } else if (offs2 + sz == offs1) {
268
269 if (cor1)
270 goto out_err;
271 mst = mst1;
272 } else if (offs1 == 0 &&
273 c->leb_size - offs2 - sz < sz) {
274
275 if (cor1)
276 goto out_err;
277 mst = mst1;
278 } else
279 goto out_err;
280 } else {
281
282
283
284
285
286 if (offs1 != 0 || cor1)
287 goto out_err;
288 mst = mst1;
289 }
290 } else {
291 if (!mst2)
292 goto out_err;
293
294
295
296
297 offs2 = (void *)mst2 - buf2;
298 if (offs2 + sz + sz <= c->leb_size)
299 goto out_err;
300 mst = mst2;
301 }
302
303 ubifs_msg(c, "recovered master node from LEB %d",
304 (mst == mst1 ? UBIFS_MST_LNUM : UBIFS_MST_LNUM + 1));
305
306 memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ);
307
308 if (c->ro_mount) {
309
310 c->rcvrd_mst_node = kmalloc(sz, GFP_KERNEL);
311 if (!c->rcvrd_mst_node) {
312 err = -ENOMEM;
313 goto out_free;
314 }
315 memcpy(c->rcvrd_mst_node, c->mst_node, UBIFS_MST_NODE_SZ);
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY);
342#ifndef __UBOOT__
343 } else {
344
345 c->max_sqnum = le64_to_cpu(mst->ch.sqnum) - 1;
346 err = write_rcvrd_mst_node(c, c->mst_node);
347 if (err)
348 goto out_free;
349#endif
350 }
351
352 vfree(buf2);
353 vfree(buf1);
354
355 return 0;
356
357out_err:
358 err = -EINVAL;
359out_free:
360 ubifs_err(c, "failed to recover master node");
361 if (mst1) {
362 ubifs_err(c, "dumping first master node");
363 ubifs_dump_node(c, mst1);
364 }
365 if (mst2) {
366 ubifs_err(c, "dumping second master node");
367 ubifs_dump_node(c, mst2);
368 }
369 vfree(buf2);
370 vfree(buf1);
371 return err;
372}
373
374
375
376
377
378
379
380
381
382
383int ubifs_write_rcvrd_mst_node(struct ubifs_info *c)
384{
385 int err;
386
387 if (!c->rcvrd_mst_node)
388 return 0;
389 c->rcvrd_mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY);
390 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY);
391 err = write_rcvrd_mst_node(c, c->rcvrd_mst_node);
392 if (err)
393 return err;
394 kfree(c->rcvrd_mst_node);
395 c->rcvrd_mst_node = NULL;
396 return 0;
397}
398
399
400
401
402
403
404
405
406
407
408
409
410static int is_last_write(const struct ubifs_info *c, void *buf, int offs)
411{
412 int empty_offs, check_len;
413 uint8_t *p;
414
415
416
417
418
419 empty_offs = ALIGN(offs + 1, c->max_write_size);
420 check_len = c->leb_size - empty_offs;
421 p = buf + empty_offs - offs;
422 return is_empty(p, check_len);
423}
424
425
426
427
428
429
430
431
432
433
434
435
436
437static void clean_buf(const struct ubifs_info *c, void **buf, int lnum,
438 int *offs, int *len)
439{
440 int empty_offs, pad_len;
441
442 lnum = lnum;
443 dbg_rcvry("cleaning corruption at %d:%d", lnum, *offs);
444
445 ubifs_assert(!(*offs & 7));
446 empty_offs = ALIGN(*offs, c->min_io_size);
447 pad_len = empty_offs - *offs;
448 ubifs_pad(c, *buf, pad_len);
449 *offs += pad_len;
450 *buf += pad_len;
451 *len -= pad_len;
452 memset(*buf, 0xff, c->leb_size - empty_offs);
453}
454
455
456
457
458
459
460
461
462
463
464
465
466
467static int no_more_nodes(const struct ubifs_info *c, void *buf, int len,
468 int lnum, int offs)
469{
470 struct ubifs_ch *ch = buf;
471 int skip, dlen = le32_to_cpu(ch->len);
472
473
474 skip = ALIGN(offs + UBIFS_CH_SZ, c->max_write_size) - offs;
475 if (is_empty(buf + skip, len - skip))
476 return 1;
477
478
479
480
481 if (ubifs_check_node(c, buf, lnum, offs, 1, 0) != -EUCLEAN) {
482 dbg_rcvry("unexpected bad common header at %d:%d", lnum, offs);
483 return 0;
484 }
485
486 skip = ALIGN(offs + dlen, c->max_write_size) - offs;
487
488 if (is_empty(buf + skip, len - skip))
489 return 1;
490 dbg_rcvry("unexpected data at %d:%d", lnum, offs + skip);
491 return 0;
492}
493
494
495
496
497
498
499
500static int fix_unclean_leb(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
501 int start)
502{
503 int lnum = sleb->lnum, endpt = start;
504
505
506 if (!list_empty(&sleb->nodes)) {
507 struct ubifs_scan_node *snod;
508
509 snod = list_entry(sleb->nodes.prev,
510 struct ubifs_scan_node, list);
511 endpt = snod->offs + snod->len;
512 }
513
514 if (c->ro_mount && !c->remounting_rw) {
515
516 struct ubifs_unclean_leb *ucleb;
517
518 dbg_rcvry("need to fix LEB %d start %d endpt %d",
519 lnum, start, sleb->endpt);
520 ucleb = kzalloc(sizeof(struct ubifs_unclean_leb), GFP_NOFS);
521 if (!ucleb)
522 return -ENOMEM;
523 ucleb->lnum = lnum;
524 ucleb->endpt = endpt;
525 list_add_tail(&ucleb->list, &c->unclean_leb_list);
526#ifndef __UBOOT__
527 } else {
528
529 int err;
530
531 dbg_rcvry("fixing LEB %d start %d endpt %d",
532 lnum, start, sleb->endpt);
533 if (endpt == 0) {
534 err = ubifs_leb_unmap(c, lnum);
535 if (err)
536 return err;
537 } else {
538 int len = ALIGN(endpt, c->min_io_size);
539
540 if (start) {
541 err = ubifs_leb_read(c, lnum, sleb->buf, 0,
542 start, 1);
543 if (err)
544 return err;
545 }
546
547 if (len > endpt) {
548 int pad_len = len - ALIGN(endpt, 8);
549
550 if (pad_len > 0) {
551 void *buf = sleb->buf + len - pad_len;
552
553 ubifs_pad(c, buf, pad_len);
554 }
555 }
556 err = ubifs_leb_change(c, lnum, sleb->buf, len);
557 if (err)
558 return err;
559 }
560#endif
561 }
562 return 0;
563}
564
565
566
567
568
569
570
571
572
573static void drop_last_group(struct ubifs_scan_leb *sleb, int *offs)
574{
575 while (!list_empty(&sleb->nodes)) {
576 struct ubifs_scan_node *snod;
577 struct ubifs_ch *ch;
578
579 snod = list_entry(sleb->nodes.prev, struct ubifs_scan_node,
580 list);
581 ch = snod->node;
582 if (ch->group_type != UBIFS_IN_NODE_GROUP)
583 break;
584
585 dbg_rcvry("dropping grouped node at %d:%d",
586 sleb->lnum, snod->offs);
587 *offs = snod->offs;
588 list_del(&snod->list);
589 kfree(snod);
590 sleb->nodes_cnt -= 1;
591 }
592}
593
594
595
596
597
598
599
600
601
602static void drop_last_node(struct ubifs_scan_leb *sleb, int *offs)
603{
604 struct ubifs_scan_node *snod;
605
606 if (!list_empty(&sleb->nodes)) {
607 snod = list_entry(sleb->nodes.prev, struct ubifs_scan_node,
608 list);
609
610 dbg_rcvry("dropping last node at %d:%d",
611 sleb->lnum, snod->offs);
612 *offs = snod->offs;
613 list_del(&snod->list);
614 kfree(snod);
615 sleb->nodes_cnt -= 1;
616 }
617}
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
634 int offs, void *sbuf, int jhead)
635{
636 int ret = 0, err, len = c->leb_size - offs, start = offs, min_io_unit;
637 int grouped = jhead == -1 ? 0 : c->jheads[jhead].grouped;
638 struct ubifs_scan_leb *sleb;
639 void *buf = sbuf + offs;
640
641 dbg_rcvry("%d:%d, jhead %d, grouped %d", lnum, offs, jhead, grouped);
642
643 sleb = ubifs_start_scan(c, lnum, offs, sbuf);
644 if (IS_ERR(sleb))
645 return sleb;
646
647 ubifs_assert(len >= 8);
648 while (len >= 8) {
649 dbg_scan("look at LEB %d:%d (%d bytes left)",
650 lnum, offs, len);
651
652 cond_resched();
653
654
655
656
657
658 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
659 if (ret == SCANNED_A_NODE) {
660
661 struct ubifs_ch *ch = buf;
662 int node_len;
663
664 err = ubifs_add_snod(c, sleb, buf, offs);
665 if (err)
666 goto error;
667 node_len = ALIGN(le32_to_cpu(ch->len), 8);
668 offs += node_len;
669 buf += node_len;
670 len -= node_len;
671 } else if (ret > 0) {
672
673 offs += ret;
674 buf += ret;
675 len -= ret;
676 } else if (ret == SCANNED_EMPTY_SPACE ||
677 ret == SCANNED_GARBAGE ||
678 ret == SCANNED_A_BAD_PAD_NODE ||
679 ret == SCANNED_A_CORRUPT_NODE) {
680 dbg_rcvry("found corruption (%d) at %d:%d",
681 ret, lnum, offs);
682 break;
683 } else {
684 ubifs_err(c, "unexpected return value %d", ret);
685 err = -EINVAL;
686 goto error;
687 }
688 }
689
690 if (ret == SCANNED_GARBAGE || ret == SCANNED_A_BAD_PAD_NODE) {
691 if (!is_last_write(c, buf, offs))
692 goto corrupted_rescan;
693 } else if (ret == SCANNED_A_CORRUPT_NODE) {
694 if (!no_more_nodes(c, buf, len, lnum, offs))
695 goto corrupted_rescan;
696 } else if (!is_empty(buf, len)) {
697 if (!is_last_write(c, buf, offs)) {
698 int corruption = first_non_ff(buf, len);
699
700
701
702
703
704 ubifs_err(c, "corrupt empty space LEB %d:%d, corruption starts at %d",
705 lnum, offs, corruption);
706
707 offs += corruption;
708 buf += corruption;
709 goto corrupted;
710 }
711 }
712
713 min_io_unit = round_down(offs, c->min_io_size);
714 if (grouped)
715
716
717
718
719 drop_last_group(sleb, &offs);
720
721 if (jhead == GCHD) {
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772 while (offs > min_io_unit)
773 drop_last_node(sleb, &offs);
774 }
775
776 buf = sbuf + offs;
777 len = c->leb_size - offs;
778
779 clean_buf(c, &buf, lnum, &offs, &len);
780 ubifs_end_scan(c, sleb, lnum, offs);
781
782 err = fix_unclean_leb(c, sleb, start);
783 if (err)
784 goto error;
785
786 return sleb;
787
788corrupted_rescan:
789
790 ubifs_err(c, "corruption %d", ret);
791 ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
792corrupted:
793 ubifs_scanned_corruption(c, lnum, offs, buf);
794 err = -EUCLEAN;
795error:
796 ubifs_err(c, "LEB %d scanning failed", lnum);
797 ubifs_scan_destroy(sleb);
798 return ERR_PTR(err);
799}
800
801
802
803
804
805
806
807
808
809
810static int get_cs_sqnum(struct ubifs_info *c, int lnum, int offs,
811 unsigned long long *cs_sqnum)
812{
813 struct ubifs_cs_node *cs_node = NULL;
814 int err, ret;
815
816 dbg_rcvry("at %d:%d", lnum, offs);
817 cs_node = kmalloc(UBIFS_CS_NODE_SZ, GFP_KERNEL);
818 if (!cs_node)
819 return -ENOMEM;
820 if (c->leb_size - offs < UBIFS_CS_NODE_SZ)
821 goto out_err;
822 err = ubifs_leb_read(c, lnum, (void *)cs_node, offs,
823 UBIFS_CS_NODE_SZ, 0);
824 if (err && err != -EBADMSG)
825 goto out_free;
826 ret = ubifs_scan_a_node(c, cs_node, UBIFS_CS_NODE_SZ, lnum, offs, 0);
827 if (ret != SCANNED_A_NODE) {
828 ubifs_err(c, "Not a valid node");
829 goto out_err;
830 }
831 if (cs_node->ch.node_type != UBIFS_CS_NODE) {
832 ubifs_err(c, "Node a CS node, type is %d", cs_node->ch.node_type);
833 goto out_err;
834 }
835 if (le64_to_cpu(cs_node->cmt_no) != c->cmt_no) {
836 ubifs_err(c, "CS node cmt_no %llu != current cmt_no %llu",
837 (unsigned long long)le64_to_cpu(cs_node->cmt_no),
838 c->cmt_no);
839 goto out_err;
840 }
841 *cs_sqnum = le64_to_cpu(cs_node->ch.sqnum);
842 dbg_rcvry("commit start sqnum %llu", *cs_sqnum);
843 kfree(cs_node);
844 return 0;
845
846out_err:
847 err = -EINVAL;
848out_free:
849 ubifs_err(c, "failed to get CS sqnum");
850 kfree(cs_node);
851 return err;
852}
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum,
868 int offs, void *sbuf)
869{
870 struct ubifs_scan_leb *sleb;
871 int next_lnum;
872
873 dbg_rcvry("LEB %d", lnum);
874 next_lnum = lnum + 1;
875 if (next_lnum >= UBIFS_LOG_LNUM + c->log_lebs)
876 next_lnum = UBIFS_LOG_LNUM;
877 if (next_lnum != c->ltail_lnum) {
878
879
880
881
882 sleb = ubifs_scan(c, next_lnum, 0, sbuf, 0);
883 if (IS_ERR(sleb))
884 return sleb;
885 if (sleb->nodes_cnt) {
886 struct ubifs_scan_node *snod;
887 unsigned long long cs_sqnum = c->cs_sqnum;
888
889 snod = list_entry(sleb->nodes.next,
890 struct ubifs_scan_node, list);
891 if (cs_sqnum == 0) {
892 int err;
893
894 err = get_cs_sqnum(c, lnum, offs, &cs_sqnum);
895 if (err) {
896 ubifs_scan_destroy(sleb);
897 return ERR_PTR(err);
898 }
899 }
900 if (snod->sqnum > cs_sqnum) {
901 ubifs_err(c, "unrecoverable log corruption in LEB %d",
902 lnum);
903 ubifs_scan_destroy(sleb);
904 return ERR_PTR(-EUCLEAN);
905 }
906 }
907 ubifs_scan_destroy(sleb);
908 }
909 return ubifs_recover_leb(c, lnum, offs, sbuf, -1);
910}
911
912
913
914
915
916
917
918
919
920
921
922
923static int recover_head(struct ubifs_info *c, int lnum, int offs, void *sbuf)
924{
925 int len = c->max_write_size, err;
926
927 if (offs + len > c->leb_size)
928 len = c->leb_size - offs;
929
930 if (!len)
931 return 0;
932
933
934 err = ubifs_leb_read(c, lnum, sbuf, offs, len, 1);
935 if (err || !is_empty(sbuf, len)) {
936 dbg_rcvry("cleaning head at %d:%d", lnum, offs);
937 if (offs == 0)
938 return ubifs_leb_unmap(c, lnum);
939 err = ubifs_leb_read(c, lnum, sbuf, 0, offs, 1);
940 if (err)
941 return err;
942 return ubifs_leb_change(c, lnum, sbuf, offs);
943 }
944
945 return 0;
946}
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965int ubifs_recover_inl_heads(struct ubifs_info *c, void *sbuf)
966{
967 int err;
968
969 ubifs_assert(!c->ro_mount || c->remounting_rw);
970
971 dbg_rcvry("checking index head at %d:%d", c->ihead_lnum, c->ihead_offs);
972 err = recover_head(c, c->ihead_lnum, c->ihead_offs, sbuf);
973 if (err)
974 return err;
975
976 dbg_rcvry("checking LPT head at %d:%d", c->nhead_lnum, c->nhead_offs);
977
978 return recover_head(c, c->nhead_lnum, c->nhead_offs, sbuf);
979}
980
981
982
983
984
985
986
987
988
989
990
991
992
993static int clean_an_unclean_leb(struct ubifs_info *c,
994 struct ubifs_unclean_leb *ucleb, void *sbuf)
995{
996 int err, lnum = ucleb->lnum, offs = 0, len = ucleb->endpt, quiet = 1;
997 void *buf = sbuf;
998
999 dbg_rcvry("LEB %d len %d", lnum, len);
1000
1001 if (len == 0) {
1002
1003 return ubifs_leb_unmap(c, lnum);
1004 }
1005
1006 err = ubifs_leb_read(c, lnum, buf, offs, len, 0);
1007 if (err && err != -EBADMSG)
1008 return err;
1009
1010 while (len >= 8) {
1011 int ret;
1012
1013 cond_resched();
1014
1015
1016 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet);
1017
1018 if (ret == SCANNED_A_NODE) {
1019
1020 struct ubifs_ch *ch = buf;
1021 int node_len;
1022
1023 node_len = ALIGN(le32_to_cpu(ch->len), 8);
1024 offs += node_len;
1025 buf += node_len;
1026 len -= node_len;
1027 continue;
1028 }
1029
1030 if (ret > 0) {
1031
1032 offs += ret;
1033 buf += ret;
1034 len -= ret;
1035 continue;
1036 }
1037
1038 if (ret == SCANNED_EMPTY_SPACE) {
1039 ubifs_err(c, "unexpected empty space at %d:%d",
1040 lnum, offs);
1041 return -EUCLEAN;
1042 }
1043
1044 if (quiet) {
1045
1046 quiet = 0;
1047 continue;
1048 }
1049
1050 ubifs_scanned_corruption(c, lnum, offs, buf);
1051 return -EUCLEAN;
1052 }
1053
1054
1055 len = ALIGN(ucleb->endpt, c->min_io_size);
1056 if (len > ucleb->endpt) {
1057 int pad_len = len - ALIGN(ucleb->endpt, 8);
1058
1059 if (pad_len > 0) {
1060 buf = c->sbuf + len - pad_len;
1061 ubifs_pad(c, buf, pad_len);
1062 }
1063 }
1064
1065
1066 err = ubifs_leb_change(c, lnum, sbuf, len);
1067 if (err)
1068 return err;
1069
1070 dbg_rcvry("cleaned LEB %d", lnum);
1071
1072 return 0;
1073}
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086int ubifs_clean_lebs(struct ubifs_info *c, void *sbuf)
1087{
1088 dbg_rcvry("recovery");
1089 while (!list_empty(&c->unclean_leb_list)) {
1090 struct ubifs_unclean_leb *ucleb;
1091 int err;
1092
1093 ucleb = list_entry(c->unclean_leb_list.next,
1094 struct ubifs_unclean_leb, list);
1095 err = clean_an_unclean_leb(c, ucleb, sbuf);
1096 if (err)
1097 return err;
1098 list_del(&ucleb->list);
1099 kfree(ucleb);
1100 }
1101 return 0;
1102}
1103
1104#ifndef __UBOOT__
1105
1106
1107
1108
1109
1110
1111
1112
1113static int grab_empty_leb(struct ubifs_info *c)
1114{
1115 int lnum, err;
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132 lnum = ubifs_find_free_leb_for_idx(c);
1133 if (lnum < 0) {
1134 ubifs_err(c, "could not find an empty LEB");
1135 ubifs_dump_lprops(c);
1136 ubifs_dump_budg(c, &c->bi);
1137 return lnum;
1138 }
1139
1140
1141 err = ubifs_change_one_lp(c, lnum, LPROPS_NC, LPROPS_NC, 0,
1142 LPROPS_INDEX, 0);
1143 if (err)
1144 return err;
1145
1146 c->gc_lnum = lnum;
1147 dbg_rcvry("found empty LEB %d, run commit", lnum);
1148
1149 return ubifs_run_commit(c);
1150}
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170int ubifs_rcvry_gc_commit(struct ubifs_info *c)
1171{
1172 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf;
1173 struct ubifs_lprops lp;
1174 int err;
1175
1176 dbg_rcvry("GC head LEB %d, offs %d", wbuf->lnum, wbuf->offs);
1177
1178 c->gc_lnum = -1;
1179 if (wbuf->lnum == -1 || wbuf->offs == c->leb_size)
1180 return grab_empty_leb(c);
1181
1182 err = ubifs_find_dirty_leb(c, &lp, wbuf->offs, 2);
1183 if (err) {
1184 if (err != -ENOSPC)
1185 return err;
1186
1187 dbg_rcvry("could not find a dirty LEB");
1188 return grab_empty_leb(c);
1189 }
1190
1191 ubifs_assert(!(lp.flags & LPROPS_INDEX));
1192 ubifs_assert(lp.free + lp.dirty >= wbuf->offs);
1193
1194
1195
1196
1197
1198 dbg_rcvry("committing");
1199 err = ubifs_run_commit(c);
1200 if (err)
1201 return err;
1202
1203 dbg_rcvry("GC'ing LEB %d", lp.lnum);
1204 mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead);
1205 err = ubifs_garbage_collect_leb(c, &lp);
1206 if (err >= 0) {
1207 int err2 = ubifs_wbuf_sync_nolock(wbuf);
1208
1209 if (err2)
1210 err = err2;
1211 }
1212 mutex_unlock(&wbuf->io_mutex);
1213 if (err < 0) {
1214 ubifs_err(c, "GC failed, error %d", err);
1215 if (err == -EAGAIN)
1216 err = -EINVAL;
1217 return err;
1218 }
1219
1220 ubifs_assert(err == LEB_RETAINED);
1221 if (err != LEB_RETAINED)
1222 return -EINVAL;
1223
1224 err = ubifs_leb_unmap(c, c->gc_lnum);
1225 if (err)
1226 return err;
1227
1228 dbg_rcvry("allocated LEB %d for GC", lp.lnum);
1229 return 0;
1230}
1231#else
1232int ubifs_rcvry_gc_commit(struct ubifs_info *c)
1233{
1234 return 0;
1235}
1236#endif
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247struct size_entry {
1248 struct rb_node rb;
1249 ino_t inum;
1250 loff_t i_size;
1251 loff_t d_size;
1252 int exists;
1253 struct inode *inode;
1254};
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264static int add_ino(struct ubifs_info *c, ino_t inum, loff_t i_size,
1265 loff_t d_size, int exists)
1266{
1267 struct rb_node **p = &c->size_tree.rb_node, *parent = NULL;
1268 struct size_entry *e;
1269
1270 while (*p) {
1271 parent = *p;
1272 e = rb_entry(parent, struct size_entry, rb);
1273 if (inum < e->inum)
1274 p = &(*p)->rb_left;
1275 else
1276 p = &(*p)->rb_right;
1277 }
1278
1279 e = kzalloc(sizeof(struct size_entry), GFP_KERNEL);
1280 if (!e)
1281 return -ENOMEM;
1282
1283 e->inum = inum;
1284 e->i_size = i_size;
1285 e->d_size = d_size;
1286 e->exists = exists;
1287
1288 rb_link_node(&e->rb, parent, p);
1289 rb_insert_color(&e->rb, &c->size_tree);
1290
1291 return 0;
1292}
1293
1294
1295
1296
1297
1298
1299static struct size_entry *find_ino(struct ubifs_info *c, ino_t inum)
1300{
1301 struct rb_node *p = c->size_tree.rb_node;
1302 struct size_entry *e;
1303
1304 while (p) {
1305 e = rb_entry(p, struct size_entry, rb);
1306 if (inum < e->inum)
1307 p = p->rb_left;
1308 else if (inum > e->inum)
1309 p = p->rb_right;
1310 else
1311 return e;
1312 }
1313 return NULL;
1314}
1315
1316
1317
1318
1319
1320
1321static void remove_ino(struct ubifs_info *c, ino_t inum)
1322{
1323 struct size_entry *e = find_ino(c, inum);
1324
1325 if (!e)
1326 return;
1327 rb_erase(&e->rb, &c->size_tree);
1328 kfree(e);
1329}
1330
1331
1332
1333
1334
1335void ubifs_destroy_size_tree(struct ubifs_info *c)
1336{
1337 struct size_entry *e, *n;
1338
1339 rbtree_postorder_for_each_entry_safe(e, n, &c->size_tree, rb) {
1340 if (e->inode)
1341 iput(e->inode);
1342 kfree(e);
1343 }
1344
1345 c->size_tree = RB_ROOT;
1346}
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key,
1374 int deletion, loff_t new_size)
1375{
1376 ino_t inum = key_inum(c, key);
1377 struct size_entry *e;
1378 int err;
1379
1380 switch (key_type(c, key)) {
1381 case UBIFS_INO_KEY:
1382 if (deletion)
1383 remove_ino(c, inum);
1384 else {
1385 e = find_ino(c, inum);
1386 if (e) {
1387 e->i_size = new_size;
1388 e->exists = 1;
1389 } else {
1390 err = add_ino(c, inum, new_size, 0, 1);
1391 if (err)
1392 return err;
1393 }
1394 }
1395 break;
1396 case UBIFS_DATA_KEY:
1397 e = find_ino(c, inum);
1398 if (e) {
1399 if (new_size > e->d_size)
1400 e->d_size = new_size;
1401 } else {
1402 err = add_ino(c, inum, 0, new_size, 0);
1403 if (err)
1404 return err;
1405 }
1406 break;
1407 case UBIFS_TRUN_KEY:
1408 e = find_ino(c, inum);
1409 if (e)
1410 e->d_size = new_size;
1411 break;
1412 }
1413 return 0;
1414}
1415
1416#ifndef __UBOOT__
1417
1418
1419
1420
1421
1422static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e)
1423{
1424 struct ubifs_ino_node *ino = c->sbuf;
1425 unsigned char *p;
1426 union ubifs_key key;
1427 int err, lnum, offs, len;
1428 loff_t i_size;
1429 uint32_t crc;
1430
1431
1432 ino_key_init(c, &key, e->inum);
1433 err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs);
1434 if (err)
1435 goto out;
1436
1437
1438
1439
1440 i_size = le64_to_cpu(ino->size);
1441 if (i_size >= e->d_size)
1442 return 0;
1443
1444 err = ubifs_leb_read(c, lnum, c->sbuf, 0, c->leb_size, 1);
1445 if (err)
1446 goto out;
1447
1448 ino = c->sbuf + offs;
1449 ino->size = cpu_to_le64(e->d_size);
1450 len = le32_to_cpu(ino->ch.len);
1451 crc = crc32(UBIFS_CRC32_INIT, (void *)ino + 8, len - 8);
1452 ino->ch.crc = cpu_to_le32(crc);
1453
1454 p = c->sbuf;
1455 len = c->leb_size - 1;
1456 while (p[len] == 0xff)
1457 len -= 1;
1458 len = ALIGN(len + 1, c->min_io_size);
1459
1460 err = ubifs_leb_change(c, lnum, c->sbuf, len);
1461 if (err)
1462 goto out;
1463 dbg_rcvry("inode %lu at %d:%d size %lld -> %lld",
1464 (unsigned long)e->inum, lnum, offs, i_size, e->d_size);
1465 return 0;
1466
1467out:
1468 ubifs_warn(c, "inode %lu failed to fix size %lld -> %lld error %d",
1469 (unsigned long)e->inum, e->i_size, e->d_size, err);
1470 return err;
1471}
1472#endif
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483int ubifs_recover_size(struct ubifs_info *c)
1484{
1485 struct rb_node *this = rb_first(&c->size_tree);
1486
1487 while (this) {
1488 struct size_entry *e;
1489 int err;
1490
1491 e = rb_entry(this, struct size_entry, rb);
1492 if (!e->exists) {
1493 union ubifs_key key;
1494
1495 ino_key_init(c, &key, e->inum);
1496 err = ubifs_tnc_lookup(c, &key, c->sbuf);
1497 if (err && err != -ENOENT)
1498 return err;
1499 if (err == -ENOENT) {
1500
1501 dbg_rcvry("removing ino %lu",
1502 (unsigned long)e->inum);
1503 err = ubifs_tnc_remove_ino(c, e->inum);
1504 if (err)
1505 return err;
1506 } else {
1507 struct ubifs_ino_node *ino = c->sbuf;
1508
1509 e->exists = 1;
1510 e->i_size = le64_to_cpu(ino->size);
1511 }
1512 }
1513
1514 if (e->exists && e->i_size < e->d_size) {
1515 if (c->ro_mount) {
1516
1517 struct inode *inode;
1518 struct ubifs_inode *ui;
1519
1520 ubifs_assert(!e->inode);
1521
1522 inode = ubifs_iget(c->vfs_sb, e->inum);
1523 if (IS_ERR(inode))
1524 return PTR_ERR(inode);
1525
1526 ui = ubifs_inode(inode);
1527 if (inode->i_size < e->d_size) {
1528 dbg_rcvry("ino %lu size %lld -> %lld",
1529 (unsigned long)e->inum,
1530 inode->i_size, e->d_size);
1531 inode->i_size = e->d_size;
1532 ui->ui_size = e->d_size;
1533 ui->synced_i_size = e->d_size;
1534 e->inode = inode;
1535 this = rb_next(this);
1536 continue;
1537 }
1538 iput(inode);
1539#ifndef __UBOOT__
1540 } else {
1541
1542 err = fix_size_in_place(c, e);
1543 if (err)
1544 return err;
1545 if (e->inode)
1546 iput(e->inode);
1547#endif
1548 }
1549 }
1550
1551 this = rb_next(this);
1552 rb_erase(&e->rb, &c->size_tree);
1553 kfree(e);
1554 }
1555
1556 return 0;
1557}
1558