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, c->sbuf, 0);
677 if (IS_ERR(sleb)) {
678 err = PTR_ERR(sleb);
679 break;
680 }
681 }
682 err = do_kill_orphans(c, sleb, &last_cmt_no, &outofdate,
683 &last_flagged);
684 if (err || outofdate) {
685 ubifs_scan_destroy(sleb);
686 break;
687 }
688 if (sleb->endpt) {
689 c->ohead_lnum = lnum;
690 c->ohead_offs = sleb->endpt;
691 }
692 ubifs_scan_destroy(sleb);
693 }
694 return err;
695}
696
697
698
699
700
701
702
703
704
705
706
707int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only)
708{
709 int err = 0;
710
711 c->max_orphans = tot_avail_orphs(c);
712
713 if (!read_only) {
714 c->orph_buf = vmalloc(c->leb_size);
715 if (!c->orph_buf)
716 return -ENOMEM;
717 }
718
719 if (unclean)
720 err = kill_orphans(c);
721 else if (!read_only)
722 err = ubifs_clear_orphans(c);
723
724 return err;
725}
726
727#ifdef CONFIG_UBIFS_FS_DEBUG
728
729struct check_orphan {
730 struct rb_node rb;
731 ino_t inum;
732};
733
734struct check_info {
735 unsigned long last_ino;
736 unsigned long tot_inos;
737 unsigned long missing;
738 unsigned long long leaf_cnt;
739 struct ubifs_ino_node *node;
740 struct rb_root root;
741};
742
743static int dbg_find_orphan(struct ubifs_info *c, ino_t inum)
744{
745 struct ubifs_orphan *o;
746 struct rb_node *p;
747
748 spin_lock(&c->orphan_lock);
749 p = c->orph_tree.rb_node;
750 while (p) {
751 o = rb_entry(p, struct ubifs_orphan, rb);
752 if (inum < o->inum)
753 p = p->rb_left;
754 else if (inum > o->inum)
755 p = p->rb_right;
756 else {
757 spin_unlock(&c->orphan_lock);
758 return 1;
759 }
760 }
761 spin_unlock(&c->orphan_lock);
762 return 0;
763}
764
765static int dbg_ins_check_orphan(struct rb_root *root, ino_t inum)
766{
767 struct check_orphan *orphan, *o;
768 struct rb_node **p, *parent = NULL;
769
770 orphan = kzalloc(sizeof(struct check_orphan), GFP_NOFS);
771 if (!orphan)
772 return -ENOMEM;
773 orphan->inum = inum;
774
775 p = &root->rb_node;
776 while (*p) {
777 parent = *p;
778 o = rb_entry(parent, struct check_orphan, rb);
779 if (inum < o->inum)
780 p = &(*p)->rb_left;
781 else if (inum > o->inum)
782 p = &(*p)->rb_right;
783 else {
784 kfree(orphan);
785 return 0;
786 }
787 }
788 rb_link_node(&orphan->rb, parent, p);
789 rb_insert_color(&orphan->rb, root);
790 return 0;
791}
792
793static int dbg_find_check_orphan(struct rb_root *root, ino_t inum)
794{
795 struct check_orphan *o;
796 struct rb_node *p;
797
798 p = root->rb_node;
799 while (p) {
800 o = rb_entry(p, struct check_orphan, rb);
801 if (inum < o->inum)
802 p = p->rb_left;
803 else if (inum > o->inum)
804 p = p->rb_right;
805 else
806 return 1;
807 }
808 return 0;
809}
810
811static void dbg_free_check_tree(struct rb_root *root)
812{
813 struct rb_node *this = root->rb_node;
814 struct check_orphan *o;
815
816 while (this) {
817 if (this->rb_left) {
818 this = this->rb_left;
819 continue;
820 } else if (this->rb_right) {
821 this = this->rb_right;
822 continue;
823 }
824 o = rb_entry(this, struct check_orphan, rb);
825 this = rb_parent(this);
826 if (this) {
827 if (this->rb_left == &o->rb)
828 this->rb_left = NULL;
829 else
830 this->rb_right = NULL;
831 }
832 kfree(o);
833 }
834}
835
836static int dbg_orphan_check(struct ubifs_info *c, struct ubifs_zbranch *zbr,
837 void *priv)
838{
839 struct check_info *ci = priv;
840 ino_t inum;
841 int err;
842
843 inum = key_inum(c, &zbr->key);
844 if (inum != ci->last_ino) {
845
846 if (key_type(c, &zbr->key) != UBIFS_INO_KEY)
847 ubifs_err("found orphan node ino %lu, type %d",
848 (unsigned long)inum, key_type(c, &zbr->key));
849 ci->last_ino = inum;
850 ci->tot_inos += 1;
851 err = ubifs_tnc_read_node(c, zbr, ci->node);
852 if (err) {
853 ubifs_err("node read failed, error %d", err);
854 return err;
855 }
856 if (ci->node->nlink == 0)
857
858 if (!dbg_find_check_orphan(&ci->root, inum) &&
859 !dbg_find_orphan(c, inum)) {
860 ubifs_err("missing orphan, ino %lu",
861 (unsigned long)inum);
862 ci->missing += 1;
863 }
864 }
865 ci->leaf_cnt += 1;
866 return 0;
867}
868
869static int dbg_read_orphans(struct check_info *ci, struct ubifs_scan_leb *sleb)
870{
871 struct ubifs_scan_node *snod;
872 struct ubifs_orph_node *orph;
873 ino_t inum;
874 int i, n, err;
875
876 list_for_each_entry(snod, &sleb->nodes, list) {
877 cond_resched();
878 if (snod->type != UBIFS_ORPH_NODE)
879 continue;
880 orph = snod->node;
881 n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
882 for (i = 0; i < n; i++) {
883 inum = le64_to_cpu(orph->inos[i]);
884 err = dbg_ins_check_orphan(&ci->root, inum);
885 if (err)
886 return err;
887 }
888 }
889 return 0;
890}
891
892static int dbg_scan_orphans(struct ubifs_info *c, struct check_info *ci)
893{
894 int lnum, err = 0;
895
896
897 if (c->no_orphs)
898 return 0;
899
900 for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
901 struct ubifs_scan_leb *sleb;
902
903 sleb = ubifs_scan(c, lnum, 0, c->dbg->buf, 0);
904 if (IS_ERR(sleb)) {
905 err = PTR_ERR(sleb);
906 break;
907 }
908
909 err = dbg_read_orphans(ci, sleb);
910 ubifs_scan_destroy(sleb);
911 if (err)
912 break;
913 }
914
915 return err;
916}
917
918static int dbg_check_orphans(struct ubifs_info *c)
919{
920 struct check_info ci;
921 int err;
922
923 if (!(ubifs_chk_flags & UBIFS_CHK_ORPH))
924 return 0;
925
926 ci.last_ino = 0;
927 ci.tot_inos = 0;
928 ci.missing = 0;
929 ci.leaf_cnt = 0;
930 ci.root = RB_ROOT;
931 ci.node = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS);
932 if (!ci.node) {
933 ubifs_err("out of memory");
934 return -ENOMEM;
935 }
936
937 err = dbg_scan_orphans(c, &ci);
938 if (err)
939 goto out;
940
941 err = dbg_walk_index(c, &dbg_orphan_check, NULL, &ci);
942 if (err) {
943 ubifs_err("cannot scan TNC, error %d", err);
944 goto out;
945 }
946
947 if (ci.missing) {
948 ubifs_err("%lu missing orphan(s)", ci.missing);
949 err = -EINVAL;
950 goto out;
951 }
952
953 dbg_cmt("last inode number is %lu", ci.last_ino);
954 dbg_cmt("total number of inodes is %lu", ci.tot_inos);
955 dbg_cmt("total number of leaf nodes is %llu", ci.leaf_cnt);
956
957out:
958 dbg_free_check_tree(&ci.root);
959 kfree(ci.node);
960 return err;
961}
962
963#endif
964