1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include "ubifs.h"
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
51
52
53
54
55#ifdef CONFIG_UBIFS_FS_DEBUG
56static int dbg_check_orphans(struct ubifs_info *c);
57#else
58#define dbg_check_orphans(c) 0
59#endif
60
61
62
63
64
65
66
67
68
69int ubifs_add_orphan(struct ubifs_info *c, ino_t inum)
70{
71 struct ubifs_orphan *orphan, *o;
72 struct rb_node **p, *parent = NULL;
73
74 orphan = kzalloc(sizeof(struct ubifs_orphan), GFP_NOFS);
75 if (!orphan)
76 return -ENOMEM;
77 orphan->inum = inum;
78 orphan->new = 1;
79
80 spin_lock(&c->orphan_lock);
81 if (c->tot_orphans >= c->max_orphans) {
82 spin_unlock(&c->orphan_lock);
83 kfree(orphan);
84 return -ENFILE;
85 }
86 p = &c->orph_tree.rb_node;
87 while (*p) {
88 parent = *p;
89 o = rb_entry(parent, struct ubifs_orphan, rb);
90 if (inum < o->inum)
91 p = &(*p)->rb_left;
92 else if (inum > o->inum)
93 p = &(*p)->rb_right;
94 else {
95 dbg_err("orphaned twice");
96 spin_unlock(&c->orphan_lock);
97 kfree(orphan);
98 return 0;
99 }
100 }
101 c->tot_orphans += 1;
102 c->new_orphans += 1;
103 rb_link_node(&orphan->rb, parent, p);
104 rb_insert_color(&orphan->rb, &c->orph_tree);
105 list_add_tail(&orphan->list, &c->orph_list);
106 list_add_tail(&orphan->new_list, &c->orph_new);
107 spin_unlock(&c->orphan_lock);
108 dbg_gen("ino %lu", (unsigned long)inum);
109 return 0;
110}
111
112
113
114
115
116
117
118
119void ubifs_delete_orphan(struct ubifs_info *c, ino_t inum)
120{
121 struct ubifs_orphan *o;
122 struct rb_node *p;
123
124 spin_lock(&c->orphan_lock);
125 p = c->orph_tree.rb_node;
126 while (p) {
127 o = rb_entry(p, struct ubifs_orphan, rb);
128 if (inum < o->inum)
129 p = p->rb_left;
130 else if (inum > o->inum)
131 p = p->rb_right;
132 else {
133 if (o->dnext) {
134 spin_unlock(&c->orphan_lock);
135 dbg_gen("deleted twice ino %lu",
136 (unsigned long)inum);
137 return;
138 }
139 if (o->cnext) {
140 o->dnext = c->orph_dnext;
141 c->orph_dnext = o;
142 spin_unlock(&c->orphan_lock);
143 dbg_gen("delete later ino %lu",
144 (unsigned long)inum);
145 return;
146 }
147 rb_erase(p, &c->orph_tree);
148 list_del(&o->list);
149 c->tot_orphans -= 1;
150 if (o->new) {
151 list_del(&o->new_list);
152 c->new_orphans -= 1;
153 }
154 spin_unlock(&c->orphan_lock);
155 kfree(o);
156 dbg_gen("inum %lu", (unsigned long)inum);
157 return;
158 }
159 }
160 spin_unlock(&c->orphan_lock);
161 dbg_err("missing orphan ino %lu", (unsigned long)inum);
162 dbg_dump_stack();
163}
164
165
166
167
168
169
170
171int ubifs_orphan_start_commit(struct ubifs_info *c)
172{
173 struct ubifs_orphan *orphan, **last;
174
175 spin_lock(&c->orphan_lock);
176 last = &c->orph_cnext;
177 list_for_each_entry(orphan, &c->orph_new, new_list) {
178 ubifs_assert(orphan->new);
179 orphan->new = 0;
180 *last = orphan;
181 last = &orphan->cnext;
182 }
183 *last = orphan->cnext;
184 c->cmt_orphans = c->new_orphans;
185 c->new_orphans = 0;
186 dbg_cmt("%d orphans to commit", c->cmt_orphans);
187 INIT_LIST_HEAD(&c->orph_new);
188 if (c->tot_orphans == 0)
189 c->no_orphs = 1;
190 else
191 c->no_orphs = 0;
192 spin_unlock(&c->orphan_lock);
193 return 0;
194}
195
196
197
198
199
200
201
202
203static int avail_orphs(struct ubifs_info *c)
204{
205 int avail_lebs, avail, gap;
206
207 avail_lebs = c->orph_lebs - (c->ohead_lnum - c->orph_first) - 1;
208 avail = avail_lebs *
209 ((c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64));
210 gap = c->leb_size - c->ohead_offs;
211 if (gap >= UBIFS_ORPH_NODE_SZ + sizeof(__le64))
212 avail += (gap - UBIFS_ORPH_NODE_SZ) / sizeof(__le64);
213 return avail;
214}
215
216
217
218
219
220
221
222
223static int tot_avail_orphs(struct ubifs_info *c)
224{
225 int avail_lebs, avail;
226
227 avail_lebs = c->orph_lebs;
228 avail = avail_lebs *
229 ((c->leb_size - UBIFS_ORPH_NODE_SZ) / sizeof(__le64));
230 return avail / 2;
231}
232
233
234
235
236
237
238
239
240
241
242
243static int do_write_orph_node(struct ubifs_info *c, int len, int atomic)
244{
245 int err = 0;
246
247 if (atomic) {
248 ubifs_assert(c->ohead_offs == 0);
249 ubifs_prepare_node(c, c->orph_buf, len, 1);
250 len = ALIGN(len, c->min_io_size);
251 err = ubifs_leb_change(c, c->ohead_lnum, c->orph_buf, len,
252 UBI_SHORTTERM);
253 } else {
254 if (c->ohead_offs == 0) {
255
256 err = ubifs_leb_unmap(c, c->ohead_lnum);
257 if (err)
258 return err;
259 }
260 err = ubifs_write_node(c, c->orph_buf, len, c->ohead_lnum,
261 c->ohead_offs, UBI_SHORTTERM);
262 }
263 return err;
264}
265
266
267
268
269
270
271
272
273
274
275static int write_orph_node(struct ubifs_info *c, int atomic)
276{
277 struct ubifs_orphan *orphan, *cnext;
278 struct ubifs_orph_node *orph;
279 int gap, err, len, cnt, i;
280
281 ubifs_assert(c->cmt_orphans > 0);
282 gap = c->leb_size - c->ohead_offs;
283 if (gap < UBIFS_ORPH_NODE_SZ + sizeof(__le64)) {
284 c->ohead_lnum += 1;
285 c->ohead_offs = 0;
286 gap = c->leb_size;
287 if (c->ohead_lnum > c->orph_last) {
288
289
290
291
292 ubifs_err("out of space in orphan area");
293 return -EINVAL;
294 }
295 }
296 cnt = (gap - UBIFS_ORPH_NODE_SZ) / sizeof(__le64);
297 if (cnt > c->cmt_orphans)
298 cnt = c->cmt_orphans;
299 len = UBIFS_ORPH_NODE_SZ + cnt * sizeof(__le64);
300 ubifs_assert(c->orph_buf);
301 orph = c->orph_buf;
302 orph->ch.node_type = UBIFS_ORPH_NODE;
303 spin_lock(&c->orphan_lock);
304 cnext = c->orph_cnext;
305 for (i = 0; i < cnt; i++) {
306 orphan = cnext;
307 orph->inos[i] = cpu_to_le64(orphan->inum);
308 cnext = orphan->cnext;
309 orphan->cnext = NULL;
310 }
311 c->orph_cnext = cnext;
312 c->cmt_orphans -= cnt;
313 spin_unlock(&c->orphan_lock);
314 if (c->cmt_orphans)
315 orph->cmt_no = cpu_to_le64(c->cmt_no);
316 else
317
318 orph->cmt_no = cpu_to_le64((c->cmt_no) | (1ULL << 63));
319 ubifs_assert(c->ohead_offs + len <= c->leb_size);
320 ubifs_assert(c->ohead_lnum >= c->orph_first);
321 ubifs_assert(c->ohead_lnum <= c->orph_last);
322 err = do_write_orph_node(c, len, atomic);
323 c->ohead_offs += ALIGN(len, c->min_io_size);
324 c->ohead_offs = ALIGN(c->ohead_offs, 8);
325 return err;
326}
327
328
329
330
331
332
333
334
335
336static int write_orph_nodes(struct ubifs_info *c, int atomic)
337{
338 int err;
339
340 while (c->cmt_orphans > 0) {
341 err = write_orph_node(c, atomic);
342 if (err)
343 return err;
344 }
345 if (atomic) {
346 int lnum;
347
348
349 lnum = c->ohead_lnum + 1;
350 for (lnum = c->ohead_lnum + 1; lnum <= c->orph_last; lnum++) {
351 err = ubifs_leb_unmap(c, lnum);
352 if (err)
353 return err;
354 }
355 }
356 return 0;
357}
358
359
360
361
362
363
364
365
366
367
368
369
370static int consolidate(struct ubifs_info *c)
371{
372 int tot_avail = tot_avail_orphs(c), err = 0;
373
374 spin_lock(&c->orphan_lock);
375 dbg_cmt("there is space for %d orphans and there are %d",
376 tot_avail, c->tot_orphans);
377 if (c->tot_orphans - c->new_orphans <= tot_avail) {
378 struct ubifs_orphan *orphan, **last;
379 int cnt = 0;
380
381
382 last = &c->orph_cnext;
383 list_for_each_entry(orphan, &c->orph_list, list) {
384 if (orphan->new)
385 continue;
386 *last = orphan;
387 last = &orphan->cnext;
388 cnt += 1;
389 }
390 *last = orphan->cnext;
391 ubifs_assert(cnt == c->tot_orphans - c->new_orphans);
392 c->cmt_orphans = cnt;
393 c->ohead_lnum = c->orph_first;
394 c->ohead_offs = 0;
395 } else {
396
397
398
399
400 ubifs_err("out of space in orphan area");
401 err = -EINVAL;
402 }
403 spin_unlock(&c->orphan_lock);
404 return err;
405}
406
407
408
409
410
411
412
413
414static int commit_orphans(struct ubifs_info *c)
415{
416 int avail, atomic = 0, err;
417
418 ubifs_assert(c->cmt_orphans > 0);
419 avail = avail_orphs(c);
420 if (avail < c->cmt_orphans) {
421
422 err = consolidate(c);
423 if (err)
424 return err;
425 atomic = 1;
426 }
427 err = write_orph_nodes(c, atomic);
428 return err;
429}
430
431
432
433
434
435
436
437
438
439
440static void erase_deleted(struct ubifs_info *c)
441{
442 struct ubifs_orphan *orphan, *dnext;
443
444 spin_lock(&c->orphan_lock);
445 dnext = c->orph_dnext;
446 while (dnext) {
447 orphan = dnext;
448 dnext = orphan->dnext;
449 ubifs_assert(!orphan->new);
450 rb_erase(&orphan->rb, &c->orph_tree);
451 list_del(&orphan->list);
452 c->tot_orphans -= 1;
453 dbg_gen("deleting orphan ino %lu", (unsigned long)orphan->inum);
454 kfree(orphan);
455 }
456 c->orph_dnext = NULL;
457 spin_unlock(&c->orphan_lock);
458}
459
460
461
462
463
464
465
466int ubifs_orphan_end_commit(struct ubifs_info *c)
467{
468 int err;
469
470 if (c->cmt_orphans != 0) {
471 err = commit_orphans(c);
472 if (err)
473 return err;
474 }
475 erase_deleted(c);
476 err = dbg_check_orphans(c);
477 return err;
478}
479
480
481
482
483
484
485
486
487
488int ubifs_clear_orphans(struct ubifs_info *c)
489{
490 int lnum, err;
491
492 for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
493 err = ubifs_leb_unmap(c, lnum);
494 if (err)
495 return err;
496 }
497 c->ohead_lnum = c->orph_first;
498 c->ohead_offs = 0;
499 return 0;
500}
501
502
503
504
505
506
507
508
509
510
511static int insert_dead_orphan(struct ubifs_info *c, ino_t inum)
512{
513 struct ubifs_orphan *orphan, *o;
514 struct rb_node **p, *parent = NULL;
515
516 orphan = kzalloc(sizeof(struct ubifs_orphan), GFP_KERNEL);
517 if (!orphan)
518 return -ENOMEM;
519 orphan->inum = inum;
520
521 p = &c->orph_tree.rb_node;
522 while (*p) {
523 parent = *p;
524 o = rb_entry(parent, struct ubifs_orphan, rb);
525 if (inum < o->inum)
526 p = &(*p)->rb_left;
527 else if (inum > o->inum)
528 p = &(*p)->rb_right;
529 else {
530
531 kfree(orphan);
532 return 0;
533 }
534 }
535 c->tot_orphans += 1;
536 rb_link_node(&orphan->rb, parent, p);
537 rb_insert_color(&orphan->rb, &c->orph_tree);
538 list_add_tail(&orphan->list, &c->orph_list);
539 orphan->dnext = c->orph_dnext;
540 c->orph_dnext = orphan;
541 dbg_mnt("ino %lu, new %d, tot %d", (unsigned long)inum,
542 c->new_orphans, c->tot_orphans);
543 return 0;
544}
545
546
547
548
549
550
551
552
553
554
555
556
557
558static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
559 unsigned long long *last_cmt_no, int *outofdate,
560 int *last_flagged)
561{
562 struct ubifs_scan_node *snod;
563 struct ubifs_orph_node *orph;
564 unsigned long long cmt_no;
565 ino_t inum;
566 int i, n, err, first = 1;
567
568 list_for_each_entry(snod, &sleb->nodes, list) {
569 if (snod->type != UBIFS_ORPH_NODE) {
570 ubifs_err("invalid node type %d in orphan area at "
571 "%d:%d", snod->type, sleb->lnum, snod->offs);
572 dbg_dump_node(c, snod->node);
573 return -EINVAL;
574 }
575
576 orph = snod->node;
577
578
579 cmt_no = le64_to_cpu(orph->cmt_no) & LLONG_MAX;
580
581
582
583
584
585
586
587
588 if (cmt_no > c->cmt_no)
589 c->cmt_no = cmt_no;
590 if (cmt_no < *last_cmt_no && *last_flagged) {
591
592
593
594
595
596 if (!first) {
597 ubifs_err("out of order commit number %llu in "
598 "orphan node at %d:%d",
599 cmt_no, sleb->lnum, snod->offs);
600 dbg_dump_node(c, snod->node);
601 return -EINVAL;
602 }
603 dbg_rcvry("out of date LEB %d", sleb->lnum);
604 *outofdate = 1;
605 return 0;
606 }
607
608 if (first)
609 first = 0;
610
611 n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
612 for (i = 0; i < n; i++) {
613 inum = le64_to_cpu(orph->inos[i]);
614 dbg_rcvry("deleting orphaned inode %lu",
615 (unsigned long)inum);
616 err = ubifs_tnc_remove_ino(c, inum);
617 if (err)
618 return err;
619 err = insert_dead_orphan(c, inum);
620 if (err)
621 return err;
622 }
623
624 *last_cmt_no = cmt_no;
625 if (le64_to_cpu(orph->cmt_no) & (1ULL << 63)) {
626 dbg_rcvry("last orph node for commit %llu at %d:%d",
627 cmt_no, sleb->lnum, snod->offs);
628 *last_flagged = 1;
629 } else
630 *last_flagged = 0;
631 }
632
633 return 0;
634}
635
636
637
638
639
640
641
642
643
644
645
646static int kill_orphans(struct ubifs_info *c)
647{
648 unsigned long long last_cmt_no = 0;
649 int lnum, err = 0, outofdate = 0, last_flagged = 0;
650
651 c->ohead_lnum = c->orph_first;
652 c->ohead_offs = 0;
653
654 if (c->no_orphs) {
655 dbg_rcvry("no orphans");
656 return 0;
657 }
658
659
660
661
662
663
664
665
666
667
668
669 for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
670 struct ubifs_scan_leb *sleb;
671
672 dbg_rcvry("LEB %d", lnum);
673 sleb = ubifs_scan(c, lnum, 0, c->sbuf, 1);
674 if (IS_ERR(sleb)) {
675 if (PTR_ERR(sleb) == -EUCLEAN)
676 sleb = ubifs_recover_leb(c, lnum, 0,
677 c->sbuf, -1);
678 if (IS_ERR(sleb)) {
679 err = PTR_ERR(sleb);
680 break;
681 }
682 }
683 err = do_kill_orphans(c, sleb, &last_cmt_no, &outofdate,
684 &last_flagged);
685 if (err || outofdate) {
686 ubifs_scan_destroy(sleb);
687 break;
688 }
689 if (sleb->endpt) {
690 c->ohead_lnum = lnum;
691 c->ohead_offs = sleb->endpt;
692 }
693 ubifs_scan_destroy(sleb);
694 }
695 return err;
696}
697
698
699
700
701
702
703
704
705
706
707
708int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only)
709{
710 int err = 0;
711
712 c->max_orphans = tot_avail_orphs(c);
713
714 if (!read_only) {
715 c->orph_buf = vmalloc(c->leb_size);
716 if (!c->orph_buf)
717 return -ENOMEM;
718 }
719
720 if (unclean)
721 err = kill_orphans(c);
722 else if (!read_only)
723 err = ubifs_clear_orphans(c);
724
725 return err;
726}
727
728#ifdef CONFIG_UBIFS_FS_DEBUG
729
730struct check_orphan {
731 struct rb_node rb;
732 ino_t inum;
733};
734
735struct check_info {
736 unsigned long last_ino;
737 unsigned long tot_inos;
738 unsigned long missing;
739 unsigned long long leaf_cnt;
740 struct ubifs_ino_node *node;
741 struct rb_root root;
742};
743
744static int dbg_find_orphan(struct ubifs_info *c, ino_t inum)
745{
746 struct ubifs_orphan *o;
747 struct rb_node *p;
748
749 spin_lock(&c->orphan_lock);
750 p = c->orph_tree.rb_node;
751 while (p) {
752 o = rb_entry(p, struct ubifs_orphan, rb);
753 if (inum < o->inum)
754 p = p->rb_left;
755 else if (inum > o->inum)
756 p = p->rb_right;
757 else {
758 spin_unlock(&c->orphan_lock);
759 return 1;
760 }
761 }
762 spin_unlock(&c->orphan_lock);
763 return 0;
764}
765
766static int dbg_ins_check_orphan(struct rb_root *root, ino_t inum)
767{
768 struct check_orphan *orphan, *o;
769 struct rb_node **p, *parent = NULL;
770
771 orphan = kzalloc(sizeof(struct check_orphan), GFP_NOFS);
772 if (!orphan)
773 return -ENOMEM;
774 orphan->inum = inum;
775
776 p = &root->rb_node;
777 while (*p) {
778 parent = *p;
779 o = rb_entry(parent, struct check_orphan, rb);
780 if (inum < o->inum)
781 p = &(*p)->rb_left;
782 else if (inum > o->inum)
783 p = &(*p)->rb_right;
784 else {
785 kfree(orphan);
786 return 0;
787 }
788 }
789 rb_link_node(&orphan->rb, parent, p);
790 rb_insert_color(&orphan->rb, root);
791 return 0;
792}
793
794static int dbg_find_check_orphan(struct rb_root *root, ino_t inum)
795{
796 struct check_orphan *o;
797 struct rb_node *p;
798
799 p = root->rb_node;
800 while (p) {
801 o = rb_entry(p, struct check_orphan, rb);
802 if (inum < o->inum)
803 p = p->rb_left;
804 else if (inum > o->inum)
805 p = p->rb_right;
806 else
807 return 1;
808 }
809 return 0;
810}
811
812static void dbg_free_check_tree(struct rb_root *root)
813{
814 struct rb_node *this = root->rb_node;
815 struct check_orphan *o;
816
817 while (this) {
818 if (this->rb_left) {
819 this = this->rb_left;
820 continue;
821 } else if (this->rb_right) {
822 this = this->rb_right;
823 continue;
824 }
825 o = rb_entry(this, struct check_orphan, rb);
826 this = rb_parent(this);
827 if (this) {
828 if (this->rb_left == &o->rb)
829 this->rb_left = NULL;
830 else
831 this->rb_right = NULL;
832 }
833 kfree(o);
834 }
835}
836
837static int dbg_orphan_check(struct ubifs_info *c, struct ubifs_zbranch *zbr,
838 void *priv)
839{
840 struct check_info *ci = priv;
841 ino_t inum;
842 int err;
843
844 inum = key_inum(c, &zbr->key);
845 if (inum != ci->last_ino) {
846
847 if (key_type(c, &zbr->key) != UBIFS_INO_KEY)
848 ubifs_err("found orphan node ino %lu, type %d",
849 (unsigned long)inum, key_type(c, &zbr->key));
850 ci->last_ino = inum;
851 ci->tot_inos += 1;
852 err = ubifs_tnc_read_node(c, zbr, ci->node);
853 if (err) {
854 ubifs_err("node read failed, error %d", err);
855 return err;
856 }
857 if (ci->node->nlink == 0)
858
859 if (!dbg_find_check_orphan(&ci->root, inum) &&
860 !dbg_find_orphan(c, inum)) {
861 ubifs_err("missing orphan, ino %lu",
862 (unsigned long)inum);
863 ci->missing += 1;
864 }
865 }
866 ci->leaf_cnt += 1;
867 return 0;
868}
869
870static int dbg_read_orphans(struct check_info *ci, struct ubifs_scan_leb *sleb)
871{
872 struct ubifs_scan_node *snod;
873 struct ubifs_orph_node *orph;
874 ino_t inum;
875 int i, n, err;
876
877 list_for_each_entry(snod, &sleb->nodes, list) {
878 cond_resched();
879 if (snod->type != UBIFS_ORPH_NODE)
880 continue;
881 orph = snod->node;
882 n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
883 for (i = 0; i < n; i++) {
884 inum = le64_to_cpu(orph->inos[i]);
885 err = dbg_ins_check_orphan(&ci->root, inum);
886 if (err)
887 return err;
888 }
889 }
890 return 0;
891}
892
893static int dbg_scan_orphans(struct ubifs_info *c, struct check_info *ci)
894{
895 int lnum, err = 0;
896 void *buf;
897
898
899 if (c->no_orphs)
900 return 0;
901
902 buf = __vmalloc(c->leb_size, GFP_NOFS, PAGE_KERNEL);
903 if (!buf) {
904 ubifs_err("cannot allocate memory to check orphans");
905 return 0;
906 }
907
908 for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
909 struct ubifs_scan_leb *sleb;
910
911 sleb = ubifs_scan(c, lnum, 0, buf, 0);
912 if (IS_ERR(sleb)) {
913 err = PTR_ERR(sleb);
914 break;
915 }
916
917 err = dbg_read_orphans(ci, sleb);
918 ubifs_scan_destroy(sleb);
919 if (err)
920 break;
921 }
922
923 vfree(buf);
924 return err;
925}
926
927static int dbg_check_orphans(struct ubifs_info *c)
928{
929 struct check_info ci;
930 int err;
931
932 if (!dbg_is_chk_orph(c))
933 return 0;
934
935 ci.last_ino = 0;
936 ci.tot_inos = 0;
937 ci.missing = 0;
938 ci.leaf_cnt = 0;
939 ci.root = RB_ROOT;
940 ci.node = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS);
941 if (!ci.node) {
942 ubifs_err("out of memory");
943 return -ENOMEM;
944 }
945
946 err = dbg_scan_orphans(c, &ci);
947 if (err)
948 goto out;
949
950 err = dbg_walk_index(c, &dbg_orphan_check, NULL, &ci);
951 if (err) {
952 ubifs_err("cannot scan TNC, error %d", err);
953 goto out;
954 }
955
956 if (ci.missing) {
957 ubifs_err("%lu missing orphan(s)", ci.missing);
958 err = -EINVAL;
959 goto out;
960 }
961
962 dbg_cmt("last inode number is %lu", ci.last_ino);
963 dbg_cmt("total number of inodes is %lu", ci.tot_inos);
964 dbg_cmt("total number of leaf nodes is %llu", ci.leaf_cnt);
965
966out:
967 dbg_free_check_tree(&ci.root);
968 kfree(ci.node);
969 return err;
970}
971
972#endif
973