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(c, "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(c, "failed to recover master node");
364 if (mst1) {
365 ubifs_err(c, "dumping first master node");
366 ubifs_dump_node(c, mst1);
367 }
368 if (mst2) {
369 ubifs_err(c, "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(c, "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(c, "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(c, "corruption %d", ret);
792 ubifs_scan_a_node(c, buf, len, lnum, offs, 0);
793corrupted:
794 ubifs_scanned_corruption(c, lnum, offs, buf);
795 err = -EUCLEAN;
796error:
797 ubifs_err(c, "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(c, "Not a valid node");
830 goto out_err;
831 }
832 if (cs_node->ch.node_type != UBIFS_CS_NODE) {
833 ubifs_err(c, "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(c, "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(c, "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(c, "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
979 return recover_head(c, c->nhead_lnum, c->nhead_offs, sbuf);
980}
981
982
983
984
985
986
987
988
989
990
991
992
993
994static int clean_an_unclean_leb(struct ubifs_info *c,
995 struct ubifs_unclean_leb *ucleb, void *sbuf)
996{
997 int err, lnum = ucleb->lnum, offs = 0, len = ucleb->endpt, quiet = 1;
998 void *buf = sbuf;
999
1000 dbg_rcvry("LEB %d len %d", lnum, len);
1001
1002 if (len == 0) {
1003
1004 return ubifs_leb_unmap(c, lnum);
1005 }
1006
1007 err = ubifs_leb_read(c, lnum, buf, offs, len, 0);
1008 if (err && err != -EBADMSG)
1009 return err;
1010
1011 while (len >= 8) {
1012 int ret;
1013
1014 cond_resched();
1015
1016
1017 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet);
1018
1019 if (ret == SCANNED_A_NODE) {
1020
1021 struct ubifs_ch *ch = buf;
1022 int node_len;
1023
1024 node_len = ALIGN(le32_to_cpu(ch->len), 8);
1025 offs += node_len;
1026 buf += node_len;
1027 len -= node_len;
1028 continue;
1029 }
1030
1031 if (ret > 0) {
1032
1033 offs += ret;
1034 buf += ret;
1035 len -= ret;
1036 continue;
1037 }
1038
1039 if (ret == SCANNED_EMPTY_SPACE) {
1040 ubifs_err(c, "unexpected empty space at %d:%d",
1041 lnum, offs);
1042 return -EUCLEAN;
1043 }
1044
1045 if (quiet) {
1046
1047 quiet = 0;
1048 continue;
1049 }
1050
1051 ubifs_scanned_corruption(c, lnum, offs, buf);
1052 return -EUCLEAN;
1053 }
1054
1055
1056 len = ALIGN(ucleb->endpt, c->min_io_size);
1057 if (len > ucleb->endpt) {
1058 int pad_len = len - ALIGN(ucleb->endpt, 8);
1059
1060 if (pad_len > 0) {
1061 buf = c->sbuf + len - pad_len;
1062 ubifs_pad(c, buf, pad_len);
1063 }
1064 }
1065
1066
1067 err = ubifs_leb_change(c, lnum, sbuf, len);
1068 if (err)
1069 return err;
1070
1071 dbg_rcvry("cleaned LEB %d", lnum);
1072
1073 return 0;
1074}
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087int ubifs_clean_lebs(struct ubifs_info *c, void *sbuf)
1088{
1089 dbg_rcvry("recovery");
1090 while (!list_empty(&c->unclean_leb_list)) {
1091 struct ubifs_unclean_leb *ucleb;
1092 int err;
1093
1094 ucleb = list_entry(c->unclean_leb_list.next,
1095 struct ubifs_unclean_leb, list);
1096 err = clean_an_unclean_leb(c, ucleb, sbuf);
1097 if (err)
1098 return err;
1099 list_del(&ucleb->list);
1100 kfree(ucleb);
1101 }
1102 return 0;
1103}
1104
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
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241struct size_entry {
1242 struct rb_node rb;
1243 ino_t inum;
1244 loff_t i_size;
1245 loff_t d_size;
1246 int exists;
1247 struct inode *inode;
1248};
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258static int add_ino(struct ubifs_info *c, ino_t inum, loff_t i_size,
1259 loff_t d_size, int exists)
1260{
1261 struct rb_node **p = &c->size_tree.rb_node, *parent = NULL;
1262 struct size_entry *e;
1263
1264 while (*p) {
1265 parent = *p;
1266 e = rb_entry(parent, struct size_entry, rb);
1267 if (inum < e->inum)
1268 p = &(*p)->rb_left;
1269 else
1270 p = &(*p)->rb_right;
1271 }
1272
1273 e = kzalloc(sizeof(struct size_entry), GFP_KERNEL);
1274 if (!e)
1275 return -ENOMEM;
1276
1277 e->inum = inum;
1278 e->i_size = i_size;
1279 e->d_size = d_size;
1280 e->exists = exists;
1281
1282 rb_link_node(&e->rb, parent, p);
1283 rb_insert_color(&e->rb, &c->size_tree);
1284
1285 return 0;
1286}
1287
1288
1289
1290
1291
1292
1293static struct size_entry *find_ino(struct ubifs_info *c, ino_t inum)
1294{
1295 struct rb_node *p = c->size_tree.rb_node;
1296 struct size_entry *e;
1297
1298 while (p) {
1299 e = rb_entry(p, struct size_entry, rb);
1300 if (inum < e->inum)
1301 p = p->rb_left;
1302 else if (inum > e->inum)
1303 p = p->rb_right;
1304 else
1305 return e;
1306 }
1307 return NULL;
1308}
1309
1310
1311
1312
1313
1314
1315static void remove_ino(struct ubifs_info *c, ino_t inum)
1316{
1317 struct size_entry *e = find_ino(c, inum);
1318
1319 if (!e)
1320 return;
1321 rb_erase(&e->rb, &c->size_tree);
1322 kfree(e);
1323}
1324
1325
1326
1327
1328
1329void ubifs_destroy_size_tree(struct ubifs_info *c)
1330{
1331 struct size_entry *e, *n;
1332
1333 rbtree_postorder_for_each_entry_safe(e, n, &c->size_tree, rb) {
1334 iput(e->inode);
1335 kfree(e);
1336 }
1337
1338 c->size_tree = RB_ROOT;
1339}
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key,
1367 int deletion, loff_t new_size)
1368{
1369 ino_t inum = key_inum(c, key);
1370 struct size_entry *e;
1371 int err;
1372
1373 switch (key_type(c, key)) {
1374 case UBIFS_INO_KEY:
1375 if (deletion)
1376 remove_ino(c, inum);
1377 else {
1378 e = find_ino(c, inum);
1379 if (e) {
1380 e->i_size = new_size;
1381 e->exists = 1;
1382 } else {
1383 err = add_ino(c, inum, new_size, 0, 1);
1384 if (err)
1385 return err;
1386 }
1387 }
1388 break;
1389 case UBIFS_DATA_KEY:
1390 e = find_ino(c, inum);
1391 if (e) {
1392 if (new_size > e->d_size)
1393 e->d_size = new_size;
1394 } else {
1395 err = add_ino(c, inum, 0, new_size, 0);
1396 if (err)
1397 return err;
1398 }
1399 break;
1400 case UBIFS_TRUN_KEY:
1401 e = find_ino(c, inum);
1402 if (e)
1403 e->d_size = new_size;
1404 break;
1405 }
1406 return 0;
1407}
1408
1409
1410
1411
1412
1413
1414static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e)
1415{
1416 struct ubifs_ino_node *ino = c->sbuf;
1417 unsigned char *p;
1418 union ubifs_key key;
1419 int err, lnum, offs, len;
1420 loff_t i_size;
1421 uint32_t crc;
1422
1423
1424 ino_key_init(c, &key, e->inum);
1425 err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs);
1426 if (err)
1427 goto out;
1428
1429
1430
1431
1432 i_size = le64_to_cpu(ino->size);
1433 if (i_size >= e->d_size)
1434 return 0;
1435
1436 err = ubifs_leb_read(c, lnum, c->sbuf, 0, c->leb_size, 1);
1437 if (err)
1438 goto out;
1439
1440 ino = c->sbuf + offs;
1441 ino->size = cpu_to_le64(e->d_size);
1442 len = le32_to_cpu(ino->ch.len);
1443 crc = crc32(UBIFS_CRC32_INIT, (void *)ino + 8, len - 8);
1444 ino->ch.crc = cpu_to_le32(crc);
1445
1446 p = c->sbuf;
1447 len = c->leb_size - 1;
1448 while (p[len] == 0xff)
1449 len -= 1;
1450 len = ALIGN(len + 1, c->min_io_size);
1451
1452 err = ubifs_leb_change(c, lnum, c->sbuf, len);
1453 if (err)
1454 goto out;
1455 dbg_rcvry("inode %lu at %d:%d size %lld -> %lld",
1456 (unsigned long)e->inum, lnum, offs, i_size, e->d_size);
1457 return 0;
1458
1459out:
1460 ubifs_warn(c, "inode %lu failed to fix size %lld -> %lld error %d",
1461 (unsigned long)e->inum, e->i_size, e->d_size, err);
1462 return err;
1463}
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474int ubifs_recover_size(struct ubifs_info *c)
1475{
1476 struct rb_node *this = rb_first(&c->size_tree);
1477
1478 while (this) {
1479 struct size_entry *e;
1480 int err;
1481
1482 e = rb_entry(this, struct size_entry, rb);
1483 if (!e->exists) {
1484 union ubifs_key key;
1485
1486 ino_key_init(c, &key, e->inum);
1487 err = ubifs_tnc_lookup(c, &key, c->sbuf);
1488 if (err && err != -ENOENT)
1489 return err;
1490 if (err == -ENOENT) {
1491
1492 dbg_rcvry("removing ino %lu",
1493 (unsigned long)e->inum);
1494 err = ubifs_tnc_remove_ino(c, e->inum);
1495 if (err)
1496 return err;
1497 } else {
1498 struct ubifs_ino_node *ino = c->sbuf;
1499
1500 e->exists = 1;
1501 e->i_size = le64_to_cpu(ino->size);
1502 }
1503 }
1504
1505 if (e->exists && e->i_size < e->d_size) {
1506 if (c->ro_mount) {
1507
1508 struct inode *inode;
1509 struct ubifs_inode *ui;
1510
1511 ubifs_assert(!e->inode);
1512
1513 inode = ubifs_iget(c->vfs_sb, e->inum);
1514 if (IS_ERR(inode))
1515 return PTR_ERR(inode);
1516
1517 ui = ubifs_inode(inode);
1518 if (inode->i_size < e->d_size) {
1519 dbg_rcvry("ino %lu size %lld -> %lld",
1520 (unsigned long)e->inum,
1521 inode->i_size, e->d_size);
1522 inode->i_size = e->d_size;
1523 ui->ui_size = e->d_size;
1524 ui->synced_i_size = e->d_size;
1525 e->inode = inode;
1526 this = rb_next(this);
1527 continue;
1528 }
1529 iput(inode);
1530 } else {
1531
1532 err = fix_size_in_place(c, e);
1533 if (err)
1534 return err;
1535 iput(e->inode);
1536 }
1537 }
1538
1539 this = rb_next(this);
1540 rb_erase(&e->rb, &c->size_tree);
1541 kfree(e);
1542 }
1543
1544 return 0;
1545}
1546