1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <linux/kernel.h>
25#include <linux/string.h>
26#include <linux/slab.h>
27#include <linux/mm.h>
28#include <linux/buffer_head.h>
29
30#include "befs.h"
31#include "btree.h"
32#include "datastream.h"
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81typedef struct {
82 befs_host_btree_nodehead head;
83 struct buffer_head *bh;
84 befs_btree_nodehead *od_node;
85} befs_btree_node;
86
87
88static const befs_off_t befs_bt_inval = 0xffffffffffffffffULL;
89
90
91static int befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds,
92 befs_btree_super * bt_super,
93 befs_btree_node * this_node,
94 befs_off_t * node_off);
95
96static int befs_bt_read_super(struct super_block *sb, befs_data_stream * ds,
97 befs_btree_super * sup);
98
99static int befs_bt_read_node(struct super_block *sb, befs_data_stream * ds,
100 befs_btree_node * node, befs_off_t node_off);
101
102static int befs_leafnode(befs_btree_node * node);
103
104static fs16 *befs_bt_keylen_index(befs_btree_node * node);
105
106static fs64 *befs_bt_valarray(befs_btree_node * node);
107
108static char *befs_bt_keydata(befs_btree_node * node);
109
110static int befs_find_key(struct super_block *sb, befs_btree_node * node,
111 const char *findkey, befs_off_t * value);
112
113static char *befs_bt_get_key(struct super_block *sb, befs_btree_node * node,
114 int index, u16 * keylen);
115
116static int befs_compare_strings(const void *key1, int keylen1,
117 const void *key2, int keylen2);
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133static int
134befs_bt_read_super(struct super_block *sb, befs_data_stream * ds,
135 befs_btree_super * sup)
136{
137 struct buffer_head *bh = NULL;
138 befs_disk_btree_super *od_sup = NULL;
139
140 befs_debug(sb, "---> befs_btree_read_super()");
141
142 bh = befs_read_datastream(sb, ds, 0, NULL);
143
144 if (!bh) {
145 befs_error(sb, "Couldn't read index header.");
146 goto error;
147 }
148 od_sup = (befs_disk_btree_super *) bh->b_data;
149 befs_dump_index_entry(sb, od_sup);
150
151 sup->magic = fs32_to_cpu(sb, od_sup->magic);
152 sup->node_size = fs32_to_cpu(sb, od_sup->node_size);
153 sup->max_depth = fs32_to_cpu(sb, od_sup->max_depth);
154 sup->data_type = fs32_to_cpu(sb, od_sup->data_type);
155 sup->root_node_ptr = fs64_to_cpu(sb, od_sup->root_node_ptr);
156 sup->free_node_ptr = fs64_to_cpu(sb, od_sup->free_node_ptr);
157 sup->max_size = fs64_to_cpu(sb, od_sup->max_size);
158
159 brelse(bh);
160 if (sup->magic != BEFS_BTREE_MAGIC) {
161 befs_error(sb, "Index header has bad magic.");
162 goto error;
163 }
164
165 befs_debug(sb, "<--- befs_btree_read_super()");
166 return BEFS_OK;
167
168 error:
169 befs_debug(sb, "<--- befs_btree_read_super() ERROR");
170 return BEFS_ERR;
171}
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192static int
193befs_bt_read_node(struct super_block *sb, befs_data_stream * ds,
194 befs_btree_node * node, befs_off_t node_off)
195{
196 uint off = 0;
197
198 befs_debug(sb, "---> befs_bt_read_node()");
199
200 if (node->bh)
201 brelse(node->bh);
202
203 node->bh = befs_read_datastream(sb, ds, node_off, &off);
204 if (!node->bh) {
205 befs_error(sb, "befs_bt_read_node() failed to read "
206 "node at %Lu", node_off);
207 befs_debug(sb, "<--- befs_bt_read_node() ERROR");
208
209 return BEFS_ERR;
210 }
211 node->od_node =
212 (befs_btree_nodehead *) ((void *) node->bh->b_data + off);
213
214 befs_dump_index_node(sb, node->od_node);
215
216 node->head.left = fs64_to_cpu(sb, node->od_node->left);
217 node->head.right = fs64_to_cpu(sb, node->od_node->right);
218 node->head.overflow = fs64_to_cpu(sb, node->od_node->overflow);
219 node->head.all_key_count =
220 fs16_to_cpu(sb, node->od_node->all_key_count);
221 node->head.all_key_length =
222 fs16_to_cpu(sb, node->od_node->all_key_length);
223
224 befs_debug(sb, "<--- befs_btree_read_node()");
225 return BEFS_OK;
226}
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246int
247befs_btree_find(struct super_block *sb, befs_data_stream * ds,
248 const char *key, befs_off_t * value)
249{
250 befs_btree_node *this_node = NULL;
251 befs_btree_super bt_super;
252 befs_off_t node_off;
253 int res;
254
255 befs_debug(sb, "---> befs_btree_find() Key: %s", key);
256
257 if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) {
258 befs_error(sb,
259 "befs_btree_find() failed to read index superblock");
260 goto error;
261 }
262
263 this_node = kmalloc(sizeof (befs_btree_node),
264 GFP_NOFS);
265 if (!this_node) {
266 befs_error(sb, "befs_btree_find() failed to allocate %u "
267 "bytes of memory", sizeof (befs_btree_node));
268 goto error;
269 }
270
271 this_node->bh = NULL;
272
273
274 node_off = bt_super.root_node_ptr;
275 if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) {
276 befs_error(sb, "befs_btree_find() failed to read "
277 "node at %Lu", node_off);
278 goto error_alloc;
279 }
280
281 while (!befs_leafnode(this_node)) {
282 res = befs_find_key(sb, this_node, key, &node_off);
283 if (res == BEFS_BT_NOT_FOUND)
284 node_off = this_node->head.overflow;
285
286 if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) {
287 befs_error(sb, "befs_btree_find() failed to read "
288 "node at %Lu", node_off);
289 goto error_alloc;
290 }
291 }
292
293
294
295 res = befs_find_key(sb, this_node, key, value);
296
297 brelse(this_node->bh);
298 kfree(this_node);
299
300 if (res != BEFS_BT_MATCH) {
301 befs_debug(sb, "<--- befs_btree_find() Key %s not found", key);
302 *value = 0;
303 return BEFS_BT_NOT_FOUND;
304 }
305 befs_debug(sb, "<--- befs_btree_find() Found key %s, value %Lu",
306 key, *value);
307 return BEFS_OK;
308
309 error_alloc:
310 kfree(this_node);
311 error:
312 *value = 0;
313 befs_debug(sb, "<--- befs_btree_find() ERROR");
314 return BEFS_ERR;
315}
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335static int
336befs_find_key(struct super_block *sb, befs_btree_node * node,
337 const char *findkey, befs_off_t * value)
338{
339 int first, last, mid;
340 int eq;
341 u16 keylen;
342 int findkey_len;
343 char *thiskey;
344 fs64 *valarray;
345
346 befs_debug(sb, "---> befs_find_key() %s", findkey);
347
348 *value = 0;
349
350 findkey_len = strlen(findkey);
351
352
353 last = node->head.all_key_count - 1;
354 thiskey = befs_bt_get_key(sb, node, last, &keylen);
355
356 eq = befs_compare_strings(thiskey, keylen, findkey, findkey_len);
357 if (eq < 0) {
358 befs_debug(sb, "<--- befs_find_key() %s not found", findkey);
359 return BEFS_BT_NOT_FOUND;
360 }
361
362 valarray = befs_bt_valarray(node);
363
364
365 first = 0;
366 mid = 0;
367 while (last >= first) {
368 mid = (last + first) / 2;
369 befs_debug(sb, "first: %d, last: %d, mid: %d", first, last,
370 mid);
371 thiskey = befs_bt_get_key(sb, node, mid, &keylen);
372 eq = befs_compare_strings(thiskey, keylen, findkey,
373 findkey_len);
374
375 if (eq == 0) {
376 befs_debug(sb, "<--- befs_find_key() found %s at %d",
377 thiskey, mid);
378
379 *value = fs64_to_cpu(sb, valarray[mid]);
380 return BEFS_BT_MATCH;
381 }
382 if (eq > 0)
383 last = mid - 1;
384 else
385 first = mid + 1;
386 }
387 if (eq < 0)
388 *value = fs64_to_cpu(sb, valarray[mid + 1]);
389 else
390 *value = fs64_to_cpu(sb, valarray[mid]);
391 befs_debug(sb, "<--- befs_find_key() found %s at %d", thiskey, mid);
392 return BEFS_BT_PARMATCH;
393}
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415int
416befs_btree_read(struct super_block *sb, befs_data_stream * ds,
417 loff_t key_no, size_t bufsize, char *keybuf, size_t * keysize,
418 befs_off_t * value)
419{
420 befs_btree_node *this_node;
421 befs_btree_super bt_super;
422 befs_off_t node_off = 0;
423 int cur_key;
424 fs64 *valarray;
425 char *keystart;
426 u16 keylen;
427 int res;
428
429 uint key_sum = 0;
430
431 befs_debug(sb, "---> befs_btree_read()");
432
433 if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) {
434 befs_error(sb,
435 "befs_btree_read() failed to read index superblock");
436 goto error;
437 }
438
439 if ((this_node = (befs_btree_node *)
440 kmalloc(sizeof (befs_btree_node), GFP_NOFS)) == NULL) {
441 befs_error(sb, "befs_btree_read() failed to allocate %u "
442 "bytes of memory", sizeof (befs_btree_node));
443 goto error;
444 }
445
446 node_off = bt_super.root_node_ptr;
447 this_node->bh = NULL;
448
449
450 res = befs_btree_seekleaf(sb, ds, &bt_super, this_node, &node_off);
451 if (res == BEFS_BT_EMPTY) {
452 brelse(this_node->bh);
453 kfree(this_node);
454 *value = 0;
455 *keysize = 0;
456 befs_debug(sb, "<--- befs_btree_read() Tree is EMPTY");
457 return BEFS_BT_EMPTY;
458 } else if (res == BEFS_ERR) {
459 goto error_alloc;
460 }
461
462
463
464 while (key_sum + this_node->head.all_key_count <= key_no) {
465
466
467 if (this_node->head.right == befs_bt_inval) {
468 *keysize = 0;
469 *value = 0;
470 befs_debug(sb,
471 "<--- befs_btree_read() END of keys at %Lu",
472 key_sum + this_node->head.all_key_count);
473 brelse(this_node->bh);
474 kfree(this_node);
475 return BEFS_BT_END;
476 }
477
478 key_sum += this_node->head.all_key_count;
479 node_off = this_node->head.right;
480
481 if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) {
482 befs_error(sb, "befs_btree_read() failed to read "
483 "node at %Lu", node_off);
484 goto error_alloc;
485 }
486 }
487
488
489 cur_key = key_no - key_sum;
490
491
492 valarray = befs_bt_valarray(this_node);
493
494 keystart = befs_bt_get_key(sb, this_node, cur_key, &keylen);
495
496 befs_debug(sb, "Read [%Lu,%d]: keysize %d", node_off, cur_key, keylen);
497
498 if (bufsize < keylen + 1) {
499 befs_error(sb, "befs_btree_read() keybuf too small (%u) "
500 "for key of size %d", bufsize, keylen);
501 brelse(this_node->bh);
502 goto error_alloc;
503 };
504
505 strncpy(keybuf, keystart, keylen);
506 *value = fs64_to_cpu(sb, valarray[cur_key]);
507 *keysize = keylen;
508 keybuf[keylen] = '\0';
509
510 befs_debug(sb, "Read [%Lu,%d]: Key \"%.*s\", Value %Lu", node_off,
511 cur_key, keylen, keybuf, *value);
512
513 brelse(this_node->bh);
514 kfree(this_node);
515
516 befs_debug(sb, "<--- befs_btree_read()");
517
518 return BEFS_OK;
519
520 error_alloc:
521 kfree(this_node);
522
523 error:
524 *keysize = 0;
525 *value = 0;
526 befs_debug(sb, "<--- befs_btree_read() ERROR");
527 return BEFS_ERR;
528}
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545static int
546befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds,
547 befs_btree_super * bt_super, befs_btree_node * this_node,
548 befs_off_t * node_off)
549{
550
551 befs_debug(sb, "---> befs_btree_seekleaf()");
552
553 if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) {
554 befs_error(sb, "befs_btree_seekleaf() failed to read "
555 "node at %Lu", *node_off);
556 goto error;
557 }
558 befs_debug(sb, "Seekleaf to root node %Lu", *node_off);
559
560 if (this_node->head.all_key_count == 0 && befs_leafnode(this_node)) {
561 befs_debug(sb, "<--- befs_btree_seekleaf() Tree is EMPTY");
562 return BEFS_BT_EMPTY;
563 }
564
565 while (!befs_leafnode(this_node)) {
566
567 if (this_node->head.all_key_count == 0) {
568 befs_debug(sb, "befs_btree_seekleaf() encountered "
569 "an empty interior node: %Lu. Using Overflow "
570 "node: %Lu", *node_off,
571 this_node->head.overflow);
572 *node_off = this_node->head.overflow;
573 } else {
574 fs64 *valarray = befs_bt_valarray(this_node);
575 *node_off = fs64_to_cpu(sb, valarray[0]);
576 }
577 if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) {
578 befs_error(sb, "befs_btree_seekleaf() failed to read "
579 "node at %Lu", *node_off);
580 goto error;
581 }
582
583 befs_debug(sb, "Seekleaf to child node %Lu", *node_off);
584 }
585 befs_debug(sb, "Node %Lu is a leaf node", *node_off);
586
587 return BEFS_OK;
588
589 error:
590 befs_debug(sb, "<--- befs_btree_seekleaf() ERROR");
591 return BEFS_ERR;
592}
593
594
595
596
597
598
599
600
601static int
602befs_leafnode(befs_btree_node * node)
603{
604
605 if (node->head.overflow == befs_bt_inval)
606 return 1;
607 else
608 return 0;
609}
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624static fs16 *
625befs_bt_keylen_index(befs_btree_node * node)
626{
627 const int keylen_align = 8;
628 unsigned long int off =
629 (sizeof (befs_btree_nodehead) + node->head.all_key_length);
630 ulong tmp = off % keylen_align;
631
632 if (tmp)
633 off += keylen_align - tmp;
634
635 return (fs16 *) ((void *) node->od_node + off);
636}
637
638
639
640
641
642
643
644
645static fs64 *
646befs_bt_valarray(befs_btree_node * node)
647{
648 void *keylen_index_start = (void *) befs_bt_keylen_index(node);
649 size_t keylen_index_size = node->head.all_key_count * sizeof (fs16);
650
651 return (fs64 *) (keylen_index_start + keylen_index_size);
652}
653
654
655
656
657
658
659
660
661static char *
662befs_bt_keydata(befs_btree_node * node)
663{
664 return (char *) ((void *) node->od_node + sizeof (befs_btree_nodehead));
665}
666
667
668
669
670
671
672
673
674
675
676
677static char *
678befs_bt_get_key(struct super_block *sb, befs_btree_node * node,
679 int index, u16 * keylen)
680{
681 int prev_key_end;
682 char *keystart;
683 fs16 *keylen_index;
684
685 if (index < 0 || index > node->head.all_key_count) {
686 *keylen = 0;
687 return NULL;
688 }
689
690 keystart = befs_bt_keydata(node);
691 keylen_index = befs_bt_keylen_index(node);
692
693 if (index == 0)
694 prev_key_end = 0;
695 else
696 prev_key_end = fs16_to_cpu(sb, keylen_index[index - 1]);
697
698 *keylen = fs16_to_cpu(sb, keylen_index[index]) - prev_key_end;
699
700 return keystart + prev_key_end;
701}
702
703
704
705
706
707
708
709
710
711
712
713
714static int
715befs_compare_strings(const void *key1, int keylen1,
716 const void *key2, int keylen2)
717{
718 int len = min_t(int, keylen1, keylen2);
719 int result = strncmp(key1, key2, len);
720 if (result == 0)
721 result = keylen1 - keylen2;
722 return result;
723}
724
725
726#if 0
727static int
728btree_compare_int32(cont void *key1, int keylen1, const void *key2, int keylen2)
729{
730 return *(int32_t *) key1 - *(int32_t *) key2;
731}
732
733static int
734btree_compare_uint32(cont void *key1, int keylen1,
735 const void *key2, int keylen2)
736{
737 if (*(u_int32_t *) key1 == *(u_int32_t *) key2)
738 return 0;
739 else if (*(u_int32_t *) key1 > *(u_int32_t *) key2)
740 return 1;
741
742 return -1;
743}
744static int
745btree_compare_int64(cont void *key1, int keylen1, const void *key2, int keylen2)
746{
747 if (*(int64_t *) key1 == *(int64_t *) key2)
748 return 0;
749 else if (*(int64_t *) key1 > *(int64_t *) key2)
750 return 1;
751
752 return -1;
753}
754
755static int
756btree_compare_uint64(cont void *key1, int keylen1,
757 const void *key2, int keylen2)
758{
759 if (*(u_int64_t *) key1 == *(u_int64_t *) key2)
760 return 0;
761 else if (*(u_int64_t *) key1 > *(u_int64_t *) key2)
762 return 1;
763
764 return -1;
765}
766
767static int
768btree_compare_float(cont void *key1, int keylen1, const void *key2, int keylen2)
769{
770 float result = *(float *) key1 - *(float *) key2;
771 if (result == 0.0f)
772 return 0;
773
774 return (result < 0.0f) ? -1 : 1;
775}
776
777static int
778btree_compare_double(cont void *key1, int keylen1,
779 const void *key2, int keylen2)
780{
781 double result = *(double *) key1 - *(double *) key2;
782 if (result == 0.0)
783 return 0;
784
785 return (result < 0.0) ? -1 : 1;
786}
787#endif
788