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