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#include <linux/crc32.h>
34#include <linux/slab.h>
35#include "ubifs.h"
36
37static int try_read_node(const struct ubifs_info *c, void *buf, int type,
38 int len, int lnum, int offs);
39static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
40 struct ubifs_zbranch *zbr, void *node);
41
42
43
44
45
46
47
48
49
50
51
52enum {
53 NAME_LESS = 0,
54 NAME_MATCHES = 1,
55 NAME_GREATER = 2,
56 NOT_ON_MEDIA = 3,
57};
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82static int insert_old_idx(struct ubifs_info *c, int lnum, int offs)
83{
84 struct ubifs_old_idx *old_idx, *o;
85 struct rb_node **p, *parent = NULL;
86
87 old_idx = kmalloc(sizeof(struct ubifs_old_idx), GFP_NOFS);
88 if (unlikely(!old_idx))
89 return -ENOMEM;
90 old_idx->lnum = lnum;
91 old_idx->offs = offs;
92
93 p = &c->old_idx.rb_node;
94 while (*p) {
95 parent = *p;
96 o = rb_entry(parent, struct ubifs_old_idx, rb);
97 if (lnum < o->lnum)
98 p = &(*p)->rb_left;
99 else if (lnum > o->lnum)
100 p = &(*p)->rb_right;
101 else if (offs < o->offs)
102 p = &(*p)->rb_left;
103 else if (offs > o->offs)
104 p = &(*p)->rb_right;
105 else {
106 ubifs_err(c, "old idx added twice!");
107 kfree(old_idx);
108 return 0;
109 }
110 }
111 rb_link_node(&old_idx->rb, parent, p);
112 rb_insert_color(&old_idx->rb, &c->old_idx);
113 return 0;
114}
115
116
117
118
119
120
121
122
123int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode)
124{
125 if (znode->parent) {
126 struct ubifs_zbranch *zbr;
127
128 zbr = &znode->parent->zbranch[znode->iip];
129 if (zbr->len)
130 return insert_old_idx(c, zbr->lnum, zbr->offs);
131 } else
132 if (c->zroot.len)
133 return insert_old_idx(c, c->zroot.lnum,
134 c->zroot.offs);
135 return 0;
136}
137
138
139
140
141
142
143
144
145static int ins_clr_old_idx_znode(struct ubifs_info *c,
146 struct ubifs_znode *znode)
147{
148 int err;
149
150 if (znode->parent) {
151 struct ubifs_zbranch *zbr;
152
153 zbr = &znode->parent->zbranch[znode->iip];
154 if (zbr->len) {
155 err = insert_old_idx(c, zbr->lnum, zbr->offs);
156 if (err)
157 return err;
158 zbr->lnum = 0;
159 zbr->offs = 0;
160 zbr->len = 0;
161 }
162 } else
163 if (c->zroot.len) {
164 err = insert_old_idx(c, c->zroot.lnum, c->zroot.offs);
165 if (err)
166 return err;
167 c->zroot.lnum = 0;
168 c->zroot.offs = 0;
169 c->zroot.len = 0;
170 }
171 return 0;
172}
173
174
175
176
177
178
179
180
181
182
183
184void destroy_old_idx(struct ubifs_info *c)
185{
186 struct ubifs_old_idx *old_idx, *n;
187
188 rbtree_postorder_for_each_entry_safe(old_idx, n, &c->old_idx, rb)
189 kfree(old_idx);
190
191 c->old_idx = RB_ROOT;
192}
193
194
195
196
197
198
199
200
201static struct ubifs_znode *copy_znode(struct ubifs_info *c,
202 struct ubifs_znode *znode)
203{
204 struct ubifs_znode *zn;
205
206 zn = kmemdup(znode, c->max_znode_sz, GFP_NOFS);
207 if (unlikely(!zn))
208 return ERR_PTR(-ENOMEM);
209
210 zn->cnext = NULL;
211 __set_bit(DIRTY_ZNODE, &zn->flags);
212 __clear_bit(COW_ZNODE, &zn->flags);
213
214 ubifs_assert(!ubifs_zn_obsolete(znode));
215 __set_bit(OBSOLETE_ZNODE, &znode->flags);
216
217 if (znode->level != 0) {
218 int i;
219 const int n = zn->child_cnt;
220
221
222 for (i = 0; i < n; i++) {
223 struct ubifs_zbranch *zbr = &zn->zbranch[i];
224
225 if (zbr->znode)
226 zbr->znode->parent = zn;
227 }
228 }
229
230 atomic_long_inc(&c->dirty_zn_cnt);
231 return zn;
232}
233
234
235
236
237
238
239
240
241
242static int add_idx_dirt(struct ubifs_info *c, int lnum, int dirt)
243{
244 c->calc_idx_sz -= ALIGN(dirt, 8);
245 return ubifs_add_dirt(c, lnum, dirt);
246}
247
248
249
250
251
252
253
254
255static struct ubifs_znode *dirty_cow_znode(struct ubifs_info *c,
256 struct ubifs_zbranch *zbr)
257{
258 struct ubifs_znode *znode = zbr->znode;
259 struct ubifs_znode *zn;
260 int err;
261
262 if (!ubifs_zn_cow(znode)) {
263
264 if (!test_and_set_bit(DIRTY_ZNODE, &znode->flags)) {
265 atomic_long_inc(&c->dirty_zn_cnt);
266 atomic_long_dec(&c->clean_zn_cnt);
267 atomic_long_dec(&ubifs_clean_zn_cnt);
268 err = add_idx_dirt(c, zbr->lnum, zbr->len);
269 if (unlikely(err))
270 return ERR_PTR(err);
271 }
272 return znode;
273 }
274
275 zn = copy_znode(c, znode);
276 if (IS_ERR(zn))
277 return zn;
278
279 if (zbr->len) {
280 err = insert_old_idx(c, zbr->lnum, zbr->offs);
281 if (unlikely(err))
282 return ERR_PTR(err);
283 err = add_idx_dirt(c, zbr->lnum, zbr->len);
284 } else
285 err = 0;
286
287 zbr->znode = zn;
288 zbr->lnum = 0;
289 zbr->offs = 0;
290 zbr->len = 0;
291
292 if (unlikely(err))
293 return ERR_PTR(err);
294 return zn;
295}
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317static int lnc_add(struct ubifs_info *c, struct ubifs_zbranch *zbr,
318 const void *node)
319{
320 int err;
321 void *lnc_node;
322 const struct ubifs_dent_node *dent = node;
323
324 ubifs_assert(!zbr->leaf);
325 ubifs_assert(zbr->len != 0);
326 ubifs_assert(is_hash_key(c, &zbr->key));
327
328 err = ubifs_validate_entry(c, dent);
329 if (err) {
330 dump_stack();
331 ubifs_dump_node(c, dent);
332 return err;
333 }
334
335 lnc_node = kmemdup(node, zbr->len, GFP_NOFS);
336 if (!lnc_node)
337
338 return 0;
339
340 zbr->leaf = lnc_node;
341 return 0;
342}
343
344
345
346
347
348
349
350
351
352
353static int lnc_add_directly(struct ubifs_info *c, struct ubifs_zbranch *zbr,
354 void *node)
355{
356 int err;
357
358 ubifs_assert(!zbr->leaf);
359 ubifs_assert(zbr->len != 0);
360
361 err = ubifs_validate_entry(c, node);
362 if (err) {
363 dump_stack();
364 ubifs_dump_node(c, node);
365 return err;
366 }
367
368 zbr->leaf = node;
369 return 0;
370}
371
372
373
374
375
376
377static void lnc_free(struct ubifs_zbranch *zbr)
378{
379 if (!zbr->leaf)
380 return;
381 kfree(zbr->leaf);
382 zbr->leaf = NULL;
383}
384
385
386
387
388
389
390
391
392
393
394
395
396static int tnc_read_hashed_node(struct ubifs_info *c, struct ubifs_zbranch *zbr,
397 void *node)
398{
399 int err;
400
401 ubifs_assert(is_hash_key(c, &zbr->key));
402
403 if (zbr->leaf) {
404
405 ubifs_assert(zbr->len != 0);
406 memcpy(node, zbr->leaf, zbr->len);
407 return 0;
408 }
409
410 if (c->replaying) {
411 err = fallible_read_node(c, &zbr->key, zbr, node);
412
413
414
415
416 if (err == 0)
417 err = -ENOENT;
418 else if (err == 1)
419 err = 0;
420 } else {
421 err = ubifs_tnc_read_node(c, zbr, node);
422 }
423 if (err)
424 return err;
425
426
427 err = lnc_add(c, zbr, node);
428 return err;
429}
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455static int try_read_node(const struct ubifs_info *c, void *buf, int type,
456 int len, int lnum, int offs)
457{
458 int err, node_len;
459 struct ubifs_ch *ch = buf;
460 uint32_t crc, node_crc;
461
462 dbg_io("LEB %d:%d, %s, length %d", lnum, offs, dbg_ntype(type), len);
463
464 err = ubifs_leb_read(c, lnum, buf, offs, len, 1);
465 if (err) {
466 ubifs_err(c, "cannot read node type %d from LEB %d:%d, error %d",
467 type, lnum, offs, err);
468 return err;
469 }
470
471 if (le32_to_cpu(ch->magic) != UBIFS_NODE_MAGIC)
472 return 0;
473
474 if (ch->node_type != type)
475 return 0;
476
477 node_len = le32_to_cpu(ch->len);
478 if (node_len != len)
479 return 0;
480
481 if (type == UBIFS_DATA_NODE && c->no_chk_data_crc && !c->mounting &&
482 !c->remounting_rw)
483 return 1;
484
485 crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8);
486 node_crc = le32_to_cpu(ch->crc);
487 if (crc != node_crc)
488 return 0;
489
490 return 1;
491}
492
493
494
495
496
497
498
499
500
501
502
503static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
504 struct ubifs_zbranch *zbr, void *node)
505{
506 int ret;
507
508 dbg_tnck(key, "LEB %d:%d, key ", zbr->lnum, zbr->offs);
509
510 ret = try_read_node(c, node, key_type(c, key), zbr->len, zbr->lnum,
511 zbr->offs);
512 if (ret == 1) {
513 union ubifs_key node_key;
514 struct ubifs_dent_node *dent = node;
515
516
517 key_read(c, &dent->key, &node_key);
518 if (keys_cmp(c, key, &node_key) != 0)
519 ret = 0;
520 }
521 if (ret == 0 && c->replaying)
522 dbg_mntk(key, "dangling branch LEB %d:%d len %d, key ",
523 zbr->lnum, zbr->offs, zbr->len);
524 return ret;
525}
526
527
528
529
530
531
532
533
534
535
536
537
538static int matches_name(struct ubifs_info *c, struct ubifs_zbranch *zbr,
539 const struct fscrypt_name *nm)
540{
541 struct ubifs_dent_node *dent;
542 int nlen, err;
543
544
545 if (!zbr->leaf) {
546 dent = kmalloc(zbr->len, GFP_NOFS);
547 if (!dent)
548 return -ENOMEM;
549
550 err = ubifs_tnc_read_node(c, zbr, dent);
551 if (err)
552 goto out_free;
553
554
555 err = lnc_add_directly(c, zbr, dent);
556 if (err)
557 goto out_free;
558 } else
559 dent = zbr->leaf;
560
561 nlen = le16_to_cpu(dent->nlen);
562 err = memcmp(dent->name, fname_name(nm), min_t(int, nlen, fname_len(nm)));
563 if (err == 0) {
564 if (nlen == fname_len(nm))
565 return NAME_MATCHES;
566 else if (nlen < fname_len(nm))
567 return NAME_LESS;
568 else
569 return NAME_GREATER;
570 } else if (err < 0)
571 return NAME_LESS;
572 else
573 return NAME_GREATER;
574
575out_free:
576 kfree(dent);
577 return err;
578}
579
580
581
582
583
584
585
586
587
588static struct ubifs_znode *get_znode(struct ubifs_info *c,
589 struct ubifs_znode *znode, int n)
590{
591 struct ubifs_zbranch *zbr;
592
593 zbr = &znode->zbranch[n];
594 if (zbr->znode)
595 znode = zbr->znode;
596 else
597 znode = ubifs_load_znode(c, zbr, znode, n);
598 return znode;
599}
600
601
602
603
604
605
606
607
608
609
610static int tnc_next(struct ubifs_info *c, struct ubifs_znode **zn, int *n)
611{
612 struct ubifs_znode *znode = *zn;
613 int nn = *n;
614
615 nn += 1;
616 if (nn < znode->child_cnt) {
617 *n = nn;
618 return 0;
619 }
620 while (1) {
621 struct ubifs_znode *zp;
622
623 zp = znode->parent;
624 if (!zp)
625 return -ENOENT;
626 nn = znode->iip + 1;
627 znode = zp;
628 if (nn < znode->child_cnt) {
629 znode = get_znode(c, znode, nn);
630 if (IS_ERR(znode))
631 return PTR_ERR(znode);
632 while (znode->level != 0) {
633 znode = get_znode(c, znode, 0);
634 if (IS_ERR(znode))
635 return PTR_ERR(znode);
636 }
637 nn = 0;
638 break;
639 }
640 }
641 *zn = znode;
642 *n = nn;
643 return 0;
644}
645
646
647
648
649
650
651
652
653
654
655static int tnc_prev(struct ubifs_info *c, struct ubifs_znode **zn, int *n)
656{
657 struct ubifs_znode *znode = *zn;
658 int nn = *n;
659
660 if (nn > 0) {
661 *n = nn - 1;
662 return 0;
663 }
664 while (1) {
665 struct ubifs_znode *zp;
666
667 zp = znode->parent;
668 if (!zp)
669 return -ENOENT;
670 nn = znode->iip - 1;
671 znode = zp;
672 if (nn >= 0) {
673 znode = get_znode(c, znode, nn);
674 if (IS_ERR(znode))
675 return PTR_ERR(znode);
676 while (znode->level != 0) {
677 nn = znode->child_cnt - 1;
678 znode = get_znode(c, znode, nn);
679 if (IS_ERR(znode))
680 return PTR_ERR(znode);
681 }
682 nn = znode->child_cnt - 1;
683 break;
684 }
685 }
686 *zn = znode;
687 *n = nn;
688 return 0;
689}
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707static int resolve_collision(struct ubifs_info *c, const union ubifs_key *key,
708 struct ubifs_znode **zn, int *n,
709 const struct fscrypt_name *nm)
710{
711 int err;
712
713 err = matches_name(c, &(*zn)->zbranch[*n], nm);
714 if (unlikely(err < 0))
715 return err;
716 if (err == NAME_MATCHES)
717 return 1;
718
719 if (err == NAME_GREATER) {
720
721 while (1) {
722 err = tnc_prev(c, zn, n);
723 if (err == -ENOENT) {
724 ubifs_assert(*n == 0);
725 *n = -1;
726 return 0;
727 }
728 if (err < 0)
729 return err;
730 if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) {
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 if (*n == (*zn)->child_cnt - 1) {
761 err = tnc_next(c, zn, n);
762 if (err) {
763
764 ubifs_assert(0);
765 if (err == -ENOENT)
766 err = -EINVAL;
767 return err;
768 }
769 ubifs_assert(*n == 0);
770 *n = -1;
771 }
772 return 0;
773 }
774 err = matches_name(c, &(*zn)->zbranch[*n], nm);
775 if (err < 0)
776 return err;
777 if (err == NAME_LESS)
778 return 0;
779 if (err == NAME_MATCHES)
780 return 1;
781 ubifs_assert(err == NAME_GREATER);
782 }
783 } else {
784 int nn = *n;
785 struct ubifs_znode *znode = *zn;
786
787
788 while (1) {
789 err = tnc_next(c, &znode, &nn);
790 if (err == -ENOENT)
791 return 0;
792 if (err < 0)
793 return err;
794 if (keys_cmp(c, &znode->zbranch[nn].key, key))
795 return 0;
796 err = matches_name(c, &znode->zbranch[nn], nm);
797 if (err < 0)
798 return err;
799 if (err == NAME_GREATER)
800 return 0;
801 *zn = znode;
802 *n = nn;
803 if (err == NAME_MATCHES)
804 return 1;
805 ubifs_assert(err == NAME_LESS);
806 }
807 }
808}
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825static int fallible_matches_name(struct ubifs_info *c,
826 struct ubifs_zbranch *zbr,
827 const struct fscrypt_name *nm)
828{
829 struct ubifs_dent_node *dent;
830 int nlen, err;
831
832
833 if (!zbr->leaf) {
834 dent = kmalloc(zbr->len, GFP_NOFS);
835 if (!dent)
836 return -ENOMEM;
837
838 err = fallible_read_node(c, &zbr->key, zbr, dent);
839 if (err < 0)
840 goto out_free;
841 if (err == 0) {
842
843 err = NOT_ON_MEDIA;
844 goto out_free;
845 }
846 ubifs_assert(err == 1);
847
848 err = lnc_add_directly(c, zbr, dent);
849 if (err)
850 goto out_free;
851 } else
852 dent = zbr->leaf;
853
854 nlen = le16_to_cpu(dent->nlen);
855 err = memcmp(dent->name, fname_name(nm), min_t(int, nlen, fname_len(nm)));
856 if (err == 0) {
857 if (nlen == fname_len(nm))
858 return NAME_MATCHES;
859 else if (nlen < fname_len(nm))
860 return NAME_LESS;
861 else
862 return NAME_GREATER;
863 } else if (err < 0)
864 return NAME_LESS;
865 else
866 return NAME_GREATER;
867
868out_free:
869 kfree(dent);
870 return err;
871}
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895static int fallible_resolve_collision(struct ubifs_info *c,
896 const union ubifs_key *key,
897 struct ubifs_znode **zn, int *n,
898 const struct fscrypt_name *nm,
899 int adding)
900{
901 struct ubifs_znode *o_znode = NULL, *znode = *zn;
902 int uninitialized_var(o_n), err, cmp, unsure = 0, nn = *n;
903
904 cmp = fallible_matches_name(c, &znode->zbranch[nn], nm);
905 if (unlikely(cmp < 0))
906 return cmp;
907 if (cmp == NAME_MATCHES)
908 return 1;
909 if (cmp == NOT_ON_MEDIA) {
910 o_znode = znode;
911 o_n = nn;
912
913
914
915
916
917 unsure = 1;
918 } else if (!adding)
919 unsure = 1;
920
921 if (cmp == NAME_GREATER || unsure) {
922
923 while (1) {
924 err = tnc_prev(c, zn, n);
925 if (err == -ENOENT) {
926 ubifs_assert(*n == 0);
927 *n = -1;
928 break;
929 }
930 if (err < 0)
931 return err;
932 if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) {
933
934 if (*n == (*zn)->child_cnt - 1) {
935 err = tnc_next(c, zn, n);
936 if (err) {
937
938 ubifs_assert(0);
939 if (err == -ENOENT)
940 err = -EINVAL;
941 return err;
942 }
943 ubifs_assert(*n == 0);
944 *n = -1;
945 }
946 break;
947 }
948 err = fallible_matches_name(c, &(*zn)->zbranch[*n], nm);
949 if (err < 0)
950 return err;
951 if (err == NAME_MATCHES)
952 return 1;
953 if (err == NOT_ON_MEDIA) {
954 o_znode = *zn;
955 o_n = *n;
956 continue;
957 }
958 if (!adding)
959 continue;
960 if (err == NAME_LESS)
961 break;
962 else
963 unsure = 0;
964 }
965 }
966
967 if (cmp == NAME_LESS || unsure) {
968
969 *zn = znode;
970 *n = nn;
971 while (1) {
972 err = tnc_next(c, &znode, &nn);
973 if (err == -ENOENT)
974 break;
975 if (err < 0)
976 return err;
977 if (keys_cmp(c, &znode->zbranch[nn].key, key))
978 break;
979 err = fallible_matches_name(c, &znode->zbranch[nn], nm);
980 if (err < 0)
981 return err;
982 if (err == NAME_GREATER)
983 break;
984 *zn = znode;
985 *n = nn;
986 if (err == NAME_MATCHES)
987 return 1;
988 if (err == NOT_ON_MEDIA) {
989 o_znode = znode;
990 o_n = nn;
991 }
992 }
993 }
994
995
996 if (adding || !o_znode)
997 return 0;
998
999 dbg_mntk(key, "dangling match LEB %d:%d len %d key ",
1000 o_znode->zbranch[o_n].lnum, o_znode->zbranch[o_n].offs,
1001 o_znode->zbranch[o_n].len);
1002 *zn = o_znode;
1003 *n = o_n;
1004 return 1;
1005}
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015static int matches_position(struct ubifs_zbranch *zbr, int lnum, int offs)
1016{
1017 if (zbr->lnum == lnum && zbr->offs == offs)
1018 return 1;
1019 else
1020 return 0;
1021}
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040static int resolve_collision_directly(struct ubifs_info *c,
1041 const union ubifs_key *key,
1042 struct ubifs_znode **zn, int *n,
1043 int lnum, int offs)
1044{
1045 struct ubifs_znode *znode;
1046 int nn, err;
1047
1048 znode = *zn;
1049 nn = *n;
1050 if (matches_position(&znode->zbranch[nn], lnum, offs))
1051 return 1;
1052
1053
1054 while (1) {
1055 err = tnc_prev(c, &znode, &nn);
1056 if (err == -ENOENT)
1057 break;
1058 if (err < 0)
1059 return err;
1060 if (keys_cmp(c, &znode->zbranch[nn].key, key))
1061 break;
1062 if (matches_position(&znode->zbranch[nn], lnum, offs)) {
1063 *zn = znode;
1064 *n = nn;
1065 return 1;
1066 }
1067 }
1068
1069
1070 znode = *zn;
1071 nn = *n;
1072 while (1) {
1073 err = tnc_next(c, &znode, &nn);
1074 if (err == -ENOENT)
1075 return 0;
1076 if (err < 0)
1077 return err;
1078 if (keys_cmp(c, &znode->zbranch[nn].key, key))
1079 return 0;
1080 *zn = znode;
1081 *n = nn;
1082 if (matches_position(&znode->zbranch[nn], lnum, offs))
1083 return 1;
1084 }
1085}
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097static struct ubifs_znode *dirty_cow_bottom_up(struct ubifs_info *c,
1098 struct ubifs_znode *znode)
1099{
1100 struct ubifs_znode *zp;
1101 int *path = c->bottom_up_buf, p = 0;
1102
1103 ubifs_assert(c->zroot.znode);
1104 ubifs_assert(znode);
1105 if (c->zroot.znode->level > BOTTOM_UP_HEIGHT) {
1106 kfree(c->bottom_up_buf);
1107 c->bottom_up_buf = kmalloc(c->zroot.znode->level * sizeof(int),
1108 GFP_NOFS);
1109 if (!c->bottom_up_buf)
1110 return ERR_PTR(-ENOMEM);
1111 path = c->bottom_up_buf;
1112 }
1113 if (c->zroot.znode->level) {
1114
1115 while (1) {
1116 int n;
1117
1118 zp = znode->parent;
1119 if (!zp)
1120 break;
1121 n = znode->iip;
1122 ubifs_assert(p < c->zroot.znode->level);
1123 path[p++] = n;
1124 if (!zp->cnext && ubifs_zn_dirty(znode))
1125 break;
1126 znode = zp;
1127 }
1128 }
1129
1130
1131 while (1) {
1132 struct ubifs_zbranch *zbr;
1133
1134 zp = znode->parent;
1135 if (zp) {
1136 ubifs_assert(path[p - 1] >= 0);
1137 ubifs_assert(path[p - 1] < zp->child_cnt);
1138 zbr = &zp->zbranch[path[--p]];
1139 znode = dirty_cow_znode(c, zbr);
1140 } else {
1141 ubifs_assert(znode == c->zroot.znode);
1142 znode = dirty_cow_znode(c, &c->zroot);
1143 }
1144 if (IS_ERR(znode) || !p)
1145 break;
1146 ubifs_assert(path[p - 1] >= 0);
1147 ubifs_assert(path[p - 1] < znode->child_cnt);
1148 znode = znode->zbranch[path[p - 1]].znode;
1149 }
1150
1151 return znode;
1152}
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key,
1177 struct ubifs_znode **zn, int *n)
1178{
1179 int err, exact;
1180 struct ubifs_znode *znode;
1181 unsigned long time = get_seconds();
1182
1183 dbg_tnck(key, "search key ");
1184 ubifs_assert(key_type(c, key) < UBIFS_INVALID_KEY);
1185
1186 znode = c->zroot.znode;
1187 if (unlikely(!znode)) {
1188 znode = ubifs_load_znode(c, &c->zroot, NULL, 0);
1189 if (IS_ERR(znode))
1190 return PTR_ERR(znode);
1191 }
1192
1193 znode->time = time;
1194
1195 while (1) {
1196 struct ubifs_zbranch *zbr;
1197
1198 exact = ubifs_search_zbranch(c, znode, key, n);
1199
1200 if (znode->level == 0)
1201 break;
1202
1203 if (*n < 0)
1204 *n = 0;
1205 zbr = &znode->zbranch[*n];
1206
1207 if (zbr->znode) {
1208 znode->time = time;
1209 znode = zbr->znode;
1210 continue;
1211 }
1212
1213
1214 znode = ubifs_load_znode(c, zbr, znode, *n);
1215 if (IS_ERR(znode))
1216 return PTR_ERR(znode);
1217 }
1218
1219 *zn = znode;
1220 if (exact || !is_hash_key(c, key) || *n != -1) {
1221 dbg_tnc("found %d, lvl %d, n %d", exact, znode->level, *n);
1222 return exact;
1223 }
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268 err = tnc_prev(c, &znode, n);
1269 if (err == -ENOENT) {
1270 dbg_tnc("found 0, lvl %d, n -1", znode->level);
1271 *n = -1;
1272 return 0;
1273 }
1274 if (unlikely(err < 0))
1275 return err;
1276 if (keys_cmp(c, key, &znode->zbranch[*n].key)) {
1277 dbg_tnc("found 0, lvl %d, n -1", znode->level);
1278 *n = -1;
1279 return 0;
1280 }
1281
1282 dbg_tnc("found 1, lvl %d, n %d", znode->level, *n);
1283 *zn = znode;
1284 return 1;
1285}
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312static int lookup_level0_dirty(struct ubifs_info *c, const union ubifs_key *key,
1313 struct ubifs_znode **zn, int *n)
1314{
1315 int err, exact;
1316 struct ubifs_znode *znode;
1317 unsigned long time = get_seconds();
1318
1319 dbg_tnck(key, "search and dirty key ");
1320
1321 znode = c->zroot.znode;
1322 if (unlikely(!znode)) {
1323 znode = ubifs_load_znode(c, &c->zroot, NULL, 0);
1324 if (IS_ERR(znode))
1325 return PTR_ERR(znode);
1326 }
1327
1328 znode = dirty_cow_znode(c, &c->zroot);
1329 if (IS_ERR(znode))
1330 return PTR_ERR(znode);
1331
1332 znode->time = time;
1333
1334 while (1) {
1335 struct ubifs_zbranch *zbr;
1336
1337 exact = ubifs_search_zbranch(c, znode, key, n);
1338
1339 if (znode->level == 0)
1340 break;
1341
1342 if (*n < 0)
1343 *n = 0;
1344 zbr = &znode->zbranch[*n];
1345
1346 if (zbr->znode) {
1347 znode->time = time;
1348 znode = dirty_cow_znode(c, zbr);
1349 if (IS_ERR(znode))
1350 return PTR_ERR(znode);
1351 continue;
1352 }
1353
1354
1355 znode = ubifs_load_znode(c, zbr, znode, *n);
1356 if (IS_ERR(znode))
1357 return PTR_ERR(znode);
1358 znode = dirty_cow_znode(c, zbr);
1359 if (IS_ERR(znode))
1360 return PTR_ERR(znode);
1361 }
1362
1363 *zn = znode;
1364 if (exact || !is_hash_key(c, key) || *n != -1) {
1365 dbg_tnc("found %d, lvl %d, n %d", exact, znode->level, *n);
1366 return exact;
1367 }
1368
1369
1370
1371
1372
1373 err = tnc_prev(c, &znode, n);
1374 if (err == -ENOENT) {
1375 *n = -1;
1376 dbg_tnc("found 0, lvl %d, n -1", znode->level);
1377 return 0;
1378 }
1379 if (unlikely(err < 0))
1380 return err;
1381 if (keys_cmp(c, key, &znode->zbranch[*n].key)) {
1382 *n = -1;
1383 dbg_tnc("found 0, lvl %d, n -1", znode->level);
1384 return 0;
1385 }
1386
1387 if (znode->cnext || !ubifs_zn_dirty(znode)) {
1388 znode = dirty_cow_bottom_up(c, znode);
1389 if (IS_ERR(znode))
1390 return PTR_ERR(znode);
1391 }
1392
1393 dbg_tnc("found 1, lvl %d, n %d", znode->level, *n);
1394 *zn = znode;
1395 return 1;
1396}
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408static int maybe_leb_gced(struct ubifs_info *c, int lnum, int gc_seq1)
1409{
1410 int gc_seq2, gced_lnum;
1411
1412 gced_lnum = c->gced_lnum;
1413 smp_rmb();
1414 gc_seq2 = c->gc_seq;
1415
1416 if (gc_seq1 == gc_seq2)
1417 return 0;
1418
1419 if (gc_seq1 + 1 != gc_seq2)
1420 return 1;
1421
1422
1423
1424
1425 smp_rmb();
1426 if (gced_lnum != c->gced_lnum)
1427 return 1;
1428
1429 if (gced_lnum == lnum)
1430 return 1;
1431 return 0;
1432}
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
1448 void *node, int *lnum, int *offs)
1449{
1450 int found, n, err, safely = 0, gc_seq1;
1451 struct ubifs_znode *znode;
1452 struct ubifs_zbranch zbr, *zt;
1453
1454again:
1455 mutex_lock(&c->tnc_mutex);
1456 found = ubifs_lookup_level0(c, key, &znode, &n);
1457 if (!found) {
1458 err = -ENOENT;
1459 goto out;
1460 } else if (found < 0) {
1461 err = found;
1462 goto out;
1463 }
1464 zt = &znode->zbranch[n];
1465 if (lnum) {
1466 *lnum = zt->lnum;
1467 *offs = zt->offs;
1468 }
1469 if (is_hash_key(c, key)) {
1470
1471
1472
1473
1474 err = tnc_read_hashed_node(c, zt, node);
1475 goto out;
1476 }
1477 if (safely) {
1478 err = ubifs_tnc_read_node(c, zt, node);
1479 goto out;
1480 }
1481
1482 zbr = znode->zbranch[n];
1483 gc_seq1 = c->gc_seq;
1484 mutex_unlock(&c->tnc_mutex);
1485
1486 if (ubifs_get_wbuf(c, zbr.lnum)) {
1487
1488 err = ubifs_tnc_read_node(c, &zbr, node);
1489 return err;
1490 }
1491
1492 err = fallible_read_node(c, key, &zbr, node);
1493 if (err <= 0 || maybe_leb_gced(c, zbr.lnum, gc_seq1)) {
1494
1495
1496
1497
1498 safely = 1;
1499 goto again;
1500 }
1501 return 0;
1502
1503out:
1504 mutex_unlock(&c->tnc_mutex);
1505 return err;
1506}
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu)
1522{
1523 int n, err = 0, lnum = -1, uninitialized_var(offs);
1524 int uninitialized_var(len);
1525 unsigned int block = key_block(c, &bu->key);
1526 struct ubifs_znode *znode;
1527
1528 bu->cnt = 0;
1529 bu->blk_cnt = 0;
1530 bu->eof = 0;
1531
1532 mutex_lock(&c->tnc_mutex);
1533
1534 err = ubifs_lookup_level0(c, &bu->key, &znode, &n);
1535 if (err < 0)
1536 goto out;
1537 if (err) {
1538
1539 len = znode->zbranch[n].len;
1540
1541 if (len > bu->buf_len) {
1542 err = -EINVAL;
1543 goto out;
1544 }
1545
1546 bu->zbranch[bu->cnt++] = znode->zbranch[n];
1547 bu->blk_cnt += 1;
1548 lnum = znode->zbranch[n].lnum;
1549 offs = ALIGN(znode->zbranch[n].offs + len, 8);
1550 }
1551 while (1) {
1552 struct ubifs_zbranch *zbr;
1553 union ubifs_key *key;
1554 unsigned int next_block;
1555
1556
1557 err = tnc_next(c, &znode, &n);
1558 if (err)
1559 goto out;
1560 zbr = &znode->zbranch[n];
1561 key = &zbr->key;
1562
1563 if (key_inum(c, key) != key_inum(c, &bu->key) ||
1564 key_type(c, key) != UBIFS_DATA_KEY) {
1565 err = -ENOENT;
1566 goto out;
1567 }
1568 if (lnum < 0) {
1569
1570 lnum = zbr->lnum;
1571 offs = ALIGN(zbr->offs + zbr->len, 8);
1572 len = zbr->len;
1573 if (len > bu->buf_len) {
1574 err = -EINVAL;
1575 goto out;
1576 }
1577 } else {
1578
1579
1580
1581
1582 if (zbr->lnum != lnum || zbr->offs != offs)
1583 goto out;
1584 offs += ALIGN(zbr->len, 8);
1585 len = ALIGN(len, 8) + zbr->len;
1586
1587 if (len > bu->buf_len)
1588 goto out;
1589 }
1590
1591 next_block = key_block(c, key);
1592 bu->blk_cnt += (next_block - block - 1);
1593 if (bu->blk_cnt >= UBIFS_MAX_BULK_READ)
1594 goto out;
1595 block = next_block;
1596
1597 bu->zbranch[bu->cnt++] = *zbr;
1598 bu->blk_cnt += 1;
1599
1600 if (bu->cnt >= UBIFS_MAX_BULK_READ)
1601 goto out;
1602 if (bu->blk_cnt >= UBIFS_MAX_BULK_READ)
1603 goto out;
1604 }
1605out:
1606 if (err == -ENOENT) {
1607 bu->eof = 1;
1608 err = 0;
1609 }
1610 bu->gc_seq = c->gc_seq;
1611 mutex_unlock(&c->tnc_mutex);
1612 if (err)
1613 return err;
1614
1615
1616
1617
1618 if (bu->blk_cnt > UBIFS_MAX_BULK_READ)
1619 bu->blk_cnt = UBIFS_MAX_BULK_READ;
1620
1621
1622
1623
1624 if (UBIFS_BLOCKS_PER_PAGE == 1 ||
1625 !(bu->blk_cnt & (UBIFS_BLOCKS_PER_PAGE - 1)))
1626 return 0;
1627 if (bu->eof) {
1628
1629 bu->blk_cnt += UBIFS_BLOCKS_PER_PAGE - 1;
1630 return 0;
1631 }
1632
1633 block = key_block(c, &bu->key) + bu->blk_cnt;
1634 block &= ~(UBIFS_BLOCKS_PER_PAGE - 1);
1635 while (bu->cnt) {
1636 if (key_block(c, &bu->zbranch[bu->cnt - 1].key) < block)
1637 break;
1638 bu->cnt -= 1;
1639 }
1640 return 0;
1641}
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653static int read_wbuf(struct ubifs_wbuf *wbuf, void *buf, int len, int lnum,
1654 int offs)
1655{
1656 const struct ubifs_info *c = wbuf->c;
1657 int rlen, overlap;
1658
1659 dbg_io("LEB %d:%d, length %d", lnum, offs, len);
1660 ubifs_assert(wbuf && lnum >= 0 && lnum < c->leb_cnt && offs >= 0);
1661 ubifs_assert(!(offs & 7) && offs < c->leb_size);
1662 ubifs_assert(offs + len <= c->leb_size);
1663
1664 spin_lock(&wbuf->lock);
1665 overlap = (lnum == wbuf->lnum && offs + len > wbuf->offs);
1666 if (!overlap) {
1667
1668 spin_unlock(&wbuf->lock);
1669 return ubifs_leb_read(c, lnum, buf, offs, len, 0);
1670 }
1671
1672
1673 rlen = wbuf->offs - offs;
1674 if (rlen < 0)
1675 rlen = 0;
1676
1677
1678 memcpy(buf + rlen, wbuf->buf + offs + rlen - wbuf->offs, len - rlen);
1679 spin_unlock(&wbuf->lock);
1680
1681 if (rlen > 0)
1682
1683 return ubifs_leb_read(c, lnum, buf, offs, rlen, 0);
1684
1685 return 0;
1686}
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696static int validate_data_node(struct ubifs_info *c, void *buf,
1697 struct ubifs_zbranch *zbr)
1698{
1699 union ubifs_key key1;
1700 struct ubifs_ch *ch = buf;
1701 int err, len;
1702
1703 if (ch->node_type != UBIFS_DATA_NODE) {
1704 ubifs_err(c, "bad node type (%d but expected %d)",
1705 ch->node_type, UBIFS_DATA_NODE);
1706 goto out_err;
1707 }
1708
1709 err = ubifs_check_node(c, buf, zbr->lnum, zbr->offs, 0, 0);
1710 if (err) {
1711 ubifs_err(c, "expected node type %d", UBIFS_DATA_NODE);
1712 goto out;
1713 }
1714
1715 len = le32_to_cpu(ch->len);
1716 if (len != zbr->len) {
1717 ubifs_err(c, "bad node length %d, expected %d", len, zbr->len);
1718 goto out_err;
1719 }
1720
1721
1722 key_read(c, buf + UBIFS_KEY_OFFSET, &key1);
1723 if (!keys_eq(c, &zbr->key, &key1)) {
1724 ubifs_err(c, "bad key in node at LEB %d:%d",
1725 zbr->lnum, zbr->offs);
1726 dbg_tnck(&zbr->key, "looked for key ");
1727 dbg_tnck(&key1, "found node's key ");
1728 goto out_err;
1729 }
1730
1731 return 0;
1732
1733out_err:
1734 err = -EINVAL;
1735out:
1736 ubifs_err(c, "bad node at LEB %d:%d", zbr->lnum, zbr->offs);
1737 ubifs_dump_node(c, buf);
1738 dump_stack();
1739 return err;
1740}
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu)
1753{
1754 int lnum = bu->zbranch[0].lnum, offs = bu->zbranch[0].offs, len, err, i;
1755 struct ubifs_wbuf *wbuf;
1756 void *buf;
1757
1758 len = bu->zbranch[bu->cnt - 1].offs;
1759 len += bu->zbranch[bu->cnt - 1].len - offs;
1760 if (len > bu->buf_len) {
1761 ubifs_err(c, "buffer too small %d vs %d", bu->buf_len, len);
1762 return -EINVAL;
1763 }
1764
1765
1766 wbuf = ubifs_get_wbuf(c, lnum);
1767 if (wbuf)
1768 err = read_wbuf(wbuf, bu->buf, len, lnum, offs);
1769 else
1770 err = ubifs_leb_read(c, lnum, bu->buf, offs, len, 0);
1771
1772
1773 if (maybe_leb_gced(c, lnum, bu->gc_seq))
1774 return -EAGAIN;
1775
1776 if (err && err != -EBADMSG) {
1777 ubifs_err(c, "failed to read from LEB %d:%d, error %d",
1778 lnum, offs, err);
1779 dump_stack();
1780 dbg_tnck(&bu->key, "key ");
1781 return err;
1782 }
1783
1784
1785 buf = bu->buf;
1786 for (i = 0; i < bu->cnt; i++) {
1787 err = validate_data_node(c, buf, &bu->zbranch[i]);
1788 if (err)
1789 return err;
1790 buf = buf + ALIGN(bu->zbranch[i].len, 8);
1791 }
1792
1793 return 0;
1794}
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
1810 void *node, const struct fscrypt_name *nm)
1811{
1812 int found, n, err;
1813 struct ubifs_znode *znode;
1814
1815 dbg_tnck(key, "key ");
1816 mutex_lock(&c->tnc_mutex);
1817 found = ubifs_lookup_level0(c, key, &znode, &n);
1818 if (!found) {
1819 err = -ENOENT;
1820 goto out_unlock;
1821 } else if (found < 0) {
1822 err = found;
1823 goto out_unlock;
1824 }
1825
1826 ubifs_assert(n >= 0);
1827
1828 err = resolve_collision(c, key, &znode, &n, nm);
1829 dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n);
1830 if (unlikely(err < 0))
1831 goto out_unlock;
1832 if (err == 0) {
1833 err = -ENOENT;
1834 goto out_unlock;
1835 }
1836
1837 err = tnc_read_hashed_node(c, &znode->zbranch[n], node);
1838
1839out_unlock:
1840 mutex_unlock(&c->tnc_mutex);
1841 return err;
1842}
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,
1858 void *node, const struct fscrypt_name *nm)
1859{
1860 int err, len;
1861 const struct ubifs_dent_node *dent = node;
1862
1863
1864
1865
1866
1867 err = ubifs_tnc_lookup(c, key, node);
1868 if (err)
1869 return err;
1870
1871 len = le16_to_cpu(dent->nlen);
1872 if (fname_len(nm) == len && !memcmp(dent->name, fname_name(nm), len))
1873 return 0;
1874
1875
1876
1877
1878
1879
1880 return do_lookup_nm(c, key, node, nm);
1881}
1882
1883static int search_dh_cookie(struct ubifs_info *c, const union ubifs_key *key,
1884 struct ubifs_dent_node *dent, uint32_t cookie,
1885 struct ubifs_znode **zn, int *n)
1886{
1887 int err;
1888 struct ubifs_znode *znode = *zn;
1889 struct ubifs_zbranch *zbr;
1890 union ubifs_key *dkey;
1891
1892 for (;;) {
1893 zbr = &znode->zbranch[*n];
1894 dkey = &zbr->key;
1895
1896 if (key_inum(c, dkey) != key_inum(c, key) ||
1897 key_type(c, dkey) != key_type(c, key)) {
1898 return -ENOENT;
1899 }
1900
1901 err = tnc_read_hashed_node(c, zbr, dent);
1902 if (err)
1903 return err;
1904
1905 if (key_hash(c, key) == key_hash(c, dkey) &&
1906 le32_to_cpu(dent->cookie) == cookie) {
1907 *zn = znode;
1908 return 0;
1909 }
1910
1911 err = tnc_next(c, &znode, n);
1912 if (err)
1913 return err;
1914 }
1915}
1916
1917static int do_lookup_dh(struct ubifs_info *c, const union ubifs_key *key,
1918 struct ubifs_dent_node *dent, uint32_t cookie)
1919{
1920 int n, err;
1921 struct ubifs_znode *znode;
1922 union ubifs_key start_key;
1923
1924 ubifs_assert(is_hash_key(c, key));
1925
1926 lowest_dent_key(c, &start_key, key_inum(c, key));
1927
1928 mutex_lock(&c->tnc_mutex);
1929 err = ubifs_lookup_level0(c, &start_key, &znode, &n);
1930 if (unlikely(err < 0))
1931 goto out_unlock;
1932
1933 err = search_dh_cookie(c, key, dent, cookie, &znode, &n);
1934
1935out_unlock:
1936 mutex_unlock(&c->tnc_mutex);
1937 return err;
1938}
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954int ubifs_tnc_lookup_dh(struct ubifs_info *c, const union ubifs_key *key,
1955 void *node, uint32_t cookie)
1956{
1957 int err;
1958 const struct ubifs_dent_node *dent = node;
1959
1960 if (!c->double_hash)
1961 return -EOPNOTSUPP;
1962
1963
1964
1965
1966
1967 err = ubifs_tnc_lookup(c, key, node);
1968 if (err)
1969 return err;
1970
1971 if (le32_to_cpu(dent->cookie) == cookie)
1972 return 0;
1973
1974
1975
1976
1977
1978 return do_lookup_dh(c, key, node, cookie);
1979}
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990static void correct_parent_keys(const struct ubifs_info *c,
1991 struct ubifs_znode *znode)
1992{
1993 union ubifs_key *key, *key1;
1994
1995 ubifs_assert(znode->parent);
1996 ubifs_assert(znode->iip == 0);
1997
1998 key = &znode->zbranch[0].key;
1999 key1 = &znode->parent->zbranch[0].key;
2000
2001 while (keys_cmp(c, key, key1) < 0) {
2002 key_copy(c, key, key1);
2003 znode = znode->parent;
2004 znode->alt = 1;
2005 if (!znode->parent || znode->iip)
2006 break;
2007 key1 = &znode->parent->zbranch[0].key;
2008 }
2009}
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022static void insert_zbranch(struct ubifs_znode *znode,
2023 const struct ubifs_zbranch *zbr, int n)
2024{
2025 int i;
2026
2027 ubifs_assert(ubifs_zn_dirty(znode));
2028
2029 if (znode->level) {
2030 for (i = znode->child_cnt; i > n; i--) {
2031 znode->zbranch[i] = znode->zbranch[i - 1];
2032 if (znode->zbranch[i].znode)
2033 znode->zbranch[i].znode->iip = i;
2034 }
2035 if (zbr->znode)
2036 zbr->znode->iip = n;
2037 } else
2038 for (i = znode->child_cnt; i > n; i--)
2039 znode->zbranch[i] = znode->zbranch[i - 1];
2040
2041 znode->zbranch[n] = *zbr;
2042 znode->child_cnt += 1;
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058 if (n == 0)
2059 znode->alt = 1;
2060}
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074static int tnc_insert(struct ubifs_info *c, struct ubifs_znode *znode,
2075 struct ubifs_zbranch *zbr, int n)
2076{
2077 struct ubifs_znode *zn, *zi, *zp;
2078 int i, keep, move, appending = 0;
2079 union ubifs_key *key = &zbr->key, *key1;
2080
2081 ubifs_assert(n >= 0 && n <= c->fanout);
2082
2083
2084again:
2085 zp = znode->parent;
2086 if (znode->child_cnt < c->fanout) {
2087 ubifs_assert(n != c->fanout);
2088 dbg_tnck(key, "inserted at %d level %d, key ", n, znode->level);
2089
2090 insert_zbranch(znode, zbr, n);
2091
2092
2093 if (n == 0 && zp && znode->iip == 0)
2094 correct_parent_keys(c, znode);
2095
2096 return 0;
2097 }
2098
2099
2100
2101
2102
2103 dbg_tnck(key, "splitting level %d, key ", znode->level);
2104
2105 if (znode->alt)
2106
2107
2108
2109
2110 ins_clr_old_idx_znode(c, znode);
2111
2112 zn = kzalloc(c->max_znode_sz, GFP_NOFS);
2113 if (!zn)
2114 return -ENOMEM;
2115 zn->parent = zp;
2116 zn->level = znode->level;
2117
2118
2119 if (znode->level == 0 && key_type(c, key) == UBIFS_DATA_KEY) {
2120
2121 if (n == c->fanout) {
2122 key1 = &znode->zbranch[n - 1].key;
2123 if (key_inum(c, key1) == key_inum(c, key) &&
2124 key_type(c, key1) == UBIFS_DATA_KEY)
2125 appending = 1;
2126 } else
2127 goto check_split;
2128 } else if (appending && n != c->fanout) {
2129
2130 appending = 0;
2131check_split:
2132 if (n >= (c->fanout + 1) / 2) {
2133 key1 = &znode->zbranch[0].key;
2134 if (key_inum(c, key1) == key_inum(c, key) &&
2135 key_type(c, key1) == UBIFS_DATA_KEY) {
2136 key1 = &znode->zbranch[n].key;
2137 if (key_inum(c, key1) != key_inum(c, key) ||
2138 key_type(c, key1) != UBIFS_DATA_KEY) {
2139 keep = n;
2140 move = c->fanout - keep;
2141 zi = znode;
2142 goto do_split;
2143 }
2144 }
2145 }
2146 }
2147
2148 if (appending) {
2149 keep = c->fanout;
2150 move = 0;
2151 } else {
2152 keep = (c->fanout + 1) / 2;
2153 move = c->fanout - keep;
2154 }
2155
2156
2157
2158
2159
2160
2161 if (n < keep) {
2162
2163 zi = znode;
2164 move += 1;
2165 keep -= 1;
2166 } else {
2167
2168 zi = zn;
2169 n -= keep;
2170
2171 if (zn->level != 0)
2172 zbr->znode->parent = zn;
2173 }
2174
2175do_split:
2176
2177 __set_bit(DIRTY_ZNODE, &zn->flags);
2178 atomic_long_inc(&c->dirty_zn_cnt);
2179
2180 zn->child_cnt = move;
2181 znode->child_cnt = keep;
2182
2183 dbg_tnc("moving %d, keeping %d", move, keep);
2184
2185
2186 for (i = 0; i < move; i++) {
2187 zn->zbranch[i] = znode->zbranch[keep + i];
2188
2189 if (zn->level != 0)
2190 if (zn->zbranch[i].znode) {
2191 zn->zbranch[i].znode->parent = zn;
2192 zn->zbranch[i].znode->iip = i;
2193 }
2194 }
2195
2196
2197 dbg_tnck(key, "inserting at %d level %d, key ", n, zn->level);
2198
2199 insert_zbranch(zi, zbr, n);
2200
2201
2202 if (zp) {
2203 if (n == 0 && zi == znode && znode->iip == 0)
2204 correct_parent_keys(c, znode);
2205
2206
2207 n = znode->iip + 1;
2208
2209
2210 zbr->key = zn->zbranch[0].key;
2211 zbr->znode = zn;
2212 zbr->lnum = 0;
2213 zbr->offs = 0;
2214 zbr->len = 0;
2215 znode = zp;
2216
2217 goto again;
2218 }
2219
2220
2221 dbg_tnc("creating new zroot at level %d", znode->level + 1);
2222
2223 zi = kzalloc(c->max_znode_sz, GFP_NOFS);
2224 if (!zi)
2225 return -ENOMEM;
2226
2227 zi->child_cnt = 2;
2228 zi->level = znode->level + 1;
2229
2230 __set_bit(DIRTY_ZNODE, &zi->flags);
2231 atomic_long_inc(&c->dirty_zn_cnt);
2232
2233 zi->zbranch[0].key = znode->zbranch[0].key;
2234 zi->zbranch[0].znode = znode;
2235 zi->zbranch[0].lnum = c->zroot.lnum;
2236 zi->zbranch[0].offs = c->zroot.offs;
2237 zi->zbranch[0].len = c->zroot.len;
2238 zi->zbranch[1].key = zn->zbranch[0].key;
2239 zi->zbranch[1].znode = zn;
2240
2241 c->zroot.lnum = 0;
2242 c->zroot.offs = 0;
2243 c->zroot.len = 0;
2244 c->zroot.znode = zi;
2245
2246 zn->parent = zi;
2247 zn->iip = 1;
2248 znode->parent = zi;
2249 znode->iip = 0;
2250
2251 return 0;
2252}
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum,
2267 int offs, int len)
2268{
2269 int found, n, err = 0;
2270 struct ubifs_znode *znode;
2271
2272 mutex_lock(&c->tnc_mutex);
2273 dbg_tnck(key, "%d:%d, len %d, key ", lnum, offs, len);
2274 found = lookup_level0_dirty(c, key, &znode, &n);
2275 if (!found) {
2276 struct ubifs_zbranch zbr;
2277
2278 zbr.znode = NULL;
2279 zbr.lnum = lnum;
2280 zbr.offs = offs;
2281 zbr.len = len;
2282 key_copy(c, key, &zbr.key);
2283 err = tnc_insert(c, znode, &zbr, n + 1);
2284 } else if (found == 1) {
2285 struct ubifs_zbranch *zbr = &znode->zbranch[n];
2286
2287 lnc_free(zbr);
2288 err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
2289 zbr->lnum = lnum;
2290 zbr->offs = offs;
2291 zbr->len = len;
2292 } else
2293 err = found;
2294 if (!err)
2295 err = dbg_check_tnc(c, 0);
2296 mutex_unlock(&c->tnc_mutex);
2297
2298 return err;
2299}
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key,
2316 int old_lnum, int old_offs, int lnum, int offs, int len)
2317{
2318 int found, n, err = 0;
2319 struct ubifs_znode *znode;
2320
2321 mutex_lock(&c->tnc_mutex);
2322 dbg_tnck(key, "old LEB %d:%d, new LEB %d:%d, len %d, key ", old_lnum,
2323 old_offs, lnum, offs, len);
2324 found = lookup_level0_dirty(c, key, &znode, &n);
2325 if (found < 0) {
2326 err = found;
2327 goto out_unlock;
2328 }
2329
2330 if (found == 1) {
2331 struct ubifs_zbranch *zbr = &znode->zbranch[n];
2332
2333 found = 0;
2334 if (zbr->lnum == old_lnum && zbr->offs == old_offs) {
2335 lnc_free(zbr);
2336 err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
2337 if (err)
2338 goto out_unlock;
2339 zbr->lnum = lnum;
2340 zbr->offs = offs;
2341 zbr->len = len;
2342 found = 1;
2343 } else if (is_hash_key(c, key)) {
2344 found = resolve_collision_directly(c, key, &znode, &n,
2345 old_lnum, old_offs);
2346 dbg_tnc("rc returned %d, znode %p, n %d, LEB %d:%d",
2347 found, znode, n, old_lnum, old_offs);
2348 if (found < 0) {
2349 err = found;
2350 goto out_unlock;
2351 }
2352
2353 if (found) {
2354
2355 if (znode->cnext || !ubifs_zn_dirty(znode)) {
2356 znode = dirty_cow_bottom_up(c, znode);
2357 if (IS_ERR(znode)) {
2358 err = PTR_ERR(znode);
2359 goto out_unlock;
2360 }
2361 }
2362 zbr = &znode->zbranch[n];
2363 lnc_free(zbr);
2364 err = ubifs_add_dirt(c, zbr->lnum,
2365 zbr->len);
2366 if (err)
2367 goto out_unlock;
2368 zbr->lnum = lnum;
2369 zbr->offs = offs;
2370 zbr->len = len;
2371 }
2372 }
2373 }
2374
2375 if (!found)
2376 err = ubifs_add_dirt(c, lnum, len);
2377
2378 if (!err)
2379 err = dbg_check_tnc(c, 0);
2380
2381out_unlock:
2382 mutex_unlock(&c->tnc_mutex);
2383 return err;
2384}
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key,
2399 int lnum, int offs, int len,
2400 const struct fscrypt_name *nm)
2401{
2402 int found, n, err = 0;
2403 struct ubifs_znode *znode;
2404
2405 mutex_lock(&c->tnc_mutex);
2406 dbg_tnck(key, "LEB %d:%d, key ", lnum, offs);
2407 found = lookup_level0_dirty(c, key, &znode, &n);
2408 if (found < 0) {
2409 err = found;
2410 goto out_unlock;
2411 }
2412
2413 if (found == 1) {
2414 if (c->replaying)
2415 found = fallible_resolve_collision(c, key, &znode, &n,
2416 nm, 1);
2417 else
2418 found = resolve_collision(c, key, &znode, &n, nm);
2419 dbg_tnc("rc returned %d, znode %p, n %d", found, znode, n);
2420 if (found < 0) {
2421 err = found;
2422 goto out_unlock;
2423 }
2424
2425
2426 if (znode->cnext || !ubifs_zn_dirty(znode)) {
2427 znode = dirty_cow_bottom_up(c, znode);
2428 if (IS_ERR(znode)) {
2429 err = PTR_ERR(znode);
2430 goto out_unlock;
2431 }
2432 }
2433
2434 if (found == 1) {
2435 struct ubifs_zbranch *zbr = &znode->zbranch[n];
2436
2437 lnc_free(zbr);
2438 err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
2439 zbr->lnum = lnum;
2440 zbr->offs = offs;
2441 zbr->len = len;
2442 goto out_unlock;
2443 }
2444 }
2445
2446 if (!found) {
2447 struct ubifs_zbranch zbr;
2448
2449 zbr.znode = NULL;
2450 zbr.lnum = lnum;
2451 zbr.offs = offs;
2452 zbr.len = len;
2453 key_copy(c, key, &zbr.key);
2454 err = tnc_insert(c, znode, &zbr, n + 1);
2455 if (err)
2456 goto out_unlock;
2457 if (c->replaying) {
2458
2459
2460
2461
2462
2463
2464 struct fscrypt_name noname = { .disk_name = { .name = "", .len = 1 } };
2465
2466 err = dbg_check_tnc(c, 0);
2467 mutex_unlock(&c->tnc_mutex);
2468 if (err)
2469 return err;
2470 return ubifs_tnc_remove_nm(c, key, &noname);
2471 }
2472 }
2473
2474out_unlock:
2475 if (!err)
2476 err = dbg_check_tnc(c, 0);
2477 mutex_unlock(&c->tnc_mutex);
2478 return err;
2479}
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490static int tnc_delete(struct ubifs_info *c, struct ubifs_znode *znode, int n)
2491{
2492 struct ubifs_zbranch *zbr;
2493 struct ubifs_znode *zp;
2494 int i, err;
2495
2496
2497 ubifs_assert(znode->level == 0);
2498 ubifs_assert(n >= 0 && n < c->fanout);
2499 dbg_tnck(&znode->zbranch[n].key, "deleting key ");
2500
2501 zbr = &znode->zbranch[n];
2502 lnc_free(zbr);
2503
2504 err = ubifs_add_dirt(c, zbr->lnum, zbr->len);
2505 if (err) {
2506 ubifs_dump_znode(c, znode);
2507 return err;
2508 }
2509
2510
2511 for (i = n; i < znode->child_cnt - 1; i++)
2512 znode->zbranch[i] = znode->zbranch[i + 1];
2513 znode->child_cnt -= 1;
2514
2515 if (znode->child_cnt > 0)
2516 return 0;
2517
2518
2519
2520
2521
2522
2523 do {
2524 ubifs_assert(!ubifs_zn_obsolete(znode));
2525 ubifs_assert(ubifs_zn_dirty(znode));
2526
2527 zp = znode->parent;
2528 n = znode->iip;
2529
2530 atomic_long_dec(&c->dirty_zn_cnt);
2531
2532 err = insert_old_idx_znode(c, znode);
2533 if (err)
2534 return err;
2535
2536 if (znode->cnext) {
2537 __set_bit(OBSOLETE_ZNODE, &znode->flags);
2538 atomic_long_inc(&c->clean_zn_cnt);
2539 atomic_long_inc(&ubifs_clean_zn_cnt);
2540 } else
2541 kfree(znode);
2542 znode = zp;
2543 } while (znode->child_cnt == 1);
2544
2545
2546 znode->child_cnt -= 1;
2547 ubifs_assert(znode->level != 0);
2548 for (i = n; i < znode->child_cnt; i++) {
2549 znode->zbranch[i] = znode->zbranch[i + 1];
2550 if (znode->zbranch[i].znode)
2551 znode->zbranch[i].znode->iip = i;
2552 }
2553
2554
2555
2556
2557
2558 if (!znode->parent) {
2559 while (znode->child_cnt == 1 && znode->level != 0) {
2560 zp = znode;
2561 zbr = &znode->zbranch[0];
2562 znode = get_znode(c, znode, 0);
2563 if (IS_ERR(znode))
2564 return PTR_ERR(znode);
2565 znode = dirty_cow_znode(c, zbr);
2566 if (IS_ERR(znode))
2567 return PTR_ERR(znode);
2568 znode->parent = NULL;
2569 znode->iip = 0;
2570 if (c->zroot.len) {
2571 err = insert_old_idx(c, c->zroot.lnum,
2572 c->zroot.offs);
2573 if (err)
2574 return err;
2575 }
2576 c->zroot.lnum = zbr->lnum;
2577 c->zroot.offs = zbr->offs;
2578 c->zroot.len = zbr->len;
2579 c->zroot.znode = znode;
2580 ubifs_assert(!ubifs_zn_obsolete(zp));
2581 ubifs_assert(ubifs_zn_dirty(zp));
2582 atomic_long_dec(&c->dirty_zn_cnt);
2583
2584 if (zp->cnext) {
2585 __set_bit(OBSOLETE_ZNODE, &zp->flags);
2586 atomic_long_inc(&c->clean_zn_cnt);
2587 atomic_long_inc(&ubifs_clean_zn_cnt);
2588 } else
2589 kfree(zp);
2590 }
2591 }
2592
2593 return 0;
2594}
2595
2596
2597
2598
2599
2600
2601
2602
2603int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key)
2604{
2605 int found, n, err = 0;
2606 struct ubifs_znode *znode;
2607
2608 mutex_lock(&c->tnc_mutex);
2609 dbg_tnck(key, "key ");
2610 found = lookup_level0_dirty(c, key, &znode, &n);
2611 if (found < 0) {
2612 err = found;
2613 goto out_unlock;
2614 }
2615 if (found == 1)
2616 err = tnc_delete(c, znode, n);
2617 if (!err)
2618 err = dbg_check_tnc(c, 0);
2619
2620out_unlock:
2621 mutex_unlock(&c->tnc_mutex);
2622 return err;
2623}
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key,
2634 const struct fscrypt_name *nm)
2635{
2636 int n, err;
2637 struct ubifs_znode *znode;
2638
2639 mutex_lock(&c->tnc_mutex);
2640 dbg_tnck(key, "key ");
2641 err = lookup_level0_dirty(c, key, &znode, &n);
2642 if (err < 0)
2643 goto out_unlock;
2644
2645 if (err) {
2646 if (c->replaying)
2647 err = fallible_resolve_collision(c, key, &znode, &n,
2648 nm, 0);
2649 else
2650 err = resolve_collision(c, key, &znode, &n, nm);
2651 dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n);
2652 if (err < 0)
2653 goto out_unlock;
2654 if (err) {
2655
2656 if (znode->cnext || !ubifs_zn_dirty(znode)) {
2657 znode = dirty_cow_bottom_up(c, znode);
2658 if (IS_ERR(znode)) {
2659 err = PTR_ERR(znode);
2660 goto out_unlock;
2661 }
2662 }
2663 err = tnc_delete(c, znode, n);
2664 }
2665 }
2666
2667out_unlock:
2668 if (!err)
2669 err = dbg_check_tnc(c, 0);
2670 mutex_unlock(&c->tnc_mutex);
2671 return err;
2672}
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682int ubifs_tnc_remove_dh(struct ubifs_info *c, const union ubifs_key *key,
2683 uint32_t cookie)
2684{
2685 int n, err;
2686 struct ubifs_znode *znode;
2687 struct ubifs_dent_node *dent;
2688 struct ubifs_zbranch *zbr;
2689
2690 if (!c->double_hash)
2691 return -EOPNOTSUPP;
2692
2693 mutex_lock(&c->tnc_mutex);
2694 err = lookup_level0_dirty(c, key, &znode, &n);
2695 if (err <= 0)
2696 goto out_unlock;
2697
2698 zbr = &znode->zbranch[n];
2699 dent = kmalloc(UBIFS_MAX_DENT_NODE_SZ, GFP_NOFS);
2700 if (!dent) {
2701 err = -ENOMEM;
2702 goto out_unlock;
2703 }
2704
2705 err = tnc_read_hashed_node(c, zbr, dent);
2706 if (err)
2707 goto out_free;
2708
2709
2710 if (le32_to_cpu(dent->cookie) != cookie) {
2711 union ubifs_key start_key;
2712
2713 lowest_dent_key(c, &start_key, key_inum(c, key));
2714
2715 err = ubifs_lookup_level0(c, &start_key, &znode, &n);
2716 if (unlikely(err < 0))
2717 goto out_free;
2718
2719 err = search_dh_cookie(c, key, dent, cookie, &znode, &n);
2720 if (err)
2721 goto out_free;
2722 }
2723
2724 if (znode->cnext || !ubifs_zn_dirty(znode)) {
2725 znode = dirty_cow_bottom_up(c, znode);
2726 if (IS_ERR(znode)) {
2727 err = PTR_ERR(znode);
2728 goto out_free;
2729 }
2730 }
2731 err = tnc_delete(c, znode, n);
2732
2733out_free:
2734 kfree(dent);
2735out_unlock:
2736 if (!err)
2737 err = dbg_check_tnc(c, 0);
2738 mutex_unlock(&c->tnc_mutex);
2739 return err;
2740}
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751static int key_in_range(struct ubifs_info *c, union ubifs_key *key,
2752 union ubifs_key *from_key, union ubifs_key *to_key)
2753{
2754 if (keys_cmp(c, key, from_key) < 0)
2755 return 0;
2756 if (keys_cmp(c, key, to_key) > 0)
2757 return 0;
2758 return 1;
2759}
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key,
2772 union ubifs_key *to_key)
2773{
2774 int i, n, k, err = 0;
2775 struct ubifs_znode *znode;
2776 union ubifs_key *key;
2777
2778 mutex_lock(&c->tnc_mutex);
2779 while (1) {
2780
2781 err = ubifs_lookup_level0(c, from_key, &znode, &n);
2782 if (err < 0)
2783 goto out_unlock;
2784
2785 if (err)
2786 key = from_key;
2787 else {
2788 err = tnc_next(c, &znode, &n);
2789 if (err == -ENOENT) {
2790 err = 0;
2791 goto out_unlock;
2792 }
2793 if (err < 0)
2794 goto out_unlock;
2795 key = &znode->zbranch[n].key;
2796 if (!key_in_range(c, key, from_key, to_key)) {
2797 err = 0;
2798 goto out_unlock;
2799 }
2800 }
2801
2802
2803 if (znode->cnext || !ubifs_zn_dirty(znode)) {
2804 znode = dirty_cow_bottom_up(c, znode);
2805 if (IS_ERR(znode)) {
2806 err = PTR_ERR(znode);
2807 goto out_unlock;
2808 }
2809 }
2810
2811
2812 for (i = n + 1, k = 0; i < znode->child_cnt; i++, k++) {
2813 key = &znode->zbranch[i].key;
2814 if (!key_in_range(c, key, from_key, to_key))
2815 break;
2816 lnc_free(&znode->zbranch[i]);
2817 err = ubifs_add_dirt(c, znode->zbranch[i].lnum,
2818 znode->zbranch[i].len);
2819 if (err) {
2820 ubifs_dump_znode(c, znode);
2821 goto out_unlock;
2822 }
2823 dbg_tnck(key, "removing key ");
2824 }
2825 if (k) {
2826 for (i = n + 1 + k; i < znode->child_cnt; i++)
2827 znode->zbranch[i - k] = znode->zbranch[i];
2828 znode->child_cnt -= k;
2829 }
2830
2831
2832 err = tnc_delete(c, znode, n);
2833 if (err)
2834 goto out_unlock;
2835 }
2836
2837out_unlock:
2838 if (!err)
2839 err = dbg_check_tnc(c, 0);
2840 mutex_unlock(&c->tnc_mutex);
2841 return err;
2842}
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum)
2854{
2855 union ubifs_key key1, key2;
2856 struct ubifs_dent_node *xent, *pxent = NULL;
2857 struct fscrypt_name nm = {0};
2858
2859 dbg_tnc("ino %lu", (unsigned long)inum);
2860
2861
2862
2863
2864
2865 lowest_xent_key(c, &key1, inum);
2866 while (1) {
2867 ino_t xattr_inum;
2868 int err;
2869
2870 xent = ubifs_tnc_next_ent(c, &key1, &nm);
2871 if (IS_ERR(xent)) {
2872 err = PTR_ERR(xent);
2873 if (err == -ENOENT)
2874 break;
2875 return err;
2876 }
2877
2878 xattr_inum = le64_to_cpu(xent->inum);
2879 dbg_tnc("xent '%s', ino %lu", xent->name,
2880 (unsigned long)xattr_inum);
2881
2882 ubifs_evict_xattr_inode(c, xattr_inum);
2883
2884 fname_name(&nm) = xent->name;
2885 fname_len(&nm) = le16_to_cpu(xent->nlen);
2886 err = ubifs_tnc_remove_nm(c, &key1, &nm);
2887 if (err) {
2888 kfree(xent);
2889 return err;
2890 }
2891
2892 lowest_ino_key(c, &key1, xattr_inum);
2893 highest_ino_key(c, &key2, xattr_inum);
2894 err = ubifs_tnc_remove_range(c, &key1, &key2);
2895 if (err) {
2896 kfree(xent);
2897 return err;
2898 }
2899
2900 kfree(pxent);
2901 pxent = xent;
2902 key_read(c, &xent->key, &key1);
2903 }
2904
2905 kfree(pxent);
2906 lowest_ino_key(c, &key1, inum);
2907 highest_ino_key(c, &key2, inum);
2908
2909 return ubifs_tnc_remove_range(c, &key1, &key2);
2910}
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
2936 union ubifs_key *key,
2937 const struct fscrypt_name *nm)
2938{
2939 int n, err, type = key_type(c, key);
2940 struct ubifs_znode *znode;
2941 struct ubifs_dent_node *dent;
2942 struct ubifs_zbranch *zbr;
2943 union ubifs_key *dkey;
2944
2945 dbg_tnck(key, "key ");
2946 ubifs_assert(is_hash_key(c, key));
2947
2948 mutex_lock(&c->tnc_mutex);
2949 err = ubifs_lookup_level0(c, key, &znode, &n);
2950 if (unlikely(err < 0))
2951 goto out_unlock;
2952
2953 if (fname_len(nm) > 0) {
2954 if (err) {
2955
2956 if (c->replaying)
2957 err = fallible_resolve_collision(c, key, &znode, &n,
2958 nm, 0);
2959 else
2960 err = resolve_collision(c, key, &znode, &n, nm);
2961 dbg_tnc("rc returned %d, znode %p, n %d",
2962 err, znode, n);
2963 if (unlikely(err < 0))
2964 goto out_unlock;
2965 }
2966
2967
2968 err = tnc_next(c, &znode, &n);
2969 if (unlikely(err))
2970 goto out_unlock;
2971 } else {
2972
2973
2974
2975
2976
2977 if (!err) {
2978
2979
2980
2981
2982
2983 err = tnc_next(c, &znode, &n);
2984 if (err)
2985 goto out_unlock;
2986 }
2987 }
2988
2989 zbr = &znode->zbranch[n];
2990 dent = kmalloc(zbr->len, GFP_NOFS);
2991 if (unlikely(!dent)) {
2992 err = -ENOMEM;
2993 goto out_unlock;
2994 }
2995
2996
2997
2998
2999
3000 dkey = &zbr->key;
3001 if (key_inum(c, dkey) != key_inum(c, key) ||
3002 key_type(c, dkey) != type) {
3003 err = -ENOENT;
3004 goto out_free;
3005 }
3006
3007 err = tnc_read_hashed_node(c, zbr, dent);
3008 if (unlikely(err))
3009 goto out_free;
3010
3011 mutex_unlock(&c->tnc_mutex);
3012 return dent;
3013
3014out_free:
3015 kfree(dent);
3016out_unlock:
3017 mutex_unlock(&c->tnc_mutex);
3018 return ERR_PTR(err);
3019}
3020
3021
3022
3023
3024
3025
3026
3027static void tnc_destroy_cnext(struct ubifs_info *c)
3028{
3029 struct ubifs_znode *cnext;
3030
3031 if (!c->cnext)
3032 return;
3033 ubifs_assert(c->cmt_state == COMMIT_BROKEN);
3034 cnext = c->cnext;
3035 do {
3036 struct ubifs_znode *znode = cnext;
3037
3038 cnext = cnext->cnext;
3039 if (ubifs_zn_obsolete(znode))
3040 kfree(znode);
3041 } while (cnext && cnext != c->cnext);
3042}
3043
3044
3045
3046
3047
3048void ubifs_tnc_close(struct ubifs_info *c)
3049{
3050 tnc_destroy_cnext(c);
3051 if (c->zroot.znode) {
3052 long n, freed;
3053
3054 n = atomic_long_read(&c->clean_zn_cnt);
3055 freed = ubifs_destroy_tnc_subtree(c->zroot.znode);
3056 ubifs_assert(freed == n);
3057 atomic_long_sub(n, &ubifs_clean_zn_cnt);
3058 }
3059 kfree(c->gap_lebs);
3060 kfree(c->ilebs);
3061 destroy_old_idx(c);
3062}
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072static struct ubifs_znode *left_znode(struct ubifs_info *c,
3073 struct ubifs_znode *znode)
3074{
3075 int level = znode->level;
3076
3077 while (1) {
3078 int n = znode->iip - 1;
3079
3080
3081 znode = znode->parent;
3082 if (!znode)
3083 return NULL;
3084 if (n >= 0) {
3085
3086 znode = get_znode(c, znode, n);
3087 if (IS_ERR(znode))
3088 return znode;
3089 while (znode->level != level) {
3090 n = znode->child_cnt - 1;
3091 znode = get_znode(c, znode, n);
3092 if (IS_ERR(znode))
3093 return znode;
3094 }
3095 break;
3096 }
3097 }
3098 return znode;
3099}
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109static struct ubifs_znode *right_znode(struct ubifs_info *c,
3110 struct ubifs_znode *znode)
3111{
3112 int level = znode->level;
3113
3114 while (1) {
3115 int n = znode->iip + 1;
3116
3117
3118 znode = znode->parent;
3119 if (!znode)
3120 return NULL;
3121 if (n < znode->child_cnt) {
3122
3123 znode = get_znode(c, znode, n);
3124 if (IS_ERR(znode))
3125 return znode;
3126 while (znode->level != level) {
3127 znode = get_znode(c, znode, 0);
3128 if (IS_ERR(znode))
3129 return znode;
3130 }
3131 break;
3132 }
3133 }
3134 return znode;
3135}
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162static struct ubifs_znode *lookup_znode(struct ubifs_info *c,
3163 union ubifs_key *key, int level,
3164 int lnum, int offs)
3165{
3166 struct ubifs_znode *znode, *zn;
3167 int n, nn;
3168
3169 ubifs_assert(key_type(c, key) < UBIFS_INVALID_KEY);
3170
3171
3172
3173
3174
3175 if (level < 0)
3176 return ERR_PTR(-EINVAL);
3177
3178
3179 znode = c->zroot.znode;
3180 if (!znode) {
3181 znode = ubifs_load_znode(c, &c->zroot, NULL, 0);
3182 if (IS_ERR(znode))
3183 return znode;
3184 }
3185
3186 if (c->zroot.lnum == lnum && c->zroot.offs == offs)
3187 return znode;
3188
3189 if (level >= znode->level)
3190 return NULL;
3191 while (1) {
3192 ubifs_search_zbranch(c, znode, key, &n);
3193 if (n < 0) {
3194
3195
3196
3197
3198
3199
3200
3201
3202 znode = left_znode(c, znode);
3203 if (!znode)
3204 return NULL;
3205 if (IS_ERR(znode))
3206 return znode;
3207 ubifs_search_zbranch(c, znode, key, &n);
3208 ubifs_assert(n >= 0);
3209 }
3210 if (znode->level == level + 1)
3211 break;
3212 znode = get_znode(c, znode, n);
3213 if (IS_ERR(znode))
3214 return znode;
3215 }
3216
3217 if (znode->zbranch[n].lnum == lnum && znode->zbranch[n].offs == offs)
3218 return get_znode(c, znode, n);
3219
3220 if (!is_hash_key(c, key))
3221 return NULL;
3222
3223
3224
3225
3226 zn = znode;
3227 nn = n;
3228
3229 while (1) {
3230
3231 if (n)
3232 n -= 1;
3233 else {
3234 znode = left_znode(c, znode);
3235 if (!znode)
3236 break;
3237 if (IS_ERR(znode))
3238 return znode;
3239 n = znode->child_cnt - 1;
3240 }
3241
3242 if (znode->zbranch[n].lnum == lnum &&
3243 znode->zbranch[n].offs == offs)
3244 return get_znode(c, znode, n);
3245
3246 if (keys_cmp(c, &znode->zbranch[n].key, key) < 0)
3247 break;
3248 }
3249
3250 znode = zn;
3251 n = nn;
3252
3253 while (1) {
3254
3255 if (++n >= znode->child_cnt) {
3256 znode = right_znode(c, znode);
3257 if (!znode)
3258 break;
3259 if (IS_ERR(znode))
3260 return znode;
3261 n = 0;
3262 }
3263
3264 if (znode->zbranch[n].lnum == lnum &&
3265 znode->zbranch[n].offs == offs)
3266 return get_znode(c, znode, n);
3267
3268 if (keys_cmp(c, &znode->zbranch[n].key, key) > 0)
3269 break;
3270 }
3271 return NULL;
3272}
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level,
3292 int lnum, int offs)
3293{
3294 struct ubifs_znode *znode;
3295
3296 znode = lookup_znode(c, key, level, lnum, offs);
3297 if (!znode)
3298 return 0;
3299 if (IS_ERR(znode))
3300 return PTR_ERR(znode);
3301
3302 return ubifs_zn_dirty(znode) ? 1 : 2;
3303}
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318static int is_leaf_node_in_tnc(struct ubifs_info *c, union ubifs_key *key,
3319 int lnum, int offs)
3320{
3321 struct ubifs_zbranch *zbr;
3322 struct ubifs_znode *znode, *zn;
3323 int n, found, err, nn;
3324 const int unique = !is_hash_key(c, key);
3325
3326 found = ubifs_lookup_level0(c, key, &znode, &n);
3327 if (found < 0)
3328 return found;
3329 if (!found)
3330 return 0;
3331 zbr = &znode->zbranch[n];
3332 if (lnum == zbr->lnum && offs == zbr->offs)
3333 return 1;
3334 if (unique)
3335 return 0;
3336
3337
3338
3339
3340 zn = znode;
3341 nn = n;
3342
3343 while (1) {
3344 err = tnc_prev(c, &znode, &n);
3345 if (err == -ENOENT)
3346 break;
3347 if (err)
3348 return err;
3349 if (keys_cmp(c, key, &znode->zbranch[n].key))
3350 break;
3351 zbr = &znode->zbranch[n];
3352 if (lnum == zbr->lnum && offs == zbr->offs)
3353 return 1;
3354 }
3355
3356 znode = zn;
3357 n = nn;
3358 while (1) {
3359 err = tnc_next(c, &znode, &n);
3360 if (err) {
3361 if (err == -ENOENT)
3362 return 0;
3363 return err;
3364 }
3365 if (keys_cmp(c, key, &znode->zbranch[n].key))
3366 break;
3367 zbr = &znode->zbranch[n];
3368 if (lnum == zbr->lnum && offs == zbr->offs)
3369 return 1;
3370 }
3371 return 0;
3372}
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level,
3389 int lnum, int offs, int is_idx)
3390{
3391 int err;
3392
3393 mutex_lock(&c->tnc_mutex);
3394 if (is_idx) {
3395 err = is_idx_node_in_tnc(c, key, level, lnum, offs);
3396 if (err < 0)
3397 goto out_unlock;
3398 if (err == 1)
3399
3400 err = 0;
3401 else if (err == 2)
3402
3403 err = 1;
3404 else
3405 BUG_ON(err != 0);
3406 } else
3407 err = is_leaf_node_in_tnc(c, key, lnum, offs);
3408
3409out_unlock:
3410 mutex_unlock(&c->tnc_mutex);
3411 return err;
3412}
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level,
3429 int lnum, int offs)
3430{
3431 struct ubifs_znode *znode;
3432 int err = 0;
3433
3434 mutex_lock(&c->tnc_mutex);
3435 znode = lookup_znode(c, key, level, lnum, offs);
3436 if (!znode)
3437 goto out_unlock;
3438 if (IS_ERR(znode)) {
3439 err = PTR_ERR(znode);
3440 goto out_unlock;
3441 }
3442 znode = dirty_cow_bottom_up(c, znode);
3443 if (IS_ERR(znode)) {
3444 err = PTR_ERR(znode);
3445 goto out_unlock;
3446 }
3447
3448out_unlock:
3449 mutex_unlock(&c->tnc_mutex);
3450 return err;
3451}
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464int dbg_check_inode_size(struct ubifs_info *c, const struct inode *inode,
3465 loff_t size)
3466{
3467 int err, n;
3468 union ubifs_key from_key, to_key, *key;
3469 struct ubifs_znode *znode;
3470 unsigned int block;
3471
3472 if (!S_ISREG(inode->i_mode))
3473 return 0;
3474 if (!dbg_is_chk_gen(c))
3475 return 0;
3476
3477 block = (size + UBIFS_BLOCK_SIZE - 1) >> UBIFS_BLOCK_SHIFT;
3478 data_key_init(c, &from_key, inode->i_ino, block);
3479 highest_data_key(c, &to_key, inode->i_ino);
3480
3481 mutex_lock(&c->tnc_mutex);
3482 err = ubifs_lookup_level0(c, &from_key, &znode, &n);
3483 if (err < 0)
3484 goto out_unlock;
3485
3486 if (err) {
3487 key = &from_key;
3488 goto out_dump;
3489 }
3490
3491 err = tnc_next(c, &znode, &n);
3492 if (err == -ENOENT) {
3493 err = 0;
3494 goto out_unlock;
3495 }
3496 if (err < 0)
3497 goto out_unlock;
3498
3499 ubifs_assert(err == 0);
3500 key = &znode->zbranch[n].key;
3501 if (!key_in_range(c, key, &from_key, &to_key))
3502 goto out_unlock;
3503
3504out_dump:
3505 block = key_block(c, key);
3506 ubifs_err(c, "inode %lu has size %lld, but there are data at offset %lld",
3507 (unsigned long)inode->i_ino, size,
3508 ((loff_t)block) << UBIFS_BLOCK_SHIFT);
3509 mutex_unlock(&c->tnc_mutex);
3510 ubifs_dump_inode(c, inode);
3511 dump_stack();
3512 return -EINVAL;
3513
3514out_unlock:
3515 mutex_unlock(&c->tnc_mutex);
3516 return err;
3517}
3518