1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#ifndef __UBIFS_KEY_H__
38#define __UBIFS_KEY_H__
39
40
41
42
43
44
45
46
47
48static inline uint32_t key_mask_hash(uint32_t hash)
49{
50 hash &= UBIFS_S_KEY_HASH_MASK;
51 if (unlikely(hash <= 2))
52 hash += 3;
53 return hash;
54}
55
56
57
58
59
60
61static inline uint32_t key_r5_hash(const char *s, int len)
62{
63 uint32_t a = 0;
64 const signed char *str = (const signed char *)s;
65
66 while (*str) {
67 a += *str << 4;
68 a += *str >> 4;
69 a *= 11;
70 str++;
71 }
72
73 return key_mask_hash(a);
74}
75
76
77
78
79
80
81static inline uint32_t key_test_hash(const char *str, int len)
82{
83 uint32_t a = 0;
84
85 len = min_t(uint32_t, len, 4);
86 memcpy(&a, str, len);
87 return key_mask_hash(a);
88}
89
90
91
92
93
94
95
96static inline void ino_key_init(const struct ubifs_info *c,
97 union ubifs_key *key, ino_t inum)
98{
99 key->u32[0] = inum;
100 key->u32[1] = UBIFS_INO_KEY << UBIFS_S_KEY_BLOCK_BITS;
101}
102
103
104
105
106
107
108
109static inline void ino_key_init_flash(const struct ubifs_info *c, void *k,
110 ino_t inum)
111{
112 union ubifs_key *key = k;
113
114 key->j32[0] = cpu_to_le32(inum);
115 key->j32[1] = cpu_to_le32(UBIFS_INO_KEY << UBIFS_S_KEY_BLOCK_BITS);
116 memset(k + 8, 0, UBIFS_MAX_KEY_LEN - 8);
117}
118
119
120
121
122
123
124
125static inline void lowest_ino_key(const struct ubifs_info *c,
126 union ubifs_key *key, ino_t inum)
127{
128 key->u32[0] = inum;
129 key->u32[1] = 0;
130}
131
132
133
134
135
136
137
138static inline void highest_ino_key(const struct ubifs_info *c,
139 union ubifs_key *key, ino_t inum)
140{
141 key->u32[0] = inum;
142 key->u32[1] = 0xffffffff;
143}
144
145
146
147
148
149
150
151
152static inline void dent_key_init(const struct ubifs_info *c,
153 union ubifs_key *key, ino_t inum,
154 const struct qstr *nm)
155{
156 uint32_t hash = c->key_hash(nm->name, nm->len);
157
158 ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
159 key->u32[0] = inum;
160 key->u32[1] = hash | (UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS);
161}
162
163
164
165
166
167
168
169
170
171static inline void dent_key_init_hash(const struct ubifs_info *c,
172 union ubifs_key *key, ino_t inum,
173 uint32_t hash)
174{
175 ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
176 key->u32[0] = inum;
177 key->u32[1] = hash | (UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS);
178}
179
180
181
182
183
184
185
186
187static inline void dent_key_init_flash(const struct ubifs_info *c, void *k,
188 ino_t inum, const struct qstr *nm)
189{
190 union ubifs_key *key = k;
191 uint32_t hash = c->key_hash(nm->name, nm->len);
192
193 ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
194 key->j32[0] = cpu_to_le32(inum);
195 key->j32[1] = cpu_to_le32(hash |
196 (UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS));
197 memset(k + 8, 0, UBIFS_MAX_KEY_LEN - 8);
198}
199
200
201
202
203
204
205
206static inline void lowest_dent_key(const struct ubifs_info *c,
207 union ubifs_key *key, ino_t inum)
208{
209 key->u32[0] = inum;
210 key->u32[1] = UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS;
211}
212
213
214
215
216
217
218
219
220static inline void xent_key_init(const struct ubifs_info *c,
221 union ubifs_key *key, ino_t inum,
222 const struct qstr *nm)
223{
224 uint32_t hash = c->key_hash(nm->name, nm->len);
225
226 ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
227 key->u32[0] = inum;
228 key->u32[1] = hash | (UBIFS_XENT_KEY << UBIFS_S_KEY_HASH_BITS);
229}
230
231
232
233
234
235
236
237
238static inline void xent_key_init_flash(const struct ubifs_info *c, void *k,
239 ino_t inum, const struct qstr *nm)
240{
241 union ubifs_key *key = k;
242 uint32_t hash = c->key_hash(nm->name, nm->len);
243
244 ubifs_assert(!(hash & ~UBIFS_S_KEY_HASH_MASK));
245 key->j32[0] = cpu_to_le32(inum);
246 key->j32[1] = cpu_to_le32(hash |
247 (UBIFS_XENT_KEY << UBIFS_S_KEY_HASH_BITS));
248 memset(k + 8, 0, UBIFS_MAX_KEY_LEN - 8);
249}
250
251
252
253
254
255
256
257static inline void lowest_xent_key(const struct ubifs_info *c,
258 union ubifs_key *key, ino_t inum)
259{
260 key->u32[0] = inum;
261 key->u32[1] = UBIFS_XENT_KEY << UBIFS_S_KEY_HASH_BITS;
262}
263
264
265
266
267
268
269
270
271static inline void data_key_init(const struct ubifs_info *c,
272 union ubifs_key *key, ino_t inum,
273 unsigned int block)
274{
275 ubifs_assert(!(block & ~UBIFS_S_KEY_BLOCK_MASK));
276 key->u32[0] = inum;
277 key->u32[1] = block | (UBIFS_DATA_KEY << UBIFS_S_KEY_BLOCK_BITS);
278}
279
280
281
282
283
284
285
286static inline void highest_data_key(const struct ubifs_info *c,
287 union ubifs_key *key, ino_t inum)
288{
289 data_key_init(c, key, inum, UBIFS_S_KEY_BLOCK_MASK);
290}
291
292
293
294
295
296
297
298
299
300
301static inline void trun_key_init(const struct ubifs_info *c,
302 union ubifs_key *key, ino_t inum)
303{
304 key->u32[0] = inum;
305 key->u32[1] = UBIFS_TRUN_KEY << UBIFS_S_KEY_BLOCK_BITS;
306}
307
308
309
310
311
312
313
314
315static inline void invalid_key_init(const struct ubifs_info *c,
316 union ubifs_key *key)
317{
318 key->u32[0] = 0xDEADBEAF;
319 key->u32[1] = UBIFS_INVALID_KEY;
320}
321
322
323
324
325
326
327static inline int key_type(const struct ubifs_info *c,
328 const union ubifs_key *key)
329{
330 return key->u32[1] >> UBIFS_S_KEY_BLOCK_BITS;
331}
332
333
334
335
336
337
338static inline int key_type_flash(const struct ubifs_info *c, const void *k)
339{
340 const union ubifs_key *key = k;
341
342 return le32_to_cpu(key->j32[1]) >> UBIFS_S_KEY_BLOCK_BITS;
343}
344
345
346
347
348
349
350static inline ino_t key_inum(const struct ubifs_info *c, const void *k)
351{
352 const union ubifs_key *key = k;
353
354 return key->u32[0];
355}
356
357
358
359
360
361
362static inline ino_t key_inum_flash(const struct ubifs_info *c, const void *k)
363{
364 const union ubifs_key *key = k;
365
366 return le32_to_cpu(key->j32[0]);
367}
368
369
370
371
372
373
374static inline uint32_t key_hash(const struct ubifs_info *c,
375 const union ubifs_key *key)
376{
377 return key->u32[1] & UBIFS_S_KEY_HASH_MASK;
378}
379
380
381
382
383
384
385static inline uint32_t key_hash_flash(const struct ubifs_info *c, const void *k)
386{
387 const union ubifs_key *key = k;
388
389 return le32_to_cpu(key->j32[1]) & UBIFS_S_KEY_HASH_MASK;
390}
391
392
393
394
395
396
397static inline unsigned int key_block(const struct ubifs_info *c,
398 const union ubifs_key *key)
399{
400 return key->u32[1] & UBIFS_S_KEY_BLOCK_MASK;
401}
402
403
404
405
406
407
408static inline unsigned int key_block_flash(const struct ubifs_info *c,
409 const void *k)
410{
411 const union ubifs_key *key = k;
412
413 return le32_to_cpu(key->j32[1]) & UBIFS_S_KEY_BLOCK_MASK;
414}
415
416
417
418
419
420
421
422static inline void key_read(const struct ubifs_info *c, const void *from,
423 union ubifs_key *to)
424{
425 const union ubifs_key *f = from;
426
427 to->u32[0] = le32_to_cpu(f->j32[0]);
428 to->u32[1] = le32_to_cpu(f->j32[1]);
429}
430
431
432
433
434
435
436
437static inline void key_write(const struct ubifs_info *c,
438 const union ubifs_key *from, void *to)
439{
440 union ubifs_key *t = to;
441
442 t->j32[0] = cpu_to_le32(from->u32[0]);
443 t->j32[1] = cpu_to_le32(from->u32[1]);
444 memset(to + 8, 0, UBIFS_MAX_KEY_LEN - 8);
445}
446
447
448
449
450
451
452
453static inline void key_write_idx(const struct ubifs_info *c,
454 const union ubifs_key *from, void *to)
455{
456 union ubifs_key *t = to;
457
458 t->j32[0] = cpu_to_le32(from->u32[0]);
459 t->j32[1] = cpu_to_le32(from->u32[1]);
460}
461
462
463
464
465
466
467
468static inline void key_copy(const struct ubifs_info *c,
469 const union ubifs_key *from, union ubifs_key *to)
470{
471 to->u64[0] = from->u64[0];
472}
473
474
475
476
477
478
479
480
481
482
483static inline int keys_cmp(const struct ubifs_info *c,
484 const union ubifs_key *key1,
485 const union ubifs_key *key2)
486{
487 if (key1->u32[0] < key2->u32[0])
488 return -1;
489 if (key1->u32[0] > key2->u32[0])
490 return 1;
491 if (key1->u32[1] < key2->u32[1])
492 return -1;
493 if (key1->u32[1] > key2->u32[1])
494 return 1;
495
496 return 0;
497}
498
499
500
501
502
503
504
505
506
507
508static inline int keys_eq(const struct ubifs_info *c,
509 const union ubifs_key *key1,
510 const union ubifs_key *key2)
511{
512 if (key1->u32[0] != key2->u32[0])
513 return 0;
514 if (key1->u32[1] != key2->u32[1])
515 return 0;
516 return 1;
517}
518
519
520
521
522
523
524
525
526static inline int is_hash_key(const struct ubifs_info *c,
527 const union ubifs_key *key)
528{
529 int type = key_type(c, key);
530
531 return type == UBIFS_DENT_KEY || type == UBIFS_XENT_KEY;
532}
533
534
535
536
537
538static inline unsigned long long key_max_inode_size(const struct ubifs_info *c)
539{
540 switch (c->key_fmt) {
541 case UBIFS_SIMPLE_KEY_FMT:
542 return (1ULL << UBIFS_S_KEY_BLOCK_BITS) * UBIFS_BLOCK_SIZE;
543 default:
544 return 0;
545 }
546}
547
548#endif
549