linux/fs/ubifs/lpt.c
<<
>>
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: Adrian Hunter
  20 *          Artem Bityutskiy (Битюцкий Артём)
  21 */
  22
  23/*
  24 * This file implements the LEB properties tree (LPT) area. The LPT area
  25 * contains the LEB properties tree, a table of LPT area eraseblocks (ltab), and
  26 * (for the "big" model) a table of saved LEB numbers (lsave). The LPT area sits
  27 * between the log and the orphan area.
  28 *
  29 * The LPT area is like a miniature self-contained file system. It is required
  30 * that it never runs out of space, is fast to access and update, and scales
  31 * logarithmically. The LEB properties tree is implemented as a wandering tree
  32 * much like the TNC, and the LPT area has its own garbage collection.
  33 *
  34 * The LPT has two slightly different forms called the "small model" and the
  35 * "big model". The small model is used when the entire LEB properties table
  36 * can be written into a single eraseblock. In that case, garbage collection
  37 * consists of just writing the whole table, which therefore makes all other
  38 * eraseblocks reusable. In the case of the big model, dirty eraseblocks are
  39 * selected for garbage collection, which consists of marking the clean nodes in
  40 * that LEB as dirty, and then only the dirty nodes are written out. Also, in
  41 * the case of the big model, a table of LEB numbers is saved so that the entire
  42 * LPT does not to be scanned looking for empty eraseblocks when UBIFS is first
  43 * mounted.
  44 */
  45
  46#include "ubifs.h"
  47#include <linux/crc16.h>
  48#include <linux/math64.h>
  49#include <linux/slab.h>
  50
  51/**
  52 * do_calc_lpt_geom - calculate sizes for the LPT area.
  53 * @c: the UBIFS file-system description object
  54 *
  55 * Calculate the sizes of LPT bit fields, nodes, and tree, based on the
  56 * properties of the flash and whether LPT is "big" (c->big_lpt).
  57 */
  58static void do_calc_lpt_geom(struct ubifs_info *c)
  59{
  60        int i, n, bits, per_leb_wastage, max_pnode_cnt;
  61        long long sz, tot_wastage;
  62
  63        n = c->main_lebs + c->max_leb_cnt - c->leb_cnt;
  64        max_pnode_cnt = DIV_ROUND_UP(n, UBIFS_LPT_FANOUT);
  65
  66        c->lpt_hght = 1;
  67        n = UBIFS_LPT_FANOUT;
  68        while (n < max_pnode_cnt) {
  69                c->lpt_hght += 1;
  70                n <<= UBIFS_LPT_FANOUT_SHIFT;
  71        }
  72
  73        c->pnode_cnt = DIV_ROUND_UP(c->main_lebs, UBIFS_LPT_FANOUT);
  74
  75        n = DIV_ROUND_UP(c->pnode_cnt, UBIFS_LPT_FANOUT);
  76        c->nnode_cnt = n;
  77        for (i = 1; i < c->lpt_hght; i++) {
  78                n = DIV_ROUND_UP(n, UBIFS_LPT_FANOUT);
  79                c->nnode_cnt += n;
  80        }
  81
  82        c->space_bits = fls(c->leb_size) - 3;
  83        c->lpt_lnum_bits = fls(c->lpt_lebs);
  84        c->lpt_offs_bits = fls(c->leb_size - 1);
  85        c->lpt_spc_bits = fls(c->leb_size);
  86
  87        n = DIV_ROUND_UP(c->max_leb_cnt, UBIFS_LPT_FANOUT);
  88        c->pcnt_bits = fls(n - 1);
  89
  90        c->lnum_bits = fls(c->max_leb_cnt - 1);
  91
  92        bits = UBIFS_LPT_CRC_BITS + UBIFS_LPT_TYPE_BITS +
  93               (c->big_lpt ? c->pcnt_bits : 0) +
  94               (c->space_bits * 2 + 1) * UBIFS_LPT_FANOUT;
  95        c->pnode_sz = (bits + 7) / 8;
  96
  97        bits = UBIFS_LPT_CRC_BITS + UBIFS_LPT_TYPE_BITS +
  98               (c->big_lpt ? c->pcnt_bits : 0) +
  99               (c->lpt_lnum_bits + c->lpt_offs_bits) * UBIFS_LPT_FANOUT;
 100        c->nnode_sz = (bits + 7) / 8;
 101
 102        bits = UBIFS_LPT_CRC_BITS + UBIFS_LPT_TYPE_BITS +
 103               c->lpt_lebs * c->lpt_spc_bits * 2;
 104        c->ltab_sz = (bits + 7) / 8;
 105
 106        bits = UBIFS_LPT_CRC_BITS + UBIFS_LPT_TYPE_BITS +
 107               c->lnum_bits * c->lsave_cnt;
 108        c->lsave_sz = (bits + 7) / 8;
 109
 110        /* Calculate the minimum LPT size */
 111        c->lpt_sz = (long long)c->pnode_cnt * c->pnode_sz;
 112        c->lpt_sz += (long long)c->nnode_cnt * c->nnode_sz;
 113        c->lpt_sz += c->ltab_sz;
 114        if (c->big_lpt)
 115                c->lpt_sz += c->lsave_sz;
 116
 117        /* Add wastage */
 118        sz = c->lpt_sz;
 119        per_leb_wastage = max_t(int, c->pnode_sz, c->nnode_sz);
 120        sz += per_leb_wastage;
 121        tot_wastage = per_leb_wastage;
 122        while (sz > c->leb_size) {
 123                sz += per_leb_wastage;
 124                sz -= c->leb_size;
 125                tot_wastage += per_leb_wastage;
 126        }
 127        tot_wastage += ALIGN(sz, c->min_io_size) - sz;
 128        c->lpt_sz += tot_wastage;
 129}
 130
 131/**
 132 * ubifs_calc_lpt_geom - calculate and check sizes for the LPT area.
 133 * @c: the UBIFS file-system description object
 134 *
 135 * This function returns %0 on success and a negative error code on failure.
 136 */
 137int ubifs_calc_lpt_geom(struct ubifs_info *c)
 138{
 139        int lebs_needed;
 140        long long sz;
 141
 142        do_calc_lpt_geom(c);
 143
 144        /* Verify that lpt_lebs is big enough */
 145        sz = c->lpt_sz * 2; /* Must have at least 2 times the size */
 146        lebs_needed = div_u64(sz + c->leb_size - 1, c->leb_size);
 147        if (lebs_needed > c->lpt_lebs) {
 148                ubifs_err(c, "too few LPT LEBs");
 149                return -EINVAL;
 150        }
 151
 152        /* Verify that ltab fits in a single LEB (since ltab is a single node */
 153        if (c->ltab_sz > c->leb_size) {
 154                ubifs_err(c, "LPT ltab too big");
 155                return -EINVAL;
 156        }
 157
 158        c->check_lpt_free = c->big_lpt;
 159        return 0;
 160}
 161
 162/**
 163 * calc_dflt_lpt_geom - calculate default LPT geometry.
 164 * @c: the UBIFS file-system description object
 165 * @main_lebs: number of main area LEBs is passed and returned here
 166 * @big_lpt: whether the LPT area is "big" is returned here
 167 *
 168 * The size of the LPT area depends on parameters that themselves are dependent
 169 * on the size of the LPT area. This function, successively recalculates the LPT
 170 * area geometry until the parameters and resultant geometry are consistent.
 171 *
 172 * This function returns %0 on success and a negative error code on failure.
 173 */
 174static int calc_dflt_lpt_geom(struct ubifs_info *c, int *main_lebs,
 175                              int *big_lpt)
 176{
 177        int i, lebs_needed;
 178        long long sz;
 179
 180        /* Start by assuming the minimum number of LPT LEBs */
 181        c->lpt_lebs = UBIFS_MIN_LPT_LEBS;
 182        c->main_lebs = *main_lebs - c->lpt_lebs;
 183        if (c->main_lebs <= 0)
 184                return -EINVAL;
 185
 186        /* And assume we will use the small LPT model */
 187        c->big_lpt = 0;
 188
 189        /*
 190         * Calculate the geometry based on assumptions above and then see if it
 191         * makes sense
 192         */
 193        do_calc_lpt_geom(c);
 194
 195        /* Small LPT model must have lpt_sz < leb_size */
 196        if (c->lpt_sz > c->leb_size) {
 197                /* Nope, so try again using big LPT model */
 198                c->big_lpt = 1;
 199                do_calc_lpt_geom(c);
 200        }
 201
 202        /* Now check there are enough LPT LEBs */
 203        for (i = 0; i < 64 ; i++) {
 204                sz = c->lpt_sz * 4; /* Allow 4 times the size */
 205                lebs_needed = div_u64(sz + c->leb_size - 1, c->leb_size);
 206                if (lebs_needed > c->lpt_lebs) {
 207                        /* Not enough LPT LEBs so try again with more */
 208                        c->lpt_lebs = lebs_needed;
 209                        c->main_lebs = *main_lebs - c->lpt_lebs;
 210                        if (c->main_lebs <= 0)
 211                                return -EINVAL;
 212                        do_calc_lpt_geom(c);
 213                        continue;
 214                }
 215                if (c->ltab_sz > c->leb_size) {
 216                        ubifs_err(c, "LPT ltab too big");
 217                        return -EINVAL;
 218                }
 219                *main_lebs = c->main_lebs;
 220                *big_lpt = c->big_lpt;
 221                return 0;
 222        }
 223        return -EINVAL;
 224}
 225
 226/**
 227 * pack_bits - pack bit fields end-to-end.
 228 * @c: UBIFS file-system description object
 229 * @addr: address at which to pack (passed and next address returned)
 230 * @pos: bit position at which to pack (passed and next position returned)
 231 * @val: value to pack
 232 * @nrbits: number of bits of value to pack (1-32)
 233 */
 234static void pack_bits(const struct ubifs_info *c, uint8_t **addr, int *pos, uint32_t val, int nrbits)
 235{
 236        uint8_t *p = *addr;
 237        int b = *pos;
 238
 239        ubifs_assert(c, nrbits > 0);
 240        ubifs_assert(c, nrbits <= 32);
 241        ubifs_assert(c, *pos >= 0);
 242        ubifs_assert(c, *pos < 8);
 243        ubifs_assert(c, (val >> nrbits) == 0 || nrbits == 32);
 244        if (b) {
 245                *p |= ((uint8_t)val) << b;
 246                nrbits += b;
 247                if (nrbits > 8) {
 248                        *++p = (uint8_t)(val >>= (8 - b));
 249                        if (nrbits > 16) {
 250                                *++p = (uint8_t)(val >>= 8);
 251                                if (nrbits > 24) {
 252                                        *++p = (uint8_t)(val >>= 8);
 253                                        if (nrbits > 32)
 254                                                *++p = (uint8_t)(val >>= 8);
 255                                }
 256                        }
 257                }
 258        } else {
 259                *p = (uint8_t)val;
 260                if (nrbits > 8) {
 261                        *++p = (uint8_t)(val >>= 8);
 262                        if (nrbits > 16) {
 263                                *++p = (uint8_t)(val >>= 8);
 264                                if (nrbits > 24)
 265                                        *++p = (uint8_t)(val >>= 8);
 266                        }
 267                }
 268        }
 269        b = nrbits & 7;
 270        if (b == 0)
 271                p++;
 272        *addr = p;
 273        *pos = b;
 274}
 275
 276/**
 277 * ubifs_unpack_bits - unpack bit fields.
 278 * @c: UBIFS file-system description object
 279 * @addr: address at which to unpack (passed and next address returned)
 280 * @pos: bit position at which to unpack (passed and next position returned)
 281 * @nrbits: number of bits of value to unpack (1-32)
 282 *
 283 * This functions returns the value unpacked.
 284 */
 285uint32_t ubifs_unpack_bits(const struct ubifs_info *c, uint8_t **addr, int *pos, int nrbits)
 286{
 287        const int k = 32 - nrbits;
 288        uint8_t *p = *addr;
 289        int b = *pos;
 290        uint32_t uninitialized_var(val);
 291        const int bytes = (nrbits + b + 7) >> 3;
 292
 293        ubifs_assert(c, nrbits > 0);
 294        ubifs_assert(c, nrbits <= 32);
 295        ubifs_assert(c, *pos >= 0);
 296        ubifs_assert(c, *pos < 8);
 297        if (b) {
 298                switch (bytes) {
 299                case 2:
 300                        val = p[1];
 301                        break;
 302                case 3:
 303                        val = p[1] | ((uint32_t)p[2] << 8);
 304                        break;
 305                case 4:
 306                        val = p[1] | ((uint32_t)p[2] << 8) |
 307                                     ((uint32_t)p[3] << 16);
 308                        break;
 309                case 5:
 310                        val = p[1] | ((uint32_t)p[2] << 8) |
 311                                     ((uint32_t)p[3] << 16) |
 312                                     ((uint32_t)p[4] << 24);
 313                }
 314                val <<= (8 - b);
 315                val |= *p >> b;
 316                nrbits += b;
 317        } else {
 318                switch (bytes) {
 319                case 1:
 320                        val = p[0];
 321                        break;
 322                case 2:
 323                        val = p[0] | ((uint32_t)p[1] << 8);
 324                        break;
 325                case 3:
 326                        val = p[0] | ((uint32_t)p[1] << 8) |
 327                                     ((uint32_t)p[2] << 16);
 328                        break;
 329                case 4:
 330                        val = p[0] | ((uint32_t)p[1] << 8) |
 331                                     ((uint32_t)p[2] << 16) |
 332                                     ((uint32_t)p[3] << 24);
 333                        break;
 334                }
 335        }
 336        val <<= k;
 337        val >>= k;
 338        b = nrbits & 7;
 339        p += nrbits >> 3;
 340        *addr = p;
 341        *pos = b;
 342        ubifs_assert(c, (val >> nrbits) == 0 || nrbits - b == 32);
 343        return val;
 344}
 345
 346/**
 347 * ubifs_pack_pnode - pack all the bit fields of a pnode.
 348 * @c: UBIFS file-system description object
 349 * @buf: buffer into which to pack
 350 * @pnode: pnode to pack
 351 */
 352void ubifs_pack_pnode(struct ubifs_info *c, void *buf,
 353                      struct ubifs_pnode *pnode)
 354{
 355        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
 356        int i, pos = 0;
 357        uint16_t crc;
 358
 359        pack_bits(c, &addr, &pos, UBIFS_LPT_PNODE, UBIFS_LPT_TYPE_BITS);
 360        if (c->big_lpt)
 361                pack_bits(c, &addr, &pos, pnode->num, c->pcnt_bits);
 362        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
 363                pack_bits(c, &addr, &pos, pnode->lprops[i].free >> 3,
 364                          c->space_bits);
 365                pack_bits(c, &addr, &pos, pnode->lprops[i].dirty >> 3,
 366                          c->space_bits);
 367                if (pnode->lprops[i].flags & LPROPS_INDEX)
 368                        pack_bits(c, &addr, &pos, 1, 1);
 369                else
 370                        pack_bits(c, &addr, &pos, 0, 1);
 371        }
 372        crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES,
 373                    c->pnode_sz - UBIFS_LPT_CRC_BYTES);
 374        addr = buf;
 375        pos = 0;
 376        pack_bits(c, &addr, &pos, crc, UBIFS_LPT_CRC_BITS);
 377}
 378
 379/**
 380 * ubifs_pack_nnode - pack all the bit fields of a nnode.
 381 * @c: UBIFS file-system description object
 382 * @buf: buffer into which to pack
 383 * @nnode: nnode to pack
 384 */
 385void ubifs_pack_nnode(struct ubifs_info *c, void *buf,
 386                      struct ubifs_nnode *nnode)
 387{
 388        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
 389        int i, pos = 0;
 390        uint16_t crc;
 391
 392        pack_bits(c, &addr, &pos, UBIFS_LPT_NNODE, UBIFS_LPT_TYPE_BITS);
 393        if (c->big_lpt)
 394                pack_bits(c, &addr, &pos, nnode->num, c->pcnt_bits);
 395        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
 396                int lnum = nnode->nbranch[i].lnum;
 397
 398                if (lnum == 0)
 399                        lnum = c->lpt_last + 1;
 400                pack_bits(c, &addr, &pos, lnum - c->lpt_first, c->lpt_lnum_bits);
 401                pack_bits(c, &addr, &pos, nnode->nbranch[i].offs,
 402                          c->lpt_offs_bits);
 403        }
 404        crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES,
 405                    c->nnode_sz - UBIFS_LPT_CRC_BYTES);
 406        addr = buf;
 407        pos = 0;
 408        pack_bits(c, &addr, &pos, crc, UBIFS_LPT_CRC_BITS);
 409}
 410
 411/**
 412 * ubifs_pack_ltab - pack the LPT's own lprops table.
 413 * @c: UBIFS file-system description object
 414 * @buf: buffer into which to pack
 415 * @ltab: LPT's own lprops table to pack
 416 */
 417void ubifs_pack_ltab(struct ubifs_info *c, void *buf,
 418                     struct ubifs_lpt_lprops *ltab)
 419{
 420        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
 421        int i, pos = 0;
 422        uint16_t crc;
 423
 424        pack_bits(c, &addr, &pos, UBIFS_LPT_LTAB, UBIFS_LPT_TYPE_BITS);
 425        for (i = 0; i < c->lpt_lebs; i++) {
 426                pack_bits(c, &addr, &pos, ltab[i].free, c->lpt_spc_bits);
 427                pack_bits(c, &addr, &pos, ltab[i].dirty, c->lpt_spc_bits);
 428        }
 429        crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES,
 430                    c->ltab_sz - UBIFS_LPT_CRC_BYTES);
 431        addr = buf;
 432        pos = 0;
 433        pack_bits(c, &addr, &pos, crc, UBIFS_LPT_CRC_BITS);
 434}
 435
 436/**
 437 * ubifs_pack_lsave - pack the LPT's save table.
 438 * @c: UBIFS file-system description object
 439 * @buf: buffer into which to pack
 440 * @lsave: LPT's save table to pack
 441 */
 442void ubifs_pack_lsave(struct ubifs_info *c, void *buf, int *lsave)
 443{
 444        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
 445        int i, pos = 0;
 446        uint16_t crc;
 447
 448        pack_bits(c, &addr, &pos, UBIFS_LPT_LSAVE, UBIFS_LPT_TYPE_BITS);
 449        for (i = 0; i < c->lsave_cnt; i++)
 450                pack_bits(c, &addr, &pos, lsave[i], c->lnum_bits);
 451        crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES,
 452                    c->lsave_sz - UBIFS_LPT_CRC_BYTES);
 453        addr = buf;
 454        pos = 0;
 455        pack_bits(c, &addr, &pos, crc, UBIFS_LPT_CRC_BITS);
 456}
 457
 458/**
 459 * ubifs_add_lpt_dirt - add dirty space to LPT LEB properties.
 460 * @c: UBIFS file-system description object
 461 * @lnum: LEB number to which to add dirty space
 462 * @dirty: amount of dirty space to add
 463 */
 464void ubifs_add_lpt_dirt(struct ubifs_info *c, int lnum, int dirty)
 465{
 466        if (!dirty || !lnum)
 467                return;
 468        dbg_lp("LEB %d add %d to %d",
 469               lnum, dirty, c->ltab[lnum - c->lpt_first].dirty);
 470        ubifs_assert(c, lnum >= c->lpt_first && lnum <= c->lpt_last);
 471        c->ltab[lnum - c->lpt_first].dirty += dirty;
 472}
 473
 474/**
 475 * set_ltab - set LPT LEB properties.
 476 * @c: UBIFS file-system description object
 477 * @lnum: LEB number
 478 * @free: amount of free space
 479 * @dirty: amount of dirty space
 480 */
 481static void set_ltab(struct ubifs_info *c, int lnum, int free, int dirty)
 482{
 483        dbg_lp("LEB %d free %d dirty %d to %d %d",
 484               lnum, c->ltab[lnum - c->lpt_first].free,
 485               c->ltab[lnum - c->lpt_first].dirty, free, dirty);
 486        ubifs_assert(c, lnum >= c->lpt_first && lnum <= c->lpt_last);
 487        c->ltab[lnum - c->lpt_first].free = free;
 488        c->ltab[lnum - c->lpt_first].dirty = dirty;
 489}
 490
 491/**
 492 * ubifs_add_nnode_dirt - add dirty space to LPT LEB properties.
 493 * @c: UBIFS file-system description object
 494 * @nnode: nnode for which to add dirt
 495 */
 496void ubifs_add_nnode_dirt(struct ubifs_info *c, struct ubifs_nnode *nnode)
 497{
 498        struct ubifs_nnode *np = nnode->parent;
 499
 500        if (np)
 501                ubifs_add_lpt_dirt(c, np->nbranch[nnode->iip].lnum,
 502                                   c->nnode_sz);
 503        else {
 504                ubifs_add_lpt_dirt(c, c->lpt_lnum, c->nnode_sz);
 505                if (!(c->lpt_drty_flgs & LTAB_DIRTY)) {
 506                        c->lpt_drty_flgs |= LTAB_DIRTY;
 507                        ubifs_add_lpt_dirt(c, c->ltab_lnum, c->ltab_sz);
 508                }
 509        }
 510}
 511
 512/**
 513 * add_pnode_dirt - add dirty space to LPT LEB properties.
 514 * @c: UBIFS file-system description object
 515 * @pnode: pnode for which to add dirt
 516 */
 517static void add_pnode_dirt(struct ubifs_info *c, struct ubifs_pnode *pnode)
 518{
 519        ubifs_add_lpt_dirt(c, pnode->parent->nbranch[pnode->iip].lnum,
 520                           c->pnode_sz);
 521}
 522
 523/**
 524 * calc_nnode_num - calculate nnode number.
 525 * @row: the row in the tree (root is zero)
 526 * @col: the column in the row (leftmost is zero)
 527 *
 528 * The nnode number is a number that uniquely identifies a nnode and can be used
 529 * easily to traverse the tree from the root to that nnode.
 530 *
 531 * This function calculates and returns the nnode number for the nnode at @row
 532 * and @col.
 533 */
 534static int calc_nnode_num(int row, int col)
 535{
 536        int num, bits;
 537
 538        num = 1;
 539        while (row--) {
 540                bits = (col & (UBIFS_LPT_FANOUT - 1));
 541                col >>= UBIFS_LPT_FANOUT_SHIFT;
 542                num <<= UBIFS_LPT_FANOUT_SHIFT;
 543                num |= bits;
 544        }
 545        return num;
 546}
 547
 548/**
 549 * calc_nnode_num_from_parent - calculate nnode number.
 550 * @c: UBIFS file-system description object
 551 * @parent: parent nnode
 552 * @iip: index in parent
 553 *
 554 * The nnode number is a number that uniquely identifies a nnode and can be used
 555 * easily to traverse the tree from the root to that nnode.
 556 *
 557 * This function calculates and returns the nnode number based on the parent's
 558 * nnode number and the index in parent.
 559 */
 560static int calc_nnode_num_from_parent(const struct ubifs_info *c,
 561                                      struct ubifs_nnode *parent, int iip)
 562{
 563        int num, shft;
 564
 565        if (!parent)
 566                return 1;
 567        shft = (c->lpt_hght - parent->level) * UBIFS_LPT_FANOUT_SHIFT;
 568        num = parent->num ^ (1 << shft);
 569        num |= (UBIFS_LPT_FANOUT + iip) << shft;
 570        return num;
 571}
 572
 573/**
 574 * calc_pnode_num_from_parent - calculate pnode number.
 575 * @c: UBIFS file-system description object
 576 * @parent: parent nnode
 577 * @iip: index in parent
 578 *
 579 * The pnode number is a number that uniquely identifies a pnode and can be used
 580 * easily to traverse the tree from the root to that pnode.
 581 *
 582 * This function calculates and returns the pnode number based on the parent's
 583 * nnode number and the index in parent.
 584 */
 585static int calc_pnode_num_from_parent(const struct ubifs_info *c,
 586                                      struct ubifs_nnode *parent, int iip)
 587{
 588        int i, n = c->lpt_hght - 1, pnum = parent->num, num = 0;
 589
 590        for (i = 0; i < n; i++) {
 591                num <<= UBIFS_LPT_FANOUT_SHIFT;
 592                num |= pnum & (UBIFS_LPT_FANOUT - 1);
 593                pnum >>= UBIFS_LPT_FANOUT_SHIFT;
 594        }
 595        num <<= UBIFS_LPT_FANOUT_SHIFT;
 596        num |= iip;
 597        return num;
 598}
 599
 600/**
 601 * ubifs_create_dflt_lpt - create default LPT.
 602 * @c: UBIFS file-system description object
 603 * @main_lebs: number of main area LEBs is passed and returned here
 604 * @lpt_first: LEB number of first LPT LEB
 605 * @lpt_lebs: number of LEBs for LPT is passed and returned here
 606 * @big_lpt: use big LPT model is passed and returned here
 607 * @hash: hash of the LPT is returned here
 608 *
 609 * This function returns %0 on success and a negative error code on failure.
 610 */
 611int ubifs_create_dflt_lpt(struct ubifs_info *c, int *main_lebs, int lpt_first,
 612                          int *lpt_lebs, int *big_lpt, u8 *hash)
 613{
 614        int lnum, err = 0, node_sz, iopos, i, j, cnt, len, alen, row;
 615        int blnum, boffs, bsz, bcnt;
 616        struct ubifs_pnode *pnode = NULL;
 617        struct ubifs_nnode *nnode = NULL;
 618        void *buf = NULL, *p;
 619        struct ubifs_lpt_lprops *ltab = NULL;
 620        int *lsave = NULL;
 621        struct shash_desc *desc;
 622
 623        err = calc_dflt_lpt_geom(c, main_lebs, big_lpt);
 624        if (err)
 625                return err;
 626        *lpt_lebs = c->lpt_lebs;
 627
 628        /* Needed by 'ubifs_pack_nnode()' and 'set_ltab()' */
 629        c->lpt_first = lpt_first;
 630        /* Needed by 'set_ltab()' */
 631        c->lpt_last = lpt_first + c->lpt_lebs - 1;
 632        /* Needed by 'ubifs_pack_lsave()' */
 633        c->main_first = c->leb_cnt - *main_lebs;
 634
 635        desc = ubifs_hash_get_desc(c);
 636        if (IS_ERR(desc))
 637                return PTR_ERR(desc);
 638
 639        lsave = kmalloc_array(c->lsave_cnt, sizeof(int), GFP_KERNEL);
 640        pnode = kzalloc(sizeof(struct ubifs_pnode), GFP_KERNEL);
 641        nnode = kzalloc(sizeof(struct ubifs_nnode), GFP_KERNEL);
 642        buf = vmalloc(c->leb_size);
 643        ltab = vmalloc(array_size(sizeof(struct ubifs_lpt_lprops),
 644                                  c->lpt_lebs));
 645        if (!pnode || !nnode || !buf || !ltab || !lsave) {
 646                err = -ENOMEM;
 647                goto out;
 648        }
 649
 650        ubifs_assert(c, !c->ltab);
 651        c->ltab = ltab; /* Needed by set_ltab */
 652
 653        /* Initialize LPT's own lprops */
 654        for (i = 0; i < c->lpt_lebs; i++) {
 655                ltab[i].free = c->leb_size;
 656                ltab[i].dirty = 0;
 657                ltab[i].tgc = 0;
 658                ltab[i].cmt = 0;
 659        }
 660
 661        lnum = lpt_first;
 662        p = buf;
 663        /* Number of leaf nodes (pnodes) */
 664        cnt = c->pnode_cnt;
 665
 666        /*
 667         * The first pnode contains the LEB properties for the LEBs that contain
 668         * the root inode node and the root index node of the index tree.
 669         */
 670        node_sz = ALIGN(ubifs_idx_node_sz(c, 1), 8);
 671        iopos = ALIGN(node_sz, c->min_io_size);
 672        pnode->lprops[0].free = c->leb_size - iopos;
 673        pnode->lprops[0].dirty = iopos - node_sz;
 674        pnode->lprops[0].flags = LPROPS_INDEX;
 675
 676        node_sz = UBIFS_INO_NODE_SZ;
 677        iopos = ALIGN(node_sz, c->min_io_size);
 678        pnode->lprops[1].free = c->leb_size - iopos;
 679        pnode->lprops[1].dirty = iopos - node_sz;
 680
 681        for (i = 2; i < UBIFS_LPT_FANOUT; i++)
 682                pnode->lprops[i].free = c->leb_size;
 683
 684        /* Add first pnode */
 685        ubifs_pack_pnode(c, p, pnode);
 686        err = ubifs_shash_update(c, desc, p, c->pnode_sz);
 687        if (err)
 688                goto out;
 689
 690        p += c->pnode_sz;
 691        len = c->pnode_sz;
 692        pnode->num += 1;
 693
 694        /* Reset pnode values for remaining pnodes */
 695        pnode->lprops[0].free = c->leb_size;
 696        pnode->lprops[0].dirty = 0;
 697        pnode->lprops[0].flags = 0;
 698
 699        pnode->lprops[1].free = c->leb_size;
 700        pnode->lprops[1].dirty = 0;
 701
 702        /*
 703         * To calculate the internal node branches, we keep information about
 704         * the level below.
 705         */
 706        blnum = lnum; /* LEB number of level below */
 707        boffs = 0; /* Offset of level below */
 708        bcnt = cnt; /* Number of nodes in level below */
 709        bsz = c->pnode_sz; /* Size of nodes in level below */
 710
 711        /* Add all remaining pnodes */
 712        for (i = 1; i < cnt; i++) {
 713                if (len + c->pnode_sz > c->leb_size) {
 714                        alen = ALIGN(len, c->min_io_size);
 715                        set_ltab(c, lnum, c->leb_size - alen, alen - len);
 716                        memset(p, 0xff, alen - len);
 717                        err = ubifs_leb_change(c, lnum++, buf, alen);
 718                        if (err)
 719                                goto out;
 720                        p = buf;
 721                        len = 0;
 722                }
 723                ubifs_pack_pnode(c, p, pnode);
 724                err = ubifs_shash_update(c, desc, p, c->pnode_sz);
 725                if (err)
 726                        goto out;
 727
 728                p += c->pnode_sz;
 729                len += c->pnode_sz;
 730                /*
 731                 * pnodes are simply numbered left to right starting at zero,
 732                 * which means the pnode number can be used easily to traverse
 733                 * down the tree to the corresponding pnode.
 734                 */
 735                pnode->num += 1;
 736        }
 737
 738        row = 0;
 739        for (i = UBIFS_LPT_FANOUT; cnt > i; i <<= UBIFS_LPT_FANOUT_SHIFT)
 740                row += 1;
 741        /* Add all nnodes, one level at a time */
 742        while (1) {
 743                /* Number of internal nodes (nnodes) at next level */
 744                cnt = DIV_ROUND_UP(cnt, UBIFS_LPT_FANOUT);
 745                for (i = 0; i < cnt; i++) {
 746                        if (len + c->nnode_sz > c->leb_size) {
 747                                alen = ALIGN(len, c->min_io_size);
 748                                set_ltab(c, lnum, c->leb_size - alen,
 749                                            alen - len);
 750                                memset(p, 0xff, alen - len);
 751                                err = ubifs_leb_change(c, lnum++, buf, alen);
 752                                if (err)
 753                                        goto out;
 754                                p = buf;
 755                                len = 0;
 756                        }
 757                        /* Only 1 nnode at this level, so it is the root */
 758                        if (cnt == 1) {
 759                                c->lpt_lnum = lnum;
 760                                c->lpt_offs = len;
 761                        }
 762                        /* Set branches to the level below */
 763                        for (j = 0; j < UBIFS_LPT_FANOUT; j++) {
 764                                if (bcnt) {
 765                                        if (boffs + bsz > c->leb_size) {
 766                                                blnum += 1;
 767                                                boffs = 0;
 768                                        }
 769                                        nnode->nbranch[j].lnum = blnum;
 770                                        nnode->nbranch[j].offs = boffs;
 771                                        boffs += bsz;
 772                                        bcnt--;
 773                                } else {
 774                                        nnode->nbranch[j].lnum = 0;
 775                                        nnode->nbranch[j].offs = 0;
 776                                }
 777                        }
 778                        nnode->num = calc_nnode_num(row, i);
 779                        ubifs_pack_nnode(c, p, nnode);
 780                        p += c->nnode_sz;
 781                        len += c->nnode_sz;
 782                }
 783                /* Only 1 nnode at this level, so it is the root */
 784                if (cnt == 1)
 785                        break;
 786                /* Update the information about the level below */
 787                bcnt = cnt;
 788                bsz = c->nnode_sz;
 789                row -= 1;
 790        }
 791
 792        if (*big_lpt) {
 793                /* Need to add LPT's save table */
 794                if (len + c->lsave_sz > c->leb_size) {
 795                        alen = ALIGN(len, c->min_io_size);
 796                        set_ltab(c, lnum, c->leb_size - alen, alen - len);
 797                        memset(p, 0xff, alen - len);
 798                        err = ubifs_leb_change(c, lnum++, buf, alen);
 799                        if (err)
 800                                goto out;
 801                        p = buf;
 802                        len = 0;
 803                }
 804
 805                c->lsave_lnum = lnum;
 806                c->lsave_offs = len;
 807
 808                for (i = 0; i < c->lsave_cnt && i < *main_lebs; i++)
 809                        lsave[i] = c->main_first + i;
 810                for (; i < c->lsave_cnt; i++)
 811                        lsave[i] = c->main_first;
 812
 813                ubifs_pack_lsave(c, p, lsave);
 814                p += c->lsave_sz;
 815                len += c->lsave_sz;
 816        }
 817
 818        /* Need to add LPT's own LEB properties table */
 819        if (len + c->ltab_sz > c->leb_size) {
 820                alen = ALIGN(len, c->min_io_size);
 821                set_ltab(c, lnum, c->leb_size - alen, alen - len);
 822                memset(p, 0xff, alen - len);
 823                err = ubifs_leb_change(c, lnum++, buf, alen);
 824                if (err)
 825                        goto out;
 826                p = buf;
 827                len = 0;
 828        }
 829
 830        c->ltab_lnum = lnum;
 831        c->ltab_offs = len;
 832
 833        /* Update ltab before packing it */
 834        len += c->ltab_sz;
 835        alen = ALIGN(len, c->min_io_size);
 836        set_ltab(c, lnum, c->leb_size - alen, alen - len);
 837
 838        ubifs_pack_ltab(c, p, ltab);
 839        p += c->ltab_sz;
 840
 841        /* Write remaining buffer */
 842        memset(p, 0xff, alen - len);
 843        err = ubifs_leb_change(c, lnum, buf, alen);
 844        if (err)
 845                goto out;
 846
 847        err = ubifs_shash_final(c, desc, hash);
 848        if (err)
 849                goto out;
 850
 851        c->nhead_lnum = lnum;
 852        c->nhead_offs = ALIGN(len, c->min_io_size);
 853
 854        dbg_lp("space_bits %d", c->space_bits);
 855        dbg_lp("lpt_lnum_bits %d", c->lpt_lnum_bits);
 856        dbg_lp("lpt_offs_bits %d", c->lpt_offs_bits);
 857        dbg_lp("lpt_spc_bits %d", c->lpt_spc_bits);
 858        dbg_lp("pcnt_bits %d", c->pcnt_bits);
 859        dbg_lp("lnum_bits %d", c->lnum_bits);
 860        dbg_lp("pnode_sz %d", c->pnode_sz);
 861        dbg_lp("nnode_sz %d", c->nnode_sz);
 862        dbg_lp("ltab_sz %d", c->ltab_sz);
 863        dbg_lp("lsave_sz %d", c->lsave_sz);
 864        dbg_lp("lsave_cnt %d", c->lsave_cnt);
 865        dbg_lp("lpt_hght %d", c->lpt_hght);
 866        dbg_lp("big_lpt %d", c->big_lpt);
 867        dbg_lp("LPT root is at %d:%d", c->lpt_lnum, c->lpt_offs);
 868        dbg_lp("LPT head is at %d:%d", c->nhead_lnum, c->nhead_offs);
 869        dbg_lp("LPT ltab is at %d:%d", c->ltab_lnum, c->ltab_offs);
 870        if (c->big_lpt)
 871                dbg_lp("LPT lsave is at %d:%d", c->lsave_lnum, c->lsave_offs);
 872out:
 873        c->ltab = NULL;
 874        kfree(desc);
 875        kfree(lsave);
 876        vfree(ltab);
 877        vfree(buf);
 878        kfree(nnode);
 879        kfree(pnode);
 880        return err;
 881}
 882
 883/**
 884 * update_cats - add LEB properties of a pnode to LEB category lists and heaps.
 885 * @c: UBIFS file-system description object
 886 * @pnode: pnode
 887 *
 888 * When a pnode is loaded into memory, the LEB properties it contains are added,
 889 * by this function, to the LEB category lists and heaps.
 890 */
 891static void update_cats(struct ubifs_info *c, struct ubifs_pnode *pnode)
 892{
 893        int i;
 894
 895        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
 896                int cat = pnode->lprops[i].flags & LPROPS_CAT_MASK;
 897                int lnum = pnode->lprops[i].lnum;
 898
 899                if (!lnum)
 900                        return;
 901                ubifs_add_to_cat(c, &pnode->lprops[i], cat);
 902        }
 903}
 904
 905/**
 906 * replace_cats - add LEB properties of a pnode to LEB category lists and heaps.
 907 * @c: UBIFS file-system description object
 908 * @old_pnode: pnode copied
 909 * @new_pnode: pnode copy
 910 *
 911 * During commit it is sometimes necessary to copy a pnode
 912 * (see dirty_cow_pnode).  When that happens, references in
 913 * category lists and heaps must be replaced.  This function does that.
 914 */
 915static void replace_cats(struct ubifs_info *c, struct ubifs_pnode *old_pnode,
 916                         struct ubifs_pnode *new_pnode)
 917{
 918        int i;
 919
 920        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
 921                if (!new_pnode->lprops[i].lnum)
 922                        return;
 923                ubifs_replace_cat(c, &old_pnode->lprops[i],
 924                                  &new_pnode->lprops[i]);
 925        }
 926}
 927
 928/**
 929 * check_lpt_crc - check LPT node crc is correct.
 930 * @c: UBIFS file-system description object
 931 * @buf: buffer containing node
 932 * @len: length of node
 933 *
 934 * This function returns %0 on success and a negative error code on failure.
 935 */
 936static int check_lpt_crc(const struct ubifs_info *c, void *buf, int len)
 937{
 938        int pos = 0;
 939        uint8_t *addr = buf;
 940        uint16_t crc, calc_crc;
 941
 942        crc = ubifs_unpack_bits(c, &addr, &pos, UBIFS_LPT_CRC_BITS);
 943        calc_crc = crc16(-1, buf + UBIFS_LPT_CRC_BYTES,
 944                         len - UBIFS_LPT_CRC_BYTES);
 945        if (crc != calc_crc) {
 946                ubifs_err(c, "invalid crc in LPT node: crc %hx calc %hx",
 947                          crc, calc_crc);
 948                dump_stack();
 949                return -EINVAL;
 950        }
 951        return 0;
 952}
 953
 954/**
 955 * check_lpt_type - check LPT node type is correct.
 956 * @c: UBIFS file-system description object
 957 * @addr: address of type bit field is passed and returned updated here
 958 * @pos: position of type bit field is passed and returned updated here
 959 * @type: expected type
 960 *
 961 * This function returns %0 on success and a negative error code on failure.
 962 */
 963static int check_lpt_type(const struct ubifs_info *c, uint8_t **addr,
 964                          int *pos, int type)
 965{
 966        int node_type;
 967
 968        node_type = ubifs_unpack_bits(c, addr, pos, UBIFS_LPT_TYPE_BITS);
 969        if (node_type != type) {
 970                ubifs_err(c, "invalid type (%d) in LPT node type %d",
 971                          node_type, type);
 972                dump_stack();
 973                return -EINVAL;
 974        }
 975        return 0;
 976}
 977
 978/**
 979 * unpack_pnode - unpack a pnode.
 980 * @c: UBIFS file-system description object
 981 * @buf: buffer containing packed pnode to unpack
 982 * @pnode: pnode structure to fill
 983 *
 984 * This function returns %0 on success and a negative error code on failure.
 985 */
 986static int unpack_pnode(const struct ubifs_info *c, void *buf,
 987                        struct ubifs_pnode *pnode)
 988{
 989        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
 990        int i, pos = 0, err;
 991
 992        err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_PNODE);
 993        if (err)
 994                return err;
 995        if (c->big_lpt)
 996                pnode->num = ubifs_unpack_bits(c, &addr, &pos, c->pcnt_bits);
 997        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
 998                struct ubifs_lprops * const lprops = &pnode->lprops[i];
 999
1000                lprops->free = ubifs_unpack_bits(c, &addr, &pos, c->space_bits);
1001                lprops->free <<= 3;
1002                lprops->dirty = ubifs_unpack_bits(c, &addr, &pos, c->space_bits);
1003                lprops->dirty <<= 3;
1004
1005                if (ubifs_unpack_bits(c, &addr, &pos, 1))
1006                        lprops->flags = LPROPS_INDEX;
1007                else
1008                        lprops->flags = 0;
1009                lprops->flags |= ubifs_categorize_lprops(c, lprops);
1010        }
1011        err = check_lpt_crc(c, buf, c->pnode_sz);
1012        return err;
1013}
1014
1015/**
1016 * ubifs_unpack_nnode - unpack a nnode.
1017 * @c: UBIFS file-system description object
1018 * @buf: buffer containing packed nnode to unpack
1019 * @nnode: nnode structure to fill
1020 *
1021 * This function returns %0 on success and a negative error code on failure.
1022 */
1023int ubifs_unpack_nnode(const struct ubifs_info *c, void *buf,
1024                       struct ubifs_nnode *nnode)
1025{
1026        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
1027        int i, pos = 0, err;
1028
1029        err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_NNODE);
1030        if (err)
1031                return err;
1032        if (c->big_lpt)
1033                nnode->num = ubifs_unpack_bits(c, &addr, &pos, c->pcnt_bits);
1034        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1035                int lnum;
1036
1037                lnum = ubifs_unpack_bits(c, &addr, &pos, c->lpt_lnum_bits) +
1038                       c->lpt_first;
1039                if (lnum == c->lpt_last + 1)
1040                        lnum = 0;
1041                nnode->nbranch[i].lnum = lnum;
1042                nnode->nbranch[i].offs = ubifs_unpack_bits(c, &addr, &pos,
1043                                                     c->lpt_offs_bits);
1044        }
1045        err = check_lpt_crc(c, buf, c->nnode_sz);
1046        return err;
1047}
1048
1049/**
1050 * unpack_ltab - unpack the LPT's own lprops table.
1051 * @c: UBIFS file-system description object
1052 * @buf: buffer from which to unpack
1053 *
1054 * This function returns %0 on success and a negative error code on failure.
1055 */
1056static int unpack_ltab(const struct ubifs_info *c, void *buf)
1057{
1058        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
1059        int i, pos = 0, err;
1060
1061        err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_LTAB);
1062        if (err)
1063                return err;
1064        for (i = 0; i < c->lpt_lebs; i++) {
1065                int free = ubifs_unpack_bits(c, &addr, &pos, c->lpt_spc_bits);
1066                int dirty = ubifs_unpack_bits(c, &addr, &pos, c->lpt_spc_bits);
1067
1068                if (free < 0 || free > c->leb_size || dirty < 0 ||
1069                    dirty > c->leb_size || free + dirty > c->leb_size)
1070                        return -EINVAL;
1071
1072                c->ltab[i].free = free;
1073                c->ltab[i].dirty = dirty;
1074                c->ltab[i].tgc = 0;
1075                c->ltab[i].cmt = 0;
1076        }
1077        err = check_lpt_crc(c, buf, c->ltab_sz);
1078        return err;
1079}
1080
1081/**
1082 * unpack_lsave - unpack the LPT's save table.
1083 * @c: UBIFS file-system description object
1084 * @buf: buffer from which to unpack
1085 *
1086 * This function returns %0 on success and a negative error code on failure.
1087 */
1088static int unpack_lsave(const struct ubifs_info *c, void *buf)
1089{
1090        uint8_t *addr = buf + UBIFS_LPT_CRC_BYTES;
1091        int i, pos = 0, err;
1092
1093        err = check_lpt_type(c, &addr, &pos, UBIFS_LPT_LSAVE);
1094        if (err)
1095                return err;
1096        for (i = 0; i < c->lsave_cnt; i++) {
1097                int lnum = ubifs_unpack_bits(c, &addr, &pos, c->lnum_bits);
1098
1099                if (lnum < c->main_first || lnum >= c->leb_cnt)
1100                        return -EINVAL;
1101                c->lsave[i] = lnum;
1102        }
1103        err = check_lpt_crc(c, buf, c->lsave_sz);
1104        return err;
1105}
1106
1107/**
1108 * validate_nnode - validate a nnode.
1109 * @c: UBIFS file-system description object
1110 * @nnode: nnode to validate
1111 * @parent: parent nnode (or NULL for the root nnode)
1112 * @iip: index in parent
1113 *
1114 * This function returns %0 on success and a negative error code on failure.
1115 */
1116static int validate_nnode(const struct ubifs_info *c, struct ubifs_nnode *nnode,
1117                          struct ubifs_nnode *parent, int iip)
1118{
1119        int i, lvl, max_offs;
1120
1121        if (c->big_lpt) {
1122                int num = calc_nnode_num_from_parent(c, parent, iip);
1123
1124                if (nnode->num != num)
1125                        return -EINVAL;
1126        }
1127        lvl = parent ? parent->level - 1 : c->lpt_hght;
1128        if (lvl < 1)
1129                return -EINVAL;
1130        if (lvl == 1)
1131                max_offs = c->leb_size - c->pnode_sz;
1132        else
1133                max_offs = c->leb_size - c->nnode_sz;
1134        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1135                int lnum = nnode->nbranch[i].lnum;
1136                int offs = nnode->nbranch[i].offs;
1137
1138                if (lnum == 0) {
1139                        if (offs != 0)
1140                                return -EINVAL;
1141                        continue;
1142                }
1143                if (lnum < c->lpt_first || lnum > c->lpt_last)
1144                        return -EINVAL;
1145                if (offs < 0 || offs > max_offs)
1146                        return -EINVAL;
1147        }
1148        return 0;
1149}
1150
1151/**
1152 * validate_pnode - validate a pnode.
1153 * @c: UBIFS file-system description object
1154 * @pnode: pnode to validate
1155 * @parent: parent nnode
1156 * @iip: index in parent
1157 *
1158 * This function returns %0 on success and a negative error code on failure.
1159 */
1160static int validate_pnode(const struct ubifs_info *c, struct ubifs_pnode *pnode,
1161                          struct ubifs_nnode *parent, int iip)
1162{
1163        int i;
1164
1165        if (c->big_lpt) {
1166                int num = calc_pnode_num_from_parent(c, parent, iip);
1167
1168                if (pnode->num != num)
1169                        return -EINVAL;
1170        }
1171        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1172                int free = pnode->lprops[i].free;
1173                int dirty = pnode->lprops[i].dirty;
1174
1175                if (free < 0 || free > c->leb_size || free % c->min_io_size ||
1176                    (free & 7))
1177                        return -EINVAL;
1178                if (dirty < 0 || dirty > c->leb_size || (dirty & 7))
1179                        return -EINVAL;
1180                if (dirty + free > c->leb_size)
1181                        return -EINVAL;
1182        }
1183        return 0;
1184}
1185
1186/**
1187 * set_pnode_lnum - set LEB numbers on a pnode.
1188 * @c: UBIFS file-system description object
1189 * @pnode: pnode to update
1190 *
1191 * This function calculates the LEB numbers for the LEB properties it contains
1192 * based on the pnode number.
1193 */
1194static void set_pnode_lnum(const struct ubifs_info *c,
1195                           struct ubifs_pnode *pnode)
1196{
1197        int i, lnum;
1198
1199        lnum = (pnode->num << UBIFS_LPT_FANOUT_SHIFT) + c->main_first;
1200        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1201                if (lnum >= c->leb_cnt)
1202                        return;
1203                pnode->lprops[i].lnum = lnum++;
1204        }
1205}
1206
1207/**
1208 * ubifs_read_nnode - read a nnode from flash and link it to the tree in memory.
1209 * @c: UBIFS file-system description object
1210 * @parent: parent nnode (or NULL for the root)
1211 * @iip: index in parent
1212 *
1213 * This function returns %0 on success and a negative error code on failure.
1214 */
1215int ubifs_read_nnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)
1216{
1217        struct ubifs_nbranch *branch = NULL;
1218        struct ubifs_nnode *nnode = NULL;
1219        void *buf = c->lpt_nod_buf;
1220        int err, lnum, offs;
1221
1222        if (parent) {
1223                branch = &parent->nbranch[iip];
1224                lnum = branch->lnum;
1225                offs = branch->offs;
1226        } else {
1227                lnum = c->lpt_lnum;
1228                offs = c->lpt_offs;
1229        }
1230        nnode = kzalloc(sizeof(struct ubifs_nnode), GFP_NOFS);
1231        if (!nnode) {
1232                err = -ENOMEM;
1233                goto out;
1234        }
1235        if (lnum == 0) {
1236                /*
1237                 * This nnode was not written which just means that the LEB
1238                 * properties in the subtree below it describe empty LEBs. We
1239                 * make the nnode as though we had read it, which in fact means
1240                 * doing almost nothing.
1241                 */
1242                if (c->big_lpt)
1243                        nnode->num = calc_nnode_num_from_parent(c, parent, iip);
1244        } else {
1245                err = ubifs_leb_read(c, lnum, buf, offs, c->nnode_sz, 1);
1246                if (err)
1247                        goto out;
1248                err = ubifs_unpack_nnode(c, buf, nnode);
1249                if (err)
1250                        goto out;
1251        }
1252        err = validate_nnode(c, nnode, parent, iip);
1253        if (err)
1254                goto out;
1255        if (!c->big_lpt)
1256                nnode->num = calc_nnode_num_from_parent(c, parent, iip);
1257        if (parent) {
1258                branch->nnode = nnode;
1259                nnode->level = parent->level - 1;
1260        } else {
1261                c->nroot = nnode;
1262                nnode->level = c->lpt_hght;
1263        }
1264        nnode->parent = parent;
1265        nnode->iip = iip;
1266        return 0;
1267
1268out:
1269        ubifs_err(c, "error %d reading nnode at %d:%d", err, lnum, offs);
1270        dump_stack();
1271        kfree(nnode);
1272        return err;
1273}
1274
1275/**
1276 * read_pnode - read a pnode from flash and link it to the tree in memory.
1277 * @c: UBIFS file-system description object
1278 * @parent: parent nnode
1279 * @iip: index in parent
1280 *
1281 * This function returns %0 on success and a negative error code on failure.
1282 */
1283static int read_pnode(struct ubifs_info *c, struct ubifs_nnode *parent, int iip)
1284{
1285        struct ubifs_nbranch *branch;
1286        struct ubifs_pnode *pnode = NULL;
1287        void *buf = c->lpt_nod_buf;
1288        int err, lnum, offs;
1289
1290        branch = &parent->nbranch[iip];
1291        lnum = branch->lnum;
1292        offs = branch->offs;
1293        pnode = kzalloc(sizeof(struct ubifs_pnode), GFP_NOFS);
1294        if (!pnode)
1295                return -ENOMEM;
1296
1297        if (lnum == 0) {
1298                /*
1299                 * This pnode was not written which just means that the LEB
1300                 * properties in it describe empty LEBs. We make the pnode as
1301                 * though we had read it.
1302                 */
1303                int i;
1304
1305                if (c->big_lpt)
1306                        pnode->num = calc_pnode_num_from_parent(c, parent, iip);
1307                for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1308                        struct ubifs_lprops * const lprops = &pnode->lprops[i];
1309
1310                        lprops->free = c->leb_size;
1311                        lprops->flags = ubifs_categorize_lprops(c, lprops);
1312                }
1313        } else {
1314                err = ubifs_leb_read(c, lnum, buf, offs, c->pnode_sz, 1);
1315                if (err)
1316                        goto out;
1317                err = unpack_pnode(c, buf, pnode);
1318                if (err)
1319                        goto out;
1320        }
1321        err = validate_pnode(c, pnode, parent, iip);
1322        if (err)
1323                goto out;
1324        if (!c->big_lpt)
1325                pnode->num = calc_pnode_num_from_parent(c, parent, iip);
1326        branch->pnode = pnode;
1327        pnode->parent = parent;
1328        pnode->iip = iip;
1329        set_pnode_lnum(c, pnode);
1330        c->pnodes_have += 1;
1331        return 0;
1332
1333out:
1334        ubifs_err(c, "error %d reading pnode at %d:%d", err, lnum, offs);
1335        ubifs_dump_pnode(c, pnode, parent, iip);
1336        dump_stack();
1337        ubifs_err(c, "calc num: %d", calc_pnode_num_from_parent(c, parent, iip));
1338        kfree(pnode);
1339        return err;
1340}
1341
1342/**
1343 * read_ltab - read LPT's own lprops table.
1344 * @c: UBIFS file-system description object
1345 *
1346 * This function returns %0 on success and a negative error code on failure.
1347 */
1348static int read_ltab(struct ubifs_info *c)
1349{
1350        int err;
1351        void *buf;
1352
1353        buf = vmalloc(c->ltab_sz);
1354        if (!buf)
1355                return -ENOMEM;
1356        err = ubifs_leb_read(c, c->ltab_lnum, buf, c->ltab_offs, c->ltab_sz, 1);
1357        if (err)
1358                goto out;
1359        err = unpack_ltab(c, buf);
1360out:
1361        vfree(buf);
1362        return err;
1363}
1364
1365/**
1366 * read_lsave - read LPT's save table.
1367 * @c: UBIFS file-system description object
1368 *
1369 * This function returns %0 on success and a negative error code on failure.
1370 */
1371static int read_lsave(struct ubifs_info *c)
1372{
1373        int err, i;
1374        void *buf;
1375
1376        buf = vmalloc(c->lsave_sz);
1377        if (!buf)
1378                return -ENOMEM;
1379        err = ubifs_leb_read(c, c->lsave_lnum, buf, c->lsave_offs,
1380                             c->lsave_sz, 1);
1381        if (err)
1382                goto out;
1383        err = unpack_lsave(c, buf);
1384        if (err)
1385                goto out;
1386        for (i = 0; i < c->lsave_cnt; i++) {
1387                int lnum = c->lsave[i];
1388                struct ubifs_lprops *lprops;
1389
1390                /*
1391                 * Due to automatic resizing, the values in the lsave table
1392                 * could be beyond the volume size - just ignore them.
1393                 */
1394                if (lnum >= c->leb_cnt)
1395                        continue;
1396                lprops = ubifs_lpt_lookup(c, lnum);
1397                if (IS_ERR(lprops)) {
1398                        err = PTR_ERR(lprops);
1399                        goto out;
1400                }
1401        }
1402out:
1403        vfree(buf);
1404        return err;
1405}
1406
1407/**
1408 * ubifs_get_nnode - get a nnode.
1409 * @c: UBIFS file-system description object
1410 * @parent: parent nnode (or NULL for the root)
1411 * @iip: index in parent
1412 *
1413 * This function returns a pointer to the nnode on success or a negative error
1414 * code on failure.
1415 */
1416struct ubifs_nnode *ubifs_get_nnode(struct ubifs_info *c,
1417                                    struct ubifs_nnode *parent, int iip)
1418{
1419        struct ubifs_nbranch *branch;
1420        struct ubifs_nnode *nnode;
1421        int err;
1422
1423        branch = &parent->nbranch[iip];
1424        nnode = branch->nnode;
1425        if (nnode)
1426                return nnode;
1427        err = ubifs_read_nnode(c, parent, iip);
1428        if (err)
1429                return ERR_PTR(err);
1430        return branch->nnode;
1431}
1432
1433/**
1434 * ubifs_get_pnode - get a pnode.
1435 * @c: UBIFS file-system description object
1436 * @parent: parent nnode
1437 * @iip: index in parent
1438 *
1439 * This function returns a pointer to the pnode on success or a negative error
1440 * code on failure.
1441 */
1442struct ubifs_pnode *ubifs_get_pnode(struct ubifs_info *c,
1443                                    struct ubifs_nnode *parent, int iip)
1444{
1445        struct ubifs_nbranch *branch;
1446        struct ubifs_pnode *pnode;
1447        int err;
1448
1449        branch = &parent->nbranch[iip];
1450        pnode = branch->pnode;
1451        if (pnode)
1452                return pnode;
1453        err = read_pnode(c, parent, iip);
1454        if (err)
1455                return ERR_PTR(err);
1456        update_cats(c, branch->pnode);
1457        return branch->pnode;
1458}
1459
1460/**
1461 * ubifs_pnode_lookup - lookup a pnode in the LPT.
1462 * @c: UBIFS file-system description object
1463 * @i: pnode number (0 to (main_lebs - 1) / UBIFS_LPT_FANOUT)
1464 *
1465 * This function returns a pointer to the pnode on success or a negative
1466 * error code on failure.
1467 */
1468struct ubifs_pnode *ubifs_pnode_lookup(struct ubifs_info *c, int i)
1469{
1470        int err, h, iip, shft;
1471        struct ubifs_nnode *nnode;
1472
1473        if (!c->nroot) {
1474                err = ubifs_read_nnode(c, NULL, 0);
1475                if (err)
1476                        return ERR_PTR(err);
1477        }
1478        i <<= UBIFS_LPT_FANOUT_SHIFT;
1479        nnode = c->nroot;
1480        shft = c->lpt_hght * UBIFS_LPT_FANOUT_SHIFT;
1481        for (h = 1; h < c->lpt_hght; h++) {
1482                iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
1483                shft -= UBIFS_LPT_FANOUT_SHIFT;
1484                nnode = ubifs_get_nnode(c, nnode, iip);
1485                if (IS_ERR(nnode))
1486                        return ERR_CAST(nnode);
1487        }
1488        iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
1489        return ubifs_get_pnode(c, nnode, iip);
1490}
1491
1492/**
1493 * ubifs_lpt_lookup - lookup LEB properties in the LPT.
1494 * @c: UBIFS file-system description object
1495 * @lnum: LEB number to lookup
1496 *
1497 * This function returns a pointer to the LEB properties on success or a
1498 * negative error code on failure.
1499 */
1500struct ubifs_lprops *ubifs_lpt_lookup(struct ubifs_info *c, int lnum)
1501{
1502        int i, iip;
1503        struct ubifs_pnode *pnode;
1504
1505        i = lnum - c->main_first;
1506        pnode = ubifs_pnode_lookup(c, i >> UBIFS_LPT_FANOUT_SHIFT);
1507        if (IS_ERR(pnode))
1508                return ERR_CAST(pnode);
1509        iip = (i & (UBIFS_LPT_FANOUT - 1));
1510        dbg_lp("LEB %d, free %d, dirty %d, flags %d", lnum,
1511               pnode->lprops[iip].free, pnode->lprops[iip].dirty,
1512               pnode->lprops[iip].flags);
1513        return &pnode->lprops[iip];
1514}
1515
1516/**
1517 * dirty_cow_nnode - ensure a nnode is not being committed.
1518 * @c: UBIFS file-system description object
1519 * @nnode: nnode to check
1520 *
1521 * Returns dirtied nnode on success or negative error code on failure.
1522 */
1523static struct ubifs_nnode *dirty_cow_nnode(struct ubifs_info *c,
1524                                           struct ubifs_nnode *nnode)
1525{
1526        struct ubifs_nnode *n;
1527        int i;
1528
1529        if (!test_bit(COW_CNODE, &nnode->flags)) {
1530                /* nnode is not being committed */
1531                if (!test_and_set_bit(DIRTY_CNODE, &nnode->flags)) {
1532                        c->dirty_nn_cnt += 1;
1533                        ubifs_add_nnode_dirt(c, nnode);
1534                }
1535                return nnode;
1536        }
1537
1538        /* nnode is being committed, so copy it */
1539        n = kmemdup(nnode, sizeof(struct ubifs_nnode), GFP_NOFS);
1540        if (unlikely(!n))
1541                return ERR_PTR(-ENOMEM);
1542
1543        n->cnext = NULL;
1544        __set_bit(DIRTY_CNODE, &n->flags);
1545        __clear_bit(COW_CNODE, &n->flags);
1546
1547        /* The children now have new parent */
1548        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1549                struct ubifs_nbranch *branch = &n->nbranch[i];
1550
1551                if (branch->cnode)
1552                        branch->cnode->parent = n;
1553        }
1554
1555        ubifs_assert(c, !test_bit(OBSOLETE_CNODE, &nnode->flags));
1556        __set_bit(OBSOLETE_CNODE, &nnode->flags);
1557
1558        c->dirty_nn_cnt += 1;
1559        ubifs_add_nnode_dirt(c, nnode);
1560        if (nnode->parent)
1561                nnode->parent->nbranch[n->iip].nnode = n;
1562        else
1563                c->nroot = n;
1564        return n;
1565}
1566
1567/**
1568 * dirty_cow_pnode - ensure a pnode is not being committed.
1569 * @c: UBIFS file-system description object
1570 * @pnode: pnode to check
1571 *
1572 * Returns dirtied pnode on success or negative error code on failure.
1573 */
1574static struct ubifs_pnode *dirty_cow_pnode(struct ubifs_info *c,
1575                                           struct ubifs_pnode *pnode)
1576{
1577        struct ubifs_pnode *p;
1578
1579        if (!test_bit(COW_CNODE, &pnode->flags)) {
1580                /* pnode is not being committed */
1581                if (!test_and_set_bit(DIRTY_CNODE, &pnode->flags)) {
1582                        c->dirty_pn_cnt += 1;
1583                        add_pnode_dirt(c, pnode);
1584                }
1585                return pnode;
1586        }
1587
1588        /* pnode is being committed, so copy it */
1589        p = kmemdup(pnode, sizeof(struct ubifs_pnode), GFP_NOFS);
1590        if (unlikely(!p))
1591                return ERR_PTR(-ENOMEM);
1592
1593        p->cnext = NULL;
1594        __set_bit(DIRTY_CNODE, &p->flags);
1595        __clear_bit(COW_CNODE, &p->flags);
1596        replace_cats(c, pnode, p);
1597
1598        ubifs_assert(c, !test_bit(OBSOLETE_CNODE, &pnode->flags));
1599        __set_bit(OBSOLETE_CNODE, &pnode->flags);
1600
1601        c->dirty_pn_cnt += 1;
1602        add_pnode_dirt(c, pnode);
1603        pnode->parent->nbranch[p->iip].pnode = p;
1604        return p;
1605}
1606
1607/**
1608 * ubifs_lpt_lookup_dirty - lookup LEB properties in the LPT.
1609 * @c: UBIFS file-system description object
1610 * @lnum: LEB number to lookup
1611 *
1612 * This function returns a pointer to the LEB properties on success or a
1613 * negative error code on failure.
1614 */
1615struct ubifs_lprops *ubifs_lpt_lookup_dirty(struct ubifs_info *c, int lnum)
1616{
1617        int err, i, h, iip, shft;
1618        struct ubifs_nnode *nnode;
1619        struct ubifs_pnode *pnode;
1620
1621        if (!c->nroot) {
1622                err = ubifs_read_nnode(c, NULL, 0);
1623                if (err)
1624                        return ERR_PTR(err);
1625        }
1626        nnode = c->nroot;
1627        nnode = dirty_cow_nnode(c, nnode);
1628        if (IS_ERR(nnode))
1629                return ERR_CAST(nnode);
1630        i = lnum - c->main_first;
1631        shft = c->lpt_hght * UBIFS_LPT_FANOUT_SHIFT;
1632        for (h = 1; h < c->lpt_hght; h++) {
1633                iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
1634                shft -= UBIFS_LPT_FANOUT_SHIFT;
1635                nnode = ubifs_get_nnode(c, nnode, iip);
1636                if (IS_ERR(nnode))
1637                        return ERR_CAST(nnode);
1638                nnode = dirty_cow_nnode(c, nnode);
1639                if (IS_ERR(nnode))
1640                        return ERR_CAST(nnode);
1641        }
1642        iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
1643        pnode = ubifs_get_pnode(c, nnode, iip);
1644        if (IS_ERR(pnode))
1645                return ERR_CAST(pnode);
1646        pnode = dirty_cow_pnode(c, pnode);
1647        if (IS_ERR(pnode))
1648                return ERR_CAST(pnode);
1649        iip = (i & (UBIFS_LPT_FANOUT - 1));
1650        dbg_lp("LEB %d, free %d, dirty %d, flags %d", lnum,
1651               pnode->lprops[iip].free, pnode->lprops[iip].dirty,
1652               pnode->lprops[iip].flags);
1653        ubifs_assert(c, test_bit(DIRTY_CNODE, &pnode->flags));
1654        return &pnode->lprops[iip];
1655}
1656
1657/**
1658 * ubifs_lpt_calc_hash - Calculate hash of the LPT pnodes
1659 * @c: UBIFS file-system description object
1660 * @hash: the returned hash of the LPT pnodes
1661 *
1662 * This function iterates over the LPT pnodes and creates a hash over them.
1663 * Returns 0 for success or a negative error code otherwise.
1664 */
1665int ubifs_lpt_calc_hash(struct ubifs_info *c, u8 *hash)
1666{
1667        struct ubifs_nnode *nnode, *nn;
1668        struct ubifs_cnode *cnode;
1669        struct shash_desc *desc;
1670        int iip = 0, i;
1671        int bufsiz = max_t(int, c->nnode_sz, c->pnode_sz);
1672        void *buf;
1673        int err;
1674
1675        if (!ubifs_authenticated(c))
1676                return 0;
1677
1678        if (!c->nroot) {
1679                err = ubifs_read_nnode(c, NULL, 0);
1680                if (err)
1681                        return err;
1682        }
1683
1684        desc = ubifs_hash_get_desc(c);
1685        if (IS_ERR(desc))
1686                return PTR_ERR(desc);
1687
1688        buf = kmalloc(bufsiz, GFP_NOFS);
1689        if (!buf) {
1690                err = -ENOMEM;
1691                goto out;
1692        }
1693
1694        cnode = (struct ubifs_cnode *)c->nroot;
1695
1696        while (cnode) {
1697                nnode = cnode->parent;
1698                nn = (struct ubifs_nnode *)cnode;
1699                if (cnode->level > 1) {
1700                        while (iip < UBIFS_LPT_FANOUT) {
1701                                if (nn->nbranch[iip].lnum == 0) {
1702                                        /* Go right */
1703                                        iip++;
1704                                        continue;
1705                                }
1706
1707                                nnode = ubifs_get_nnode(c, nn, iip);
1708                                if (IS_ERR(nnode)) {
1709                                        err = PTR_ERR(nnode);
1710                                        goto out;
1711                                }
1712
1713                                /* Go down */
1714                                iip = 0;
1715                                cnode = (struct ubifs_cnode *)nnode;
1716                                break;
1717                        }
1718                        if (iip < UBIFS_LPT_FANOUT)
1719                                continue;
1720                } else {
1721                        struct ubifs_pnode *pnode;
1722
1723                        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
1724                                if (nn->nbranch[i].lnum == 0)
1725                                        continue;
1726                                pnode = ubifs_get_pnode(c, nn, i);
1727                                if (IS_ERR(pnode)) {
1728                                        err = PTR_ERR(pnode);
1729                                        goto out;
1730                                }
1731
1732                                ubifs_pack_pnode(c, buf, pnode);
1733                                err = ubifs_shash_update(c, desc, buf,
1734                                                         c->pnode_sz);
1735                                if (err)
1736                                        goto out;
1737                        }
1738                }
1739                /* Go up and to the right */
1740                iip = cnode->iip + 1;
1741                cnode = (struct ubifs_cnode *)nnode;
1742        }
1743
1744        err = ubifs_shash_final(c, desc, hash);
1745out:
1746        kfree(desc);
1747        kfree(buf);
1748
1749        return err;
1750}
1751
1752/**
1753 * lpt_check_hash - check the hash of the LPT.
1754 * @c: UBIFS file-system description object
1755 *
1756 * This function calculates a hash over all pnodes in the LPT and compares it with
1757 * the hash stored in the master node. Returns %0 on success and a negative error
1758 * code on failure.
1759 */
1760static int lpt_check_hash(struct ubifs_info *c)
1761{
1762        int err;
1763        u8 hash[UBIFS_HASH_ARR_SZ];
1764
1765        if (!ubifs_authenticated(c))
1766                return 0;
1767
1768        err = ubifs_lpt_calc_hash(c, hash);
1769        if (err)
1770                return err;
1771
1772        if (ubifs_check_hash(c, c->mst_node->hash_lpt, hash)) {
1773                err = -EPERM;
1774                ubifs_err(c, "Failed to authenticate LPT");
1775        } else {
1776                err = 0;
1777        }
1778
1779        return err;
1780}
1781
1782/**
1783 * lpt_init_rd - initialize the LPT for reading.
1784 * @c: UBIFS file-system description object
1785 *
1786 * This function returns %0 on success and a negative error code on failure.
1787 */
1788static int lpt_init_rd(struct ubifs_info *c)
1789{
1790        int err, i;
1791
1792        c->ltab = vmalloc(array_size(sizeof(struct ubifs_lpt_lprops),
1793                                     c->lpt_lebs));
1794        if (!c->ltab)
1795                return -ENOMEM;
1796
1797        i = max_t(int, c->nnode_sz, c->pnode_sz);
1798        c->lpt_nod_buf = kmalloc(i, GFP_KERNEL);
1799        if (!c->lpt_nod_buf)
1800                return -ENOMEM;
1801
1802        for (i = 0; i < LPROPS_HEAP_CNT; i++) {
1803                c->lpt_heap[i].arr = kmalloc_array(LPT_HEAP_SZ,
1804                                                   sizeof(void *),
1805                                                   GFP_KERNEL);
1806                if (!c->lpt_heap[i].arr)
1807                        return -ENOMEM;
1808                c->lpt_heap[i].cnt = 0;
1809                c->lpt_heap[i].max_cnt = LPT_HEAP_SZ;
1810        }
1811
1812        c->dirty_idx.arr = kmalloc_array(LPT_HEAP_SZ, sizeof(void *),
1813                                         GFP_KERNEL);
1814        if (!c->dirty_idx.arr)
1815                return -ENOMEM;
1816        c->dirty_idx.cnt = 0;
1817        c->dirty_idx.max_cnt = LPT_HEAP_SZ;
1818
1819        err = read_ltab(c);
1820        if (err)
1821                return err;
1822
1823        err = lpt_check_hash(c);
1824        if (err)
1825                return err;
1826
1827        dbg_lp("space_bits %d", c->space_bits);
1828        dbg_lp("lpt_lnum_bits %d", c->lpt_lnum_bits);
1829        dbg_lp("lpt_offs_bits %d", c->lpt_offs_bits);
1830        dbg_lp("lpt_spc_bits %d", c->lpt_spc_bits);
1831        dbg_lp("pcnt_bits %d", c->pcnt_bits);
1832        dbg_lp("lnum_bits %d", c->lnum_bits);
1833        dbg_lp("pnode_sz %d", c->pnode_sz);
1834        dbg_lp("nnode_sz %d", c->nnode_sz);
1835        dbg_lp("ltab_sz %d", c->ltab_sz);
1836        dbg_lp("lsave_sz %d", c->lsave_sz);
1837        dbg_lp("lsave_cnt %d", c->lsave_cnt);
1838        dbg_lp("lpt_hght %d", c->lpt_hght);
1839        dbg_lp("big_lpt %d", c->big_lpt);
1840        dbg_lp("LPT root is at %d:%d", c->lpt_lnum, c->lpt_offs);
1841        dbg_lp("LPT head is at %d:%d", c->nhead_lnum, c->nhead_offs);
1842        dbg_lp("LPT ltab is at %d:%d", c->ltab_lnum, c->ltab_offs);
1843        if (c->big_lpt)
1844                dbg_lp("LPT lsave is at %d:%d", c->lsave_lnum, c->lsave_offs);
1845
1846        return 0;
1847}
1848
1849/**
1850 * lpt_init_wr - initialize the LPT for writing.
1851 * @c: UBIFS file-system description object
1852 *
1853 * 'lpt_init_rd()' must have been called already.
1854 *
1855 * This function returns %0 on success and a negative error code on failure.
1856 */
1857static int lpt_init_wr(struct ubifs_info *c)
1858{
1859        int err, i;
1860
1861        c->ltab_cmt = vmalloc(array_size(sizeof(struct ubifs_lpt_lprops),
1862                                         c->lpt_lebs));
1863        if (!c->ltab_cmt)
1864                return -ENOMEM;
1865
1866        c->lpt_buf = vmalloc(c->leb_size);
1867        if (!c->lpt_buf)
1868                return -ENOMEM;
1869
1870        if (c->big_lpt) {
1871                c->lsave = kmalloc_array(c->lsave_cnt, sizeof(int), GFP_NOFS);
1872                if (!c->lsave)
1873                        return -ENOMEM;
1874                err = read_lsave(c);
1875                if (err)
1876                        return err;
1877        }
1878
1879        for (i = 0; i < c->lpt_lebs; i++)
1880                if (c->ltab[i].free == c->leb_size) {
1881                        err = ubifs_leb_unmap(c, i + c->lpt_first);
1882                        if (err)
1883                                return err;
1884                }
1885
1886        return 0;
1887}
1888
1889/**
1890 * ubifs_lpt_init - initialize the LPT.
1891 * @c: UBIFS file-system description object
1892 * @rd: whether to initialize lpt for reading
1893 * @wr: whether to initialize lpt for writing
1894 *
1895 * For mounting 'rw', @rd and @wr are both true. For mounting 'ro', @rd is true
1896 * and @wr is false. For mounting from 'ro' to 'rw', @rd is false and @wr is
1897 * true.
1898 *
1899 * This function returns %0 on success and a negative error code on failure.
1900 */
1901int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr)
1902{
1903        int err;
1904
1905        if (rd) {
1906                err = lpt_init_rd(c);
1907                if (err)
1908                        goto out_err;
1909        }
1910
1911        if (wr) {
1912                err = lpt_init_wr(c);
1913                if (err)
1914                        goto out_err;
1915        }
1916
1917        return 0;
1918
1919out_err:
1920        if (wr)
1921                ubifs_lpt_free(c, 1);
1922        if (rd)
1923                ubifs_lpt_free(c, 0);
1924        return err;
1925}
1926
1927/**
1928 * struct lpt_scan_node - somewhere to put nodes while we scan LPT.
1929 * @nnode: where to keep a nnode
1930 * @pnode: where to keep a pnode
1931 * @cnode: where to keep a cnode
1932 * @in_tree: is the node in the tree in memory
1933 * @ptr.nnode: pointer to the nnode (if it is an nnode) which may be here or in
1934 * the tree
1935 * @ptr.pnode: ditto for pnode
1936 * @ptr.cnode: ditto for cnode
1937 */
1938struct lpt_scan_node {
1939        union {
1940                struct ubifs_nnode nnode;
1941                struct ubifs_pnode pnode;
1942                struct ubifs_cnode cnode;
1943        };
1944        int in_tree;
1945        union {
1946                struct ubifs_nnode *nnode;
1947                struct ubifs_pnode *pnode;
1948                struct ubifs_cnode *cnode;
1949        } ptr;
1950};
1951
1952/**
1953 * scan_get_nnode - for the scan, get a nnode from either the tree or flash.
1954 * @c: the UBIFS file-system description object
1955 * @path: where to put the nnode
1956 * @parent: parent of the nnode
1957 * @iip: index in parent of the nnode
1958 *
1959 * This function returns a pointer to the nnode on success or a negative error
1960 * code on failure.
1961 */
1962static struct ubifs_nnode *scan_get_nnode(struct ubifs_info *c,
1963                                          struct lpt_scan_node *path,
1964                                          struct ubifs_nnode *parent, int iip)
1965{
1966        struct ubifs_nbranch *branch;
1967        struct ubifs_nnode *nnode;
1968        void *buf = c->lpt_nod_buf;
1969        int err;
1970
1971        branch = &parent->nbranch[iip];
1972        nnode = branch->nnode;
1973        if (nnode) {
1974                path->in_tree = 1;
1975                path->ptr.nnode = nnode;
1976                return nnode;
1977        }
1978        nnode = &path->nnode;
1979        path->in_tree = 0;
1980        path->ptr.nnode = nnode;
1981        memset(nnode, 0, sizeof(struct ubifs_nnode));
1982        if (branch->lnum == 0) {
1983                /*
1984                 * This nnode was not written which just means that the LEB
1985                 * properties in the subtree below it describe empty LEBs. We
1986                 * make the nnode as though we had read it, which in fact means
1987                 * doing almost nothing.
1988                 */
1989                if (c->big_lpt)
1990                        nnode->num = calc_nnode_num_from_parent(c, parent, iip);
1991        } else {
1992                err = ubifs_leb_read(c, branch->lnum, buf, branch->offs,
1993                                     c->nnode_sz, 1);
1994                if (err)
1995                        return ERR_PTR(err);
1996                err = ubifs_unpack_nnode(c, buf, nnode);
1997                if (err)
1998                        return ERR_PTR(err);
1999        }
2000        err = validate_nnode(c, nnode, parent, iip);
2001        if (err)
2002                return ERR_PTR(err);
2003        if (!c->big_lpt)
2004                nnode->num = calc_nnode_num_from_parent(c, parent, iip);
2005        nnode->level = parent->level - 1;
2006        nnode->parent = parent;
2007        nnode->iip = iip;
2008        return nnode;
2009}
2010
2011/**
2012 * scan_get_pnode - for the scan, get a pnode from either the tree or flash.
2013 * @c: the UBIFS file-system description object
2014 * @path: where to put the pnode
2015 * @parent: parent of the pnode
2016 * @iip: index in parent of the pnode
2017 *
2018 * This function returns a pointer to the pnode on success or a negative error
2019 * code on failure.
2020 */
2021static struct ubifs_pnode *scan_get_pnode(struct ubifs_info *c,
2022                                          struct lpt_scan_node *path,
2023                                          struct ubifs_nnode *parent, int iip)
2024{
2025        struct ubifs_nbranch *branch;
2026        struct ubifs_pnode *pnode;
2027        void *buf = c->lpt_nod_buf;
2028        int err;
2029
2030        branch = &parent->nbranch[iip];
2031        pnode = branch->pnode;
2032        if (pnode) {
2033                path->in_tree = 1;
2034                path->ptr.pnode = pnode;
2035                return pnode;
2036        }
2037        pnode = &path->pnode;
2038        path->in_tree = 0;
2039        path->ptr.pnode = pnode;
2040        memset(pnode, 0, sizeof(struct ubifs_pnode));
2041        if (branch->lnum == 0) {
2042                /*
2043                 * This pnode was not written which just means that the LEB
2044                 * properties in it describe empty LEBs. We make the pnode as
2045                 * though we had read it.
2046                 */
2047                int i;
2048
2049                if (c->big_lpt)
2050                        pnode->num = calc_pnode_num_from_parent(c, parent, iip);
2051                for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
2052                        struct ubifs_lprops * const lprops = &pnode->lprops[i];
2053
2054                        lprops->free = c->leb_size;
2055                        lprops->flags = ubifs_categorize_lprops(c, lprops);
2056                }
2057        } else {
2058                ubifs_assert(c, branch->lnum >= c->lpt_first &&
2059                             branch->lnum <= c->lpt_last);
2060                ubifs_assert(c, branch->offs >= 0 && branch->offs < c->leb_size);
2061                err = ubifs_leb_read(c, branch->lnum, buf, branch->offs,
2062                                     c->pnode_sz, 1);
2063                if (err)
2064                        return ERR_PTR(err);
2065                err = unpack_pnode(c, buf, pnode);
2066                if (err)
2067                        return ERR_PTR(err);
2068        }
2069        err = validate_pnode(c, pnode, parent, iip);
2070        if (err)
2071                return ERR_PTR(err);
2072        if (!c->big_lpt)
2073                pnode->num = calc_pnode_num_from_parent(c, parent, iip);
2074        pnode->parent = parent;
2075        pnode->iip = iip;
2076        set_pnode_lnum(c, pnode);
2077        return pnode;
2078}
2079
2080/**
2081 * ubifs_lpt_scan_nolock - scan the LPT.
2082 * @c: the UBIFS file-system description object
2083 * @start_lnum: LEB number from which to start scanning
2084 * @end_lnum: LEB number at which to stop scanning
2085 * @scan_cb: callback function called for each lprops
2086 * @data: data to be passed to the callback function
2087 *
2088 * This function returns %0 on success and a negative error code on failure.
2089 */
2090int ubifs_lpt_scan_nolock(struct ubifs_info *c, int start_lnum, int end_lnum,
2091                          ubifs_lpt_scan_callback scan_cb, void *data)
2092{
2093        int err = 0, i, h, iip, shft;
2094        struct ubifs_nnode *nnode;
2095        struct ubifs_pnode *pnode;
2096        struct lpt_scan_node *path;
2097
2098        if (start_lnum == -1) {
2099                start_lnum = end_lnum + 1;
2100                if (start_lnum >= c->leb_cnt)
2101                        start_lnum = c->main_first;
2102        }
2103
2104        ubifs_assert(c, start_lnum >= c->main_first && start_lnum < c->leb_cnt);
2105        ubifs_assert(c, end_lnum >= c->main_first && end_lnum < c->leb_cnt);
2106
2107        if (!c->nroot) {
2108                err = ubifs_read_nnode(c, NULL, 0);
2109                if (err)
2110                        return err;
2111        }
2112
2113        path = kmalloc_array(c->lpt_hght + 1, sizeof(struct lpt_scan_node),
2114                             GFP_NOFS);
2115        if (!path)
2116                return -ENOMEM;
2117
2118        path[0].ptr.nnode = c->nroot;
2119        path[0].in_tree = 1;
2120again:
2121        /* Descend to the pnode containing start_lnum */
2122        nnode = c->nroot;
2123        i = start_lnum - c->main_first;
2124        shft = c->lpt_hght * UBIFS_LPT_FANOUT_SHIFT;
2125        for (h = 1; h < c->lpt_hght; h++) {
2126                iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
2127                shft -= UBIFS_LPT_FANOUT_SHIFT;
2128                nnode = scan_get_nnode(c, path + h, nnode, iip);
2129                if (IS_ERR(nnode)) {
2130                        err = PTR_ERR(nnode);
2131                        goto out;
2132                }
2133        }
2134        iip = ((i >> shft) & (UBIFS_LPT_FANOUT - 1));
2135        pnode = scan_get_pnode(c, path + h, nnode, iip);
2136        if (IS_ERR(pnode)) {
2137                err = PTR_ERR(pnode);
2138                goto out;
2139        }
2140        iip = (i & (UBIFS_LPT_FANOUT - 1));
2141
2142        /* Loop for each lprops */
2143        while (1) {
2144                struct ubifs_lprops *lprops = &pnode->lprops[iip];
2145                int ret, lnum = lprops->lnum;
2146
2147                ret = scan_cb(c, lprops, path[h].in_tree, data);
2148                if (ret < 0) {
2149                        err = ret;
2150                        goto out;
2151                }
2152                if (ret & LPT_SCAN_ADD) {
2153                        /* Add all the nodes in path to the tree in memory */
2154                        for (h = 1; h < c->lpt_hght; h++) {
2155                                const size_t sz = sizeof(struct ubifs_nnode);
2156                                struct ubifs_nnode *parent;
2157
2158                                if (path[h].in_tree)
2159                                        continue;
2160                                nnode = kmemdup(&path[h].nnode, sz, GFP_NOFS);
2161                                if (!nnode) {
2162                                        err = -ENOMEM;
2163                                        goto out;
2164                                }
2165                                parent = nnode->parent;
2166                                parent->nbranch[nnode->iip].nnode = nnode;
2167                                path[h].ptr.nnode = nnode;
2168                                path[h].in_tree = 1;
2169                                path[h + 1].cnode.parent = nnode;
2170                        }
2171                        if (path[h].in_tree)
2172                                ubifs_ensure_cat(c, lprops);
2173                        else {
2174                                const size_t sz = sizeof(struct ubifs_pnode);
2175                                struct ubifs_nnode *parent;
2176
2177                                pnode = kmemdup(&path[h].pnode, sz, GFP_NOFS);
2178                                if (!pnode) {
2179                                        err = -ENOMEM;
2180                                        goto out;
2181                                }
2182                                parent = pnode->parent;
2183                                parent->nbranch[pnode->iip].pnode = pnode;
2184                                path[h].ptr.pnode = pnode;
2185                                path[h].in_tree = 1;
2186                                update_cats(c, pnode);
2187                                c->pnodes_have += 1;
2188                        }
2189                        err = dbg_check_lpt_nodes(c, (struct ubifs_cnode *)
2190                                                  c->nroot, 0, 0);
2191                        if (err)
2192                                goto out;
2193                        err = dbg_check_cats(c);
2194                        if (err)
2195                                goto out;
2196                }
2197                if (ret & LPT_SCAN_STOP) {
2198                        err = 0;
2199                        break;
2200                }
2201                /* Get the next lprops */
2202                if (lnum == end_lnum) {
2203                        /*
2204                         * We got to the end without finding what we were
2205                         * looking for
2206                         */
2207                        err = -ENOSPC;
2208                        goto out;
2209                }
2210                if (lnum + 1 >= c->leb_cnt) {
2211                        /* Wrap-around to the beginning */
2212                        start_lnum = c->main_first;
2213                        goto again;
2214                }
2215                if (iip + 1 < UBIFS_LPT_FANOUT) {
2216                        /* Next lprops is in the same pnode */
2217                        iip += 1;
2218                        continue;
2219                }
2220                /* We need to get the next pnode. Go up until we can go right */
2221                iip = pnode->iip;
2222                while (1) {
2223                        h -= 1;
2224                        ubifs_assert(c, h >= 0);
2225                        nnode = path[h].ptr.nnode;
2226                        if (iip + 1 < UBIFS_LPT_FANOUT)
2227                                break;
2228                        iip = nnode->iip;
2229                }
2230                /* Go right */
2231                iip += 1;
2232                /* Descend to the pnode */
2233                h += 1;
2234                for (; h < c->lpt_hght; h++) {
2235                        nnode = scan_get_nnode(c, path + h, nnode, iip);
2236                        if (IS_ERR(nnode)) {
2237                                err = PTR_ERR(nnode);
2238                                goto out;
2239                        }
2240                        iip = 0;
2241                }
2242                pnode = scan_get_pnode(c, path + h, nnode, iip);
2243                if (IS_ERR(pnode)) {
2244                        err = PTR_ERR(pnode);
2245                        goto out;
2246                }
2247                iip = 0;
2248        }
2249out:
2250        kfree(path);
2251        return err;
2252}
2253
2254/**
2255 * dbg_chk_pnode - check a pnode.
2256 * @c: the UBIFS file-system description object
2257 * @pnode: pnode to check
2258 * @col: pnode column
2259 *
2260 * This function returns %0 on success and a negative error code on failure.
2261 */
2262static int dbg_chk_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode,
2263                         int col)
2264{
2265        int i;
2266
2267        if (pnode->num != col) {
2268                ubifs_err(c, "pnode num %d expected %d parent num %d iip %d",
2269                          pnode->num, col, pnode->parent->num, pnode->iip);
2270                return -EINVAL;
2271        }
2272        for (i = 0; i < UBIFS_LPT_FANOUT; i++) {
2273                struct ubifs_lprops *lp, *lprops = &pnode->lprops[i];
2274                int lnum = (pnode->num << UBIFS_LPT_FANOUT_SHIFT) + i +
2275                           c->main_first;
2276                int found, cat = lprops->flags & LPROPS_CAT_MASK;
2277                struct ubifs_lpt_heap *heap;
2278                struct list_head *list = NULL;
2279
2280                if (lnum >= c->leb_cnt)
2281                        continue;
2282                if (lprops->lnum != lnum) {
2283                        ubifs_err(c, "bad LEB number %d expected %d",
2284                                  lprops->lnum, lnum);
2285                        return -EINVAL;
2286                }
2287                if (lprops->flags & LPROPS_TAKEN) {
2288                        if (cat != LPROPS_UNCAT) {
2289                                ubifs_err(c, "LEB %d taken but not uncat %d",
2290                                          lprops->lnum, cat);
2291                                return -EINVAL;
2292                        }
2293                        continue;
2294                }
2295                if (lprops->flags & LPROPS_INDEX) {
2296                        switch (cat) {
2297                        case LPROPS_UNCAT:
2298                        case LPROPS_DIRTY_IDX:
2299                        case LPROPS_FRDI_IDX:
2300                                break;
2301                        default:
2302                                ubifs_err(c, "LEB %d index but cat %d",
2303                                          lprops->lnum, cat);
2304                                return -EINVAL;
2305                        }
2306                } else {
2307                        switch (cat) {
2308                        case LPROPS_UNCAT:
2309                        case LPROPS_DIRTY:
2310                        case LPROPS_FREE:
2311                        case LPROPS_EMPTY:
2312                        case LPROPS_FREEABLE:
2313                                break;
2314                        default:
2315                                ubifs_err(c, "LEB %d not index but cat %d",
2316                                          lprops->lnum, cat);
2317                                return -EINVAL;
2318                        }
2319                }
2320                switch (cat) {
2321                case LPROPS_UNCAT:
2322                        list = &c->uncat_list;
2323                        break;
2324                case LPROPS_EMPTY:
2325                        list = &c->empty_list;
2326                        break;
2327                case LPROPS_FREEABLE:
2328                        list = &c->freeable_list;
2329                        break;
2330                case LPROPS_FRDI_IDX:
2331                        list = &c->frdi_idx_list;
2332                        break;
2333                }
2334                found = 0;
2335                switch (cat) {
2336                case LPROPS_DIRTY:
2337                case LPROPS_DIRTY_IDX:
2338                case LPROPS_FREE:
2339                        heap = &c->lpt_heap[cat - 1];
2340                        if (lprops->hpos < heap->cnt &&
2341                            heap->arr[lprops->hpos] == lprops)
2342                                found = 1;
2343                        break;
2344                case LPROPS_UNCAT:
2345                case LPROPS_EMPTY:
2346                case LPROPS_FREEABLE:
2347                case LPROPS_FRDI_IDX:
2348                        list_for_each_entry(lp, list, list)
2349                                if (lprops == lp) {
2350                                        found = 1;
2351                                        break;
2352                                }
2353                        break;
2354                }
2355                if (!found) {
2356                        ubifs_err(c, "LEB %d cat %d not found in cat heap/list",
2357                                  lprops->lnum, cat);
2358                        return -EINVAL;
2359                }
2360                switch (cat) {
2361                case LPROPS_EMPTY:
2362                        if (lprops->free != c->leb_size) {
2363                                ubifs_err(c, "LEB %d cat %d free %d dirty %d",
2364                                          lprops->lnum, cat, lprops->free,
2365                                          lprops->dirty);
2366                                return -EINVAL;
2367                        }
2368                        break;
2369                case LPROPS_FREEABLE:
2370                case LPROPS_FRDI_IDX:
2371                        if (lprops->free + lprops->dirty != c->leb_size) {
2372                                ubifs_err(c, "LEB %d cat %d free %d dirty %d",
2373                                          lprops->lnum, cat, lprops->free,
2374                                          lprops->dirty);
2375                                return -EINVAL;
2376                        }
2377                        break;
2378                }
2379        }
2380        return 0;
2381}
2382
2383/**
2384 * dbg_check_lpt_nodes - check nnodes and pnodes.
2385 * @c: the UBIFS file-system description object
2386 * @cnode: next cnode (nnode or pnode) to check
2387 * @row: row of cnode (root is zero)
2388 * @col: column of cnode (leftmost is zero)
2389 *
2390 * This function returns %0 on success and a negative error code on failure.
2391 */
2392int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode,
2393                        int row, int col)
2394{
2395        struct ubifs_nnode *nnode, *nn;
2396        struct ubifs_cnode *cn;
2397        int num, iip = 0, err;
2398
2399        if (!dbg_is_chk_lprops(c))
2400                return 0;
2401
2402        while (cnode) {
2403                ubifs_assert(c, row >= 0);
2404                nnode = cnode->parent;
2405                if (cnode->level) {
2406                        /* cnode is a nnode */
2407                        num = calc_nnode_num(row, col);
2408                        if (cnode->num != num) {
2409                                ubifs_err(c, "nnode num %d expected %d parent num %d iip %d",
2410                                          cnode->num, num,
2411                                          (nnode ? nnode->num : 0), cnode->iip);
2412                                return -EINVAL;
2413                        }
2414                        nn = (struct ubifs_nnode *)cnode;
2415                        while (iip < UBIFS_LPT_FANOUT) {
2416                                cn = nn->nbranch[iip].cnode;
2417                                if (cn) {
2418                                        /* Go down */
2419                                        row += 1;
2420                                        col <<= UBIFS_LPT_FANOUT_SHIFT;
2421                                        col += iip;
2422                                        iip = 0;
2423                                        cnode = cn;
2424                                        break;
2425                                }
2426                                /* Go right */
2427                                iip += 1;
2428                        }
2429                        if (iip < UBIFS_LPT_FANOUT)
2430                                continue;
2431                } else {
2432                        struct ubifs_pnode *pnode;
2433
2434                        /* cnode is a pnode */
2435                        pnode = (struct ubifs_pnode *)cnode;
2436                        err = dbg_chk_pnode(c, pnode, col);
2437                        if (err)
2438                                return err;
2439                }
2440                /* Go up and to the right */
2441                row -= 1;
2442                col >>= UBIFS_LPT_FANOUT_SHIFT;
2443                iip = cnode->iip + 1;
2444                cnode = (struct ubifs_cnode *)nnode;
2445        }
2446        return 0;
2447}
2448