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
603
604static void drop_last_node(struct ubifs_scan_leb *sleb, int *offs)
605{
606 struct ubifs_scan_node *snod;
607
608 if (!list_empty(&sleb->nodes)) {
609 snod = list_entry(sleb->nodes.prev, struct ubifs_scan_node,
610 list);
611
612 dbg_rcvry("dropping last node at %d:%d", 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 "
706 "starts at %d", 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 "
903 "in LEB %d", 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 rb_node *this = c->size_tree.rb_node;
1338 struct size_entry *e;
1339
1340 while (this) {
1341 if (this->rb_left) {
1342 this = this->rb_left;
1343 continue;
1344 } else if (this->rb_right) {
1345 this = this->rb_right;
1346 continue;
1347 }
1348 e = rb_entry(this, struct size_entry, rb);
1349 if (e->inode)
1350 iput(e->inode);
1351 this = rb_parent(this);
1352 if (this) {
1353 if (this->rb_left == &e->rb)
1354 this->rb_left = NULL;
1355 else
1356 this->rb_right = NULL;
1357 }
1358 kfree(e);
1359 }
1360 c->size_tree = RB_ROOT;
1361}
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key,
1389 int deletion, loff_t new_size)
1390{
1391 ino_t inum = key_inum(c, key);
1392 struct size_entry *e;
1393 int err;
1394
1395 switch (key_type(c, key)) {
1396 case UBIFS_INO_KEY:
1397 if (deletion)
1398 remove_ino(c, inum);
1399 else {
1400 e = find_ino(c, inum);
1401 if (e) {
1402 e->i_size = new_size;
1403 e->exists = 1;
1404 } else {
1405 err = add_ino(c, inum, new_size, 0, 1);
1406 if (err)
1407 return err;
1408 }
1409 }
1410 break;
1411 case UBIFS_DATA_KEY:
1412 e = find_ino(c, inum);
1413 if (e) {
1414 if (new_size > e->d_size)
1415 e->d_size = new_size;
1416 } else {
1417 err = add_ino(c, inum, 0, new_size, 0);
1418 if (err)
1419 return err;
1420 }
1421 break;
1422 case UBIFS_TRUN_KEY:
1423 e = find_ino(c, inum);
1424 if (e)
1425 e->d_size = new_size;
1426 break;
1427 }
1428 return 0;
1429}
1430
1431
1432
1433
1434
1435
1436static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e)
1437{
1438 struct ubifs_ino_node *ino = c->sbuf;
1439 unsigned char *p;
1440 union ubifs_key key;
1441 int err, lnum, offs, len;
1442 loff_t i_size;
1443 uint32_t crc;
1444
1445
1446 ino_key_init(c, &key, e->inum);
1447 err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs);
1448 if (err)
1449 goto out;
1450
1451
1452
1453
1454 i_size = le64_to_cpu(ino->size);
1455 if (i_size >= e->d_size)
1456 return 0;
1457
1458 err = ubifs_leb_read(c, lnum, c->sbuf, 0, c->leb_size, 1);
1459 if (err)
1460 goto out;
1461
1462 ino = c->sbuf + offs;
1463 ino->size = cpu_to_le64(e->d_size);
1464 len = le32_to_cpu(ino->ch.len);
1465 crc = crc32(UBIFS_CRC32_INIT, (void *)ino + 8, len - 8);
1466 ino->ch.crc = cpu_to_le32(crc);
1467
1468 p = c->sbuf;
1469 len = c->leb_size - 1;
1470 while (p[len] == 0xff)
1471 len -= 1;
1472 len = ALIGN(len + 1, c->min_io_size);
1473
1474 err = ubifs_leb_change(c, lnum, c->sbuf, len);
1475 if (err)
1476 goto out;
1477 dbg_rcvry("inode %lu at %d:%d size %lld -> %lld",
1478 (unsigned long)e->inum, lnum, offs, i_size, e->d_size);
1479 return 0;
1480
1481out:
1482 ubifs_warn("inode %lu failed to fix size %lld -> %lld error %d",
1483 (unsigned long)e->inum, e->i_size, e->d_size, err);
1484 return err;
1485}
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496int ubifs_recover_size(struct ubifs_info *c)
1497{
1498 struct rb_node *this = rb_first(&c->size_tree);
1499
1500 while (this) {
1501 struct size_entry *e;
1502 int err;
1503
1504 e = rb_entry(this, struct size_entry, rb);
1505 if (!e->exists) {
1506 union ubifs_key key;
1507
1508 ino_key_init(c, &key, e->inum);
1509 err = ubifs_tnc_lookup(c, &key, c->sbuf);
1510 if (err && err != -ENOENT)
1511 return err;
1512 if (err == -ENOENT) {
1513
1514 dbg_rcvry("removing ino %lu",
1515 (unsigned long)e->inum);
1516 err = ubifs_tnc_remove_ino(c, e->inum);
1517 if (err)
1518 return err;
1519 } else {
1520 struct ubifs_ino_node *ino = c->sbuf;
1521
1522 e->exists = 1;
1523 e->i_size = le64_to_cpu(ino->size);
1524 }
1525 }
1526
1527 if (e->exists && e->i_size < e->d_size) {
1528 if (c->ro_mount) {
1529
1530 struct inode *inode;
1531 struct ubifs_inode *ui;
1532
1533 ubifs_assert(!e->inode);
1534
1535 inode = ubifs_iget(c->vfs_sb, e->inum);
1536 if (IS_ERR(inode))
1537 return PTR_ERR(inode);
1538
1539 ui = ubifs_inode(inode);
1540 if (inode->i_size < e->d_size) {
1541 dbg_rcvry("ino %lu size %lld -> %lld",
1542 (unsigned long)e->inum,
1543 inode->i_size, e->d_size);
1544 inode->i_size = e->d_size;
1545 ui->ui_size = e->d_size;
1546 ui->synced_i_size = e->d_size;
1547 e->inode = inode;
1548 this = rb_next(this);
1549 continue;
1550 }
1551 iput(inode);
1552 } else {
1553
1554 err = fix_size_in_place(c, e);
1555 if (err)
1556 return err;
1557 if (e->inode)
1558 iput(e->inode);
1559 }
1560 }
1561
1562 this = rb_next(this);
1563 rb_erase(&e->rb, &c->size_tree);
1564 kfree(e);
1565 }
1566
1567 return 0;
1568}
1569