linux/fs/ubifs/key.h
<<
>>
Prefs
   1/*
   2 * This file is part of UBIFS.
   3 *
   4 * Copyright (C) 2006-2008 Nokia Corporation.
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms of the GNU General Public License version 2 as published by
   8 * the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but WITHOUT
  11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  13 * more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along with
  16 * this program; if not, write to the Free Software Foundation, Inc., 51
  17 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  18 *
  19 * Authors: Artem Bityutskiy (Битюцкий Артём)
  20 *          Adrian Hunter
  21 */
  22
  23/*
  24 * This header contains various key-related definitions and helper function.
  25 * UBIFS allows several key schemes, so we access key fields only via these
  26 * helpers. At the moment only one key scheme is supported.
  27 *
  28 * Simple key scheme
  29 * ~~~~~~~~~~~~~~~~~
  30 *
  31 * Keys are 64-bits long. First 32-bits are inode number (parent inode number
  32 * in case of direntry key). Next 3 bits are node type. The last 29 bits are
  33 * 4KiB offset in case of inode node, and direntry hash in case of a direntry
  34 * node. We use "r5" hash borrowed from reiserfs.
  35 */
  36
  37/*
  38 * Lot's of the key helpers require a struct ubifs_info *c as the first parameter.
  39 * But we are not using it at all currently. That's designed for future extensions of
  40 * different c->key_format. But right now, there is only one key type, UBIFS_SIMPLE_KEY_FMT.
  41 */
  42
  43#ifndef __UBIFS_KEY_H__
  44#define __UBIFS_KEY_H__
  45
  46/**
  47 * key_mask_hash - mask a valid hash value.
  48 * @val: value to be masked
  49 *
  50 * We use hash values as offset in directories, so values %0 and %1 are
  51 * reserved for "." and "..". %2 is reserved for "end of readdir" marker. This
  52 * function makes sure the reserved values are not used.
  53 */
  54static inline uint32_t key_mask_hash(uint32_t hash)
  55{
  56        hash &= UBIFS_S_KEY_HASH_MASK;
  57        if (unlikely(hash <= 2))
  58                hash += 3;
  59        return hash;
  60}
  61
  62/**
  63 * key_r5_hash - R5 hash function (borrowed from reiserfs).
  64 * @s: direntry name
  65 * @len: name length
  66 */
  67static inline uint32_t key_r5_hash(const char *s, int len)
  68{
  69        uint32_t a = 0;
  70        const signed char *str = (const signed char *)s;
  71
  72        while (len--) {
  73                a += *str << 4;
  74                a += *str >> 4;
  75                a *= 11;
  76                str++;
  77        }
  78
  79        return key_mask_hash(a);
  80}
  81
  82/**
  83 * key_test_hash - testing hash function.
  84 * @str: direntry name
  85 * @len: name length
  86 */
  87static inline uint32_t key_test_hash(const char *str, int len)
  88{
  89        uint32_t a = 0;
  90
  91        len = min_t(uint32_t, len, 4);
  92        memcpy(&a, str, len);
  93        return key_mask_hash(a);
  94}
  95
  96/**
  97 * ino_key_init - initialize inode key.
  98 * @c: UBIFS file-system description object
  99 * @key: key to initialize
 100 * @inum: inode number
 101 */
 102static inline void ino_key_init(const struct ubifs_info *c,
 103                                union ubifs_key *key, ino_t inum)
 104{
 105        key->u32[0] = inum;
 106        key->u32[1] = UBIFS_INO_KEY << UBIFS_S_KEY_BLOCK_BITS;
 107}
 108
 109/**
 110 * ino_key_init_flash - initialize on-flash inode key.
 111 * @c: UBIFS file-system description object
 112 * @k: key to initialize
 113 * @inum: inode number
 114 */
 115static inline void ino_key_init_flash(const struct ubifs_info *c, void *k,
 116                                      ino_t inum)
 117{
 118        union ubifs_key *key = k;
 119
 120        key->j32[0] = cpu_to_le32(inum);
 121        key->j32[1] = cpu_to_le32(UBIFS_INO_KEY << UBIFS_S_KEY_BLOCK_BITS);
 122        memset(k + 8, 0, UBIFS_MAX_KEY_LEN - 8);
 123}
 124
 125/**
 126 * lowest_ino_key - get the lowest possible inode key.
 127 * @c: UBIFS file-system description object
 128 * @key: key to initialize
 129 * @inum: inode number
 130 */
 131static inline void lowest_ino_key(const struct ubifs_info *c,
 132                                union ubifs_key *key, ino_t inum)
 133{
 134        key->u32[0] = inum;
 135        key->u32[1] = 0;
 136}
 137
 138/**
 139 * highest_ino_key - get the highest possible inode key.
 140 * @c: UBIFS file-system description object
 141 * @key: key to initialize
 142 * @inum: inode number
 143 */
 144static inline void highest_ino_key(const struct ubifs_info *c,
 145                                union ubifs_key *key, ino_t inum)
 146{
 147        key->u32[0] = inum;
 148        key->u32[1] = 0xffffffff;
 149}
 150
 151/**
 152 * dent_key_init - initialize directory entry key.
 153 * @c: UBIFS file-system description object
 154 * @key: key to initialize
 155 * @inum: parent inode number
 156 * @nm: direntry name and length. Not a string when encrypted!
 157 */
 158static inline void dent_key_init(const struct ubifs_info *c,
 159                                 union ubifs_key *key, ino_t inum,
 160                                 const struct fscrypt_name *nm)
 161{
 162        uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
 163
 164        ubifs_assert(c, !(hash & ~UBIFS_S_KEY_HASH_MASK));
 165        ubifs_assert(c, !nm->hash && !nm->minor_hash);
 166        key->u32[0] = inum;
 167        key->u32[1] = hash | (UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS);
 168}
 169
 170/**
 171 * dent_key_init_hash - initialize directory entry key without re-calculating
 172 *                      hash function.
 173 * @c: UBIFS file-system description object
 174 * @key: key to initialize
 175 * @inum: parent inode number
 176 * @hash: direntry name hash
 177 */
 178static inline void dent_key_init_hash(const struct ubifs_info *c,
 179                                      union ubifs_key *key, ino_t inum,
 180                                      uint32_t hash)
 181{
 182        ubifs_assert(c, !(hash & ~UBIFS_S_KEY_HASH_MASK));
 183        key->u32[0] = inum;
 184        key->u32[1] = hash | (UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS);
 185}
 186
 187/**
 188 * dent_key_init_flash - initialize on-flash directory entry key.
 189 * @c: UBIFS file-system description object
 190 * @k: key to initialize
 191 * @inum: parent inode number
 192 * @nm: direntry name and length
 193 */
 194static inline void dent_key_init_flash(const struct ubifs_info *c, void *k,
 195                                       ino_t inum,
 196                                       const struct fscrypt_name *nm)
 197{
 198        union ubifs_key *key = k;
 199        uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
 200
 201        ubifs_assert(c, !(hash & ~UBIFS_S_KEY_HASH_MASK));
 202        key->j32[0] = cpu_to_le32(inum);
 203        key->j32[1] = cpu_to_le32(hash |
 204                                  (UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS));
 205        memset(k + 8, 0, UBIFS_MAX_KEY_LEN - 8);
 206}
 207
 208/**
 209 * lowest_dent_key - get the lowest possible directory entry key.
 210 * @c: UBIFS file-system description object
 211 * @key: where to store the lowest key
 212 * @inum: parent inode number
 213 */
 214static inline void lowest_dent_key(const struct ubifs_info *c,
 215                                   union ubifs_key *key, ino_t inum)
 216{
 217        key->u32[0] = inum;
 218        key->u32[1] = UBIFS_DENT_KEY << UBIFS_S_KEY_HASH_BITS;
 219}
 220
 221/**
 222 * xent_key_init - initialize extended attribute entry key.
 223 * @c: UBIFS file-system description object
 224 * @key: key to initialize
 225 * @inum: host inode number
 226 * @nm: extended attribute entry name and length
 227 */
 228static inline void xent_key_init(const struct ubifs_info *c,
 229                                 union ubifs_key *key, ino_t inum,
 230                                 const struct fscrypt_name *nm)
 231{
 232        uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
 233
 234        ubifs_assert(c, !(hash & ~UBIFS_S_KEY_HASH_MASK));
 235        key->u32[0] = inum;
 236        key->u32[1] = hash | (UBIFS_XENT_KEY << UBIFS_S_KEY_HASH_BITS);
 237}
 238
 239/**
 240 * xent_key_init_flash - initialize on-flash extended attribute entry key.
 241 * @c: UBIFS file-system description object
 242 * @k: key to initialize
 243 * @inum: host inode number
 244 * @nm: extended attribute entry name and length
 245 */
 246static inline void xent_key_init_flash(const struct ubifs_info *c, void *k,
 247                                       ino_t inum, const struct fscrypt_name *nm)
 248{
 249        union ubifs_key *key = k;
 250        uint32_t hash = c->key_hash(fname_name(nm), fname_len(nm));
 251
 252        ubifs_assert(c, !(hash & ~UBIFS_S_KEY_HASH_MASK));
 253        key->j32[0] = cpu_to_le32(inum);
 254        key->j32[1] = cpu_to_le32(hash |
 255                                  (UBIFS_XENT_KEY << UBIFS_S_KEY_HASH_BITS));
 256        memset(k + 8, 0, UBIFS_MAX_KEY_LEN - 8);
 257}
 258
 259/**
 260 * lowest_xent_key - get the lowest possible extended attribute entry key.
 261 * @c: UBIFS file-system description object
 262 * @key: where to store the lowest key
 263 * @inum: host inode number
 264 */
 265static inline void lowest_xent_key(const struct ubifs_info *c,
 266                                   union ubifs_key *key, ino_t inum)
 267{
 268        key->u32[0] = inum;
 269        key->u32[1] = UBIFS_XENT_KEY << UBIFS_S_KEY_HASH_BITS;
 270}
 271
 272/**
 273 * data_key_init - initialize data key.
 274 * @c: UBIFS file-system description object
 275 * @key: key to initialize
 276 * @inum: inode number
 277 * @block: block number
 278 */
 279static inline void data_key_init(const struct ubifs_info *c,
 280                                 union ubifs_key *key, ino_t inum,
 281                                 unsigned int block)
 282{
 283        ubifs_assert(c, !(block & ~UBIFS_S_KEY_BLOCK_MASK));
 284        key->u32[0] = inum;
 285        key->u32[1] = block | (UBIFS_DATA_KEY << UBIFS_S_KEY_BLOCK_BITS);
 286}
 287
 288/**
 289 * highest_data_key - get the highest possible data key for an inode.
 290 * @c: UBIFS file-system description object
 291 * @key: key to initialize
 292 * @inum: inode number
 293 */
 294static inline void highest_data_key(const struct ubifs_info *c,
 295                                   union ubifs_key *key, ino_t inum)
 296{
 297        data_key_init(c, key, inum, UBIFS_S_KEY_BLOCK_MASK);
 298}
 299
 300/**
 301 * trun_key_init - initialize truncation node key.
 302 * @c: UBIFS file-system description object
 303 * @key: key to initialize
 304 * @inum: inode number
 305 *
 306 * Note, UBIFS does not have truncation keys on the media and this function is
 307 * only used for purposes of replay.
 308 */
 309static inline void trun_key_init(const struct ubifs_info *c,
 310                                 union ubifs_key *key, ino_t inum)
 311{
 312        key->u32[0] = inum;
 313        key->u32[1] = UBIFS_TRUN_KEY << UBIFS_S_KEY_BLOCK_BITS;
 314}
 315
 316/**
 317 * invalid_key_init - initialize invalid node key.
 318 * @c: UBIFS file-system description object
 319 * @key: key to initialize
 320 *
 321 * This is a helper function which marks a @key object as invalid.
 322 */
 323static inline void invalid_key_init(const struct ubifs_info *c,
 324                                    union ubifs_key *key)
 325{
 326        key->u32[0] = 0xDEADBEAF;
 327        key->u32[1] = UBIFS_INVALID_KEY;
 328}
 329
 330/**
 331 * key_type - get key type.
 332 * @c: UBIFS file-system description object
 333 * @key: key to get type of
 334 */
 335static inline int key_type(const struct ubifs_info *c,
 336                           const union ubifs_key *key)
 337{
 338        return key->u32[1] >> UBIFS_S_KEY_BLOCK_BITS;
 339}
 340
 341/**
 342 * key_type_flash - get type of a on-flash formatted key.
 343 * @c: UBIFS file-system description object
 344 * @k: key to get type of
 345 */
 346static inline int key_type_flash(const struct ubifs_info *c, const void *k)
 347{
 348        const union ubifs_key *key = k;
 349
 350        return le32_to_cpu(key->j32[1]) >> UBIFS_S_KEY_BLOCK_BITS;
 351}
 352
 353/**
 354 * key_inum - fetch inode number from key.
 355 * @c: UBIFS file-system description object
 356 * @k: key to fetch inode number from
 357 */
 358static inline ino_t key_inum(const struct ubifs_info *c, const void *k)
 359{
 360        const union ubifs_key *key = k;
 361
 362        return key->u32[0];
 363}
 364
 365/**
 366 * key_inum_flash - fetch inode number from an on-flash formatted key.
 367 * @c: UBIFS file-system description object
 368 * @k: key to fetch inode number from
 369 */
 370static inline ino_t key_inum_flash(const struct ubifs_info *c, const void *k)
 371{
 372        const union ubifs_key *key = k;
 373
 374        return le32_to_cpu(key->j32[0]);
 375}
 376
 377/**
 378 * key_hash - get directory entry hash.
 379 * @c: UBIFS file-system description object
 380 * @key: the key to get hash from
 381 */
 382static inline uint32_t key_hash(const struct ubifs_info *c,
 383                                const union ubifs_key *key)
 384{
 385        return key->u32[1] & UBIFS_S_KEY_HASH_MASK;
 386}
 387
 388/**
 389 * key_hash_flash - get directory entry hash from an on-flash formatted key.
 390 * @c: UBIFS file-system description object
 391 * @k: the key to get hash from
 392 */
 393static inline uint32_t key_hash_flash(const struct ubifs_info *c, const void *k)
 394{
 395        const union ubifs_key *key = k;
 396
 397        return le32_to_cpu(key->j32[1]) & UBIFS_S_KEY_HASH_MASK;
 398}
 399
 400/**
 401 * key_block - get data block number.
 402 * @c: UBIFS file-system description object
 403 * @key: the key to get the block number from
 404 */
 405static inline unsigned int key_block(const struct ubifs_info *c,
 406                                     const union ubifs_key *key)
 407{
 408        return key->u32[1] & UBIFS_S_KEY_BLOCK_MASK;
 409}
 410
 411/**
 412 * key_block_flash - get data block number from an on-flash formatted key.
 413 * @c: UBIFS file-system description object
 414 * @k: the key to get the block number from
 415 */
 416static inline unsigned int key_block_flash(const struct ubifs_info *c,
 417                                           const void *k)
 418{
 419        const union ubifs_key *key = k;
 420
 421        return le32_to_cpu(key->j32[1]) & UBIFS_S_KEY_BLOCK_MASK;
 422}
 423
 424/**
 425 * key_read - transform a key to in-memory format.
 426 * @c: UBIFS file-system description object
 427 * @from: the key to transform
 428 * @to: the key to store the result
 429 */
 430static inline void key_read(const struct ubifs_info *c, const void *from,
 431                            union ubifs_key *to)
 432{
 433        const union ubifs_key *f = from;
 434
 435        to->u32[0] = le32_to_cpu(f->j32[0]);
 436        to->u32[1] = le32_to_cpu(f->j32[1]);
 437}
 438
 439/**
 440 * key_write - transform a key from in-memory format.
 441 * @c: UBIFS file-system description object
 442 * @from: the key to transform
 443 * @to: the key to store the result
 444 */
 445static inline void key_write(const struct ubifs_info *c,
 446                             const union ubifs_key *from, void *to)
 447{
 448        union ubifs_key *t = to;
 449
 450        t->j32[0] = cpu_to_le32(from->u32[0]);
 451        t->j32[1] = cpu_to_le32(from->u32[1]);
 452        memset(to + 8, 0, UBIFS_MAX_KEY_LEN - 8);
 453}
 454
 455/**
 456 * key_write_idx - transform a key from in-memory format for the index.
 457 * @c: UBIFS file-system description object
 458 * @from: the key to transform
 459 * @to: the key to store the result
 460 */
 461static inline void key_write_idx(const struct ubifs_info *c,
 462                                 const union ubifs_key *from, void *to)
 463{
 464        union ubifs_key *t = to;
 465
 466        t->j32[0] = cpu_to_le32(from->u32[0]);
 467        t->j32[1] = cpu_to_le32(from->u32[1]);
 468}
 469
 470/**
 471 * key_copy - copy a key.
 472 * @c: UBIFS file-system description object
 473 * @from: the key to copy from
 474 * @to: the key to copy to
 475 */
 476static inline void key_copy(const struct ubifs_info *c,
 477                            const union ubifs_key *from, union ubifs_key *to)
 478{
 479        to->u64[0] = from->u64[0];
 480}
 481
 482/**
 483 * keys_cmp - compare keys.
 484 * @c: UBIFS file-system description object
 485 * @key1: the first key to compare
 486 * @key2: the second key to compare
 487 *
 488 * This function compares 2 keys and returns %-1 if @key1 is less than
 489 * @key2, %0 if the keys are equivalent and %1 if @key1 is greater than @key2.
 490 */
 491static inline int keys_cmp(const struct ubifs_info *c,
 492                           const union ubifs_key *key1,
 493                           const union ubifs_key *key2)
 494{
 495        if (key1->u32[0] < key2->u32[0])
 496                return -1;
 497        if (key1->u32[0] > key2->u32[0])
 498                return 1;
 499        if (key1->u32[1] < key2->u32[1])
 500                return -1;
 501        if (key1->u32[1] > key2->u32[1])
 502                return 1;
 503
 504        return 0;
 505}
 506
 507/**
 508 * keys_eq - determine if keys are equivalent.
 509 * @c: UBIFS file-system description object
 510 * @key1: the first key to compare
 511 * @key2: the second key to compare
 512 *
 513 * This function compares 2 keys and returns %1 if @key1 is equal to @key2 and
 514 * %0 if not.
 515 */
 516static inline int keys_eq(const struct ubifs_info *c,
 517                          const union ubifs_key *key1,
 518                          const union ubifs_key *key2)
 519{
 520        if (key1->u32[0] != key2->u32[0])
 521                return 0;
 522        if (key1->u32[1] != key2->u32[1])
 523                return 0;
 524        return 1;
 525}
 526
 527/**
 528 * is_hash_key - is a key vulnerable to hash collisions.
 529 * @c: UBIFS file-system description object
 530 * @key: key
 531 *
 532 * This function returns %1 if @key is a hashed key or %0 otherwise.
 533 */
 534static inline int is_hash_key(const struct ubifs_info *c,
 535                              const union ubifs_key *key)
 536{
 537        int type = key_type(c, key);
 538
 539        return type == UBIFS_DENT_KEY || type == UBIFS_XENT_KEY;
 540}
 541
 542/**
 543 * key_max_inode_size - get maximum file size allowed by current key format.
 544 * @c: UBIFS file-system description object
 545 */
 546static inline unsigned long long key_max_inode_size(const struct ubifs_info *c)
 547{
 548        switch (c->key_fmt) {
 549        case UBIFS_SIMPLE_KEY_FMT:
 550                return (1ULL << UBIFS_S_KEY_BLOCK_BITS) * UBIFS_BLOCK_SIZE;
 551        default:
 552                return 0;
 553        }
 554}
 555
 556#endif /* !__UBIFS_KEY_H__ */
 557