linux/fs/ubifs/recovery.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 functions needed to recover from unclean un-mounts.
  25 * When UBIFS is mounted, it checks a flag on the master node to determine if
  26 * an un-mount was completed sucessfully. If not, the process of mounting
  27 * incorparates additional checking and fixing of on-flash data structures.
  28 * UBIFS always cleans away all remnants of an unclean un-mount, so that
  29 * errors do not accumulate. However UBIFS defers recovery if it is mounted
  30 * read-only, and the flash is not modified in that case.
  31 */
  32
  33#include <linux/crc32.h>
  34#include "ubifs.h"
  35
  36/**
  37 * is_empty - determine whether a buffer is empty (contains all 0xff).
  38 * @buf: buffer to clean
  39 * @len: length of buffer
  40 *
  41 * This function returns %1 if the buffer is empty (contains all 0xff) otherwise
  42 * %0 is returned.
  43 */
  44static int is_empty(void *buf, int len)
  45{
  46        uint8_t *p = buf;
  47        int i;
  48
  49        for (i = 0; i < len; i++)
  50                if (*p++ != 0xff)
  51                        return 0;
  52        return 1;
  53}
  54
  55/**
  56 * get_master_node - get the last valid master node allowing for corruption.
  57 * @c: UBIFS file-system description object
  58 * @lnum: LEB number
  59 * @pbuf: buffer containing the LEB read, is returned here
  60 * @mst: master node, if found, is returned here
  61 * @cor: corruption, if found, is returned here
  62 *
  63 * This function allocates a buffer, reads the LEB into it, and finds and
  64 * returns the last valid master node allowing for one area of corruption.
  65 * The corrupt area, if there is one, must be consistent with the assumption
  66 * that it is the result of an unclean unmount while the master node was being
  67 * written. Under those circumstances, it is valid to use the previously written
  68 * master node.
  69 *
  70 * This function returns %0 on success and a negative error code on failure.
  71 */
  72static int get_master_node(const struct ubifs_info *c, int lnum, void **pbuf,
  73                           struct ubifs_mst_node **mst, void **cor)
  74{
  75        const int sz = c->mst_node_alsz;
  76        int err, offs, len;
  77        void *sbuf, *buf;
  78
  79        sbuf = vmalloc(c->leb_size);
  80        if (!sbuf)
  81                return -ENOMEM;
  82
  83        err = ubi_read(c->ubi, lnum, sbuf, 0, c->leb_size);
  84        if (err && err != -EBADMSG)
  85                goto out_free;
  86
  87        /* Find the first position that is definitely not a node */
  88        offs = 0;
  89        buf = sbuf;
  90        len = c->leb_size;
  91        while (offs + UBIFS_MST_NODE_SZ <= c->leb_size) {
  92                struct ubifs_ch *ch = buf;
  93
  94                if (le32_to_cpu(ch->magic) != UBIFS_NODE_MAGIC)
  95                        break;
  96                offs += sz;
  97                buf  += sz;
  98                len  -= sz;
  99        }
 100        /* See if there was a valid master node before that */
 101        if (offs) {
 102                int ret;
 103
 104                offs -= sz;
 105                buf  -= sz;
 106                len  += sz;
 107                ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
 108                if (ret != SCANNED_A_NODE && offs) {
 109                        /* Could have been corruption so check one place back */
 110                        offs -= sz;
 111                        buf  -= sz;
 112                        len  += sz;
 113                        ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
 114                        if (ret != SCANNED_A_NODE)
 115                                /*
 116                                 * We accept only one area of corruption because
 117                                 * we are assuming that it was caused while
 118                                 * trying to write a master node.
 119                                 */
 120                                goto out_err;
 121                }
 122                if (ret == SCANNED_A_NODE) {
 123                        struct ubifs_ch *ch = buf;
 124
 125                        if (ch->node_type != UBIFS_MST_NODE)
 126                                goto out_err;
 127                        dbg_rcvry("found a master node at %d:%d", lnum, offs);
 128                        *mst = buf;
 129                        offs += sz;
 130                        buf  += sz;
 131                        len  -= sz;
 132                }
 133        }
 134        /* Check for corruption */
 135        if (offs < c->leb_size) {
 136                if (!is_empty(buf, min_t(int, len, sz))) {
 137                        *cor = buf;
 138                        dbg_rcvry("found corruption at %d:%d", lnum, offs);
 139                }
 140                offs += sz;
 141                buf  += sz;
 142                len  -= sz;
 143        }
 144        /* Check remaining empty space */
 145        if (offs < c->leb_size)
 146                if (!is_empty(buf, len))
 147                        goto out_err;
 148        *pbuf = sbuf;
 149        return 0;
 150
 151out_err:
 152        err = -EINVAL;
 153out_free:
 154        vfree(sbuf);
 155        *mst = NULL;
 156        *cor = NULL;
 157        return err;
 158}
 159
 160/**
 161 * write_rcvrd_mst_node - write recovered master node.
 162 * @c: UBIFS file-system description object
 163 * @mst: master node
 164 *
 165 * This function returns %0 on success and a negative error code on failure.
 166 */
 167static int write_rcvrd_mst_node(struct ubifs_info *c,
 168                                struct ubifs_mst_node *mst)
 169{
 170        int err = 0, lnum = UBIFS_MST_LNUM, sz = c->mst_node_alsz;
 171        __le32 save_flags;
 172
 173        dbg_rcvry("recovery");
 174
 175        save_flags = mst->flags;
 176        mst->flags |= cpu_to_le32(UBIFS_MST_RCVRY);
 177
 178        ubifs_prepare_node(c, mst, UBIFS_MST_NODE_SZ, 1);
 179        err = ubi_leb_change(c->ubi, lnum, mst, sz, UBI_SHORTTERM);
 180        if (err)
 181                goto out;
 182        err = ubi_leb_change(c->ubi, lnum + 1, mst, sz, UBI_SHORTTERM);
 183        if (err)
 184                goto out;
 185out:
 186        mst->flags = save_flags;
 187        return err;
 188}
 189
 190/**
 191 * ubifs_recover_master_node - recover the master node.
 192 * @c: UBIFS file-system description object
 193 *
 194 * This function recovers the master node from corruption that may occur due to
 195 * an unclean unmount.
 196 *
 197 * This function returns %0 on success and a negative error code on failure.
 198 */
 199int ubifs_recover_master_node(struct ubifs_info *c)
 200{
 201        void *buf1 = NULL, *buf2 = NULL, *cor1 = NULL, *cor2 = NULL;
 202        struct ubifs_mst_node *mst1 = NULL, *mst2 = NULL, *mst;
 203        const int sz = c->mst_node_alsz;
 204        int err, offs1, offs2;
 205
 206        dbg_rcvry("recovery");
 207
 208        err = get_master_node(c, UBIFS_MST_LNUM, &buf1, &mst1, &cor1);
 209        if (err)
 210                goto out_free;
 211
 212        err = get_master_node(c, UBIFS_MST_LNUM + 1, &buf2, &mst2, &cor2);
 213        if (err)
 214                goto out_free;
 215
 216        if (mst1) {
 217                offs1 = (void *)mst1 - buf1;
 218                if ((le32_to_cpu(mst1->flags) & UBIFS_MST_RCVRY) &&
 219                    (offs1 == 0 && !cor1)) {
 220                        /*
 221                         * mst1 was written by recovery at offset 0 with no
 222                         * corruption.
 223                         */
 224                        dbg_rcvry("recovery recovery");
 225                        mst = mst1;
 226                } else if (mst2) {
 227                        offs2 = (void *)mst2 - buf2;
 228                        if (offs1 == offs2) {
 229                                /* Same offset, so must be the same */
 230                                if (memcmp((void *)mst1 + UBIFS_CH_SZ,
 231                                           (void *)mst2 + UBIFS_CH_SZ,
 232                                           UBIFS_MST_NODE_SZ - UBIFS_CH_SZ))
 233                                        goto out_err;
 234                                mst = mst1;
 235                        } else if (offs2 + sz == offs1) {
 236                                /* 1st LEB was written, 2nd was not */
 237                                if (cor1)
 238                                        goto out_err;
 239                                mst = mst1;
 240                        } else if (offs1 == 0 && offs2 + sz >= c->leb_size) {
 241                                /* 1st LEB was unmapped and written, 2nd not */
 242                                if (cor1)
 243                                        goto out_err;
 244                                mst = mst1;
 245                        } else
 246                                goto out_err;
 247                } else {
 248                        /*
 249                         * 2nd LEB was unmapped and about to be written, so
 250                         * there must be only one master node in the first LEB
 251                         * and no corruption.
 252                         */
 253                        if (offs1 != 0 || cor1)
 254                                goto out_err;
 255                        mst = mst1;
 256                }
 257        } else {
 258                if (!mst2)
 259                        goto out_err;
 260                /*
 261                 * 1st LEB was unmapped and about to be written, so there must
 262                 * be no room left in 2nd LEB.
 263                 */
 264                offs2 = (void *)mst2 - buf2;
 265                if (offs2 + sz + sz <= c->leb_size)
 266                        goto out_err;
 267                mst = mst2;
 268        }
 269
 270        dbg_rcvry("recovered master node from LEB %d",
 271                  (mst == mst1 ? UBIFS_MST_LNUM : UBIFS_MST_LNUM + 1));
 272
 273        memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ);
 274
 275        if ((c->vfs_sb->s_flags & MS_RDONLY)) {
 276                /* Read-only mode. Keep a copy for switching to rw mode */
 277                c->rcvrd_mst_node = kmalloc(sz, GFP_KERNEL);
 278                if (!c->rcvrd_mst_node) {
 279                        err = -ENOMEM;
 280                        goto out_free;
 281                }
 282                memcpy(c->rcvrd_mst_node, c->mst_node, UBIFS_MST_NODE_SZ);
 283        } else {
 284                /* Write the recovered master node */
 285                c->max_sqnum = le64_to_cpu(mst->ch.sqnum) - 1;
 286                err = write_rcvrd_mst_node(c, c->mst_node);
 287                if (err)
 288                        goto out_free;
 289        }
 290
 291        vfree(buf2);
 292        vfree(buf1);
 293
 294        return 0;
 295
 296out_err:
 297        err = -EINVAL;
 298out_free:
 299        ubifs_err("failed to recover master node");
 300        if (mst1) {
 301                dbg_err("dumping first master node");
 302                dbg_dump_node(c, mst1);
 303        }
 304        if (mst2) {
 305                dbg_err("dumping second master node");
 306                dbg_dump_node(c, mst2);
 307        }
 308        vfree(buf2);
 309        vfree(buf1);
 310        return err;
 311}
 312
 313/**
 314 * ubifs_write_rcvrd_mst_node - write the recovered master node.
 315 * @c: UBIFS file-system description object
 316 *
 317 * This function writes the master node that was recovered during mounting in
 318 * read-only mode and must now be written because we are remounting rw.
 319 *
 320 * This function returns %0 on success and a negative error code on failure.
 321 */
 322int ubifs_write_rcvrd_mst_node(struct ubifs_info *c)
 323{
 324        int err;
 325
 326        if (!c->rcvrd_mst_node)
 327                return 0;
 328        c->rcvrd_mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY);
 329        c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY);
 330        err = write_rcvrd_mst_node(c, c->rcvrd_mst_node);
 331        if (err)
 332                return err;
 333        kfree(c->rcvrd_mst_node);
 334        c->rcvrd_mst_node = NULL;
 335        return 0;
 336}
 337
 338/**
 339 * is_last_write - determine if an offset was in the last write to a LEB.
 340 * @c: UBIFS file-system description object
 341 * @buf: buffer to check
 342 * @offs: offset to check
 343 *
 344 * This function returns %1 if @offs was in the last write to the LEB whose data
 345 * is in @buf, otherwise %0 is returned.  The determination is made by checking
 346 * for subsequent empty space starting from the next min_io_size boundary (or a
 347 * bit less than the common header size if min_io_size is one).
 348 */
 349static int is_last_write(const struct ubifs_info *c, void *buf, int offs)
 350{
 351        int empty_offs;
 352        int check_len;
 353        uint8_t *p;
 354
 355        if (c->min_io_size == 1) {
 356                check_len = c->leb_size - offs;
 357                p = buf + check_len;
 358                for (; check_len > 0; check_len--)
 359                        if (*--p != 0xff)
 360                                break;
 361                /*
 362                 * 'check_len' is the size of the corruption which cannot be
 363                 * more than the size of 1 node if it was caused by an unclean
 364                 * unmount.
 365                 */
 366                if (check_len > UBIFS_MAX_NODE_SZ)
 367                        return 0;
 368                return 1;
 369        }
 370
 371        /*
 372         * Round up to the next c->min_io_size boundary i.e. 'offs' is in the
 373         * last wbuf written. After that should be empty space.
 374         */
 375        empty_offs = ALIGN(offs + 1, c->min_io_size);
 376        check_len = c->leb_size - empty_offs;
 377        p = buf + empty_offs - offs;
 378
 379        for (; check_len > 0; check_len--)
 380                if (*p++ != 0xff)
 381                        return 0;
 382        return 1;
 383}
 384
 385/**
 386 * clean_buf - clean the data from an LEB sitting in a buffer.
 387 * @c: UBIFS file-system description object
 388 * @buf: buffer to clean
 389 * @lnum: LEB number to clean
 390 * @offs: offset from which to clean
 391 * @len: length of buffer
 392 *
 393 * This function pads up to the next min_io_size boundary (if there is one) and
 394 * sets empty space to all 0xff. @buf, @offs and @len are updated to the next
 395 * min_io_size boundary (if there is one).
 396 */
 397static void clean_buf(const struct ubifs_info *c, void **buf, int lnum,
 398                      int *offs, int *len)
 399{
 400        int empty_offs, pad_len;
 401
 402        lnum = lnum;
 403        dbg_rcvry("cleaning corruption at %d:%d", lnum, *offs);
 404
 405        if (c->min_io_size == 1) {
 406                memset(*buf, 0xff, c->leb_size - *offs);
 407                return;
 408        }
 409
 410        ubifs_assert(!(*offs & 7));
 411        empty_offs = ALIGN(*offs, c->min_io_size);
 412        pad_len = empty_offs - *offs;
 413        ubifs_pad(c, *buf, pad_len);
 414        *offs += pad_len;
 415        *buf += pad_len;
 416        *len -= pad_len;
 417        memset(*buf, 0xff, c->leb_size - empty_offs);
 418}
 419
 420/**
 421 * no_more_nodes - determine if there are no more nodes in a buffer.
 422 * @c: UBIFS file-system description object
 423 * @buf: buffer to check
 424 * @len: length of buffer
 425 * @lnum: LEB number of the LEB from which @buf was read
 426 * @offs: offset from which @buf was read
 427 *
 428 * This function scans @buf for more nodes and returns %0 is a node is found and
 429 * %1 if no more nodes are found.
 430 */
 431static int no_more_nodes(const struct ubifs_info *c, void *buf, int len,
 432                        int lnum, int offs)
 433{
 434        int skip, next_offs = 0;
 435
 436        if (len > UBIFS_DATA_NODE_SZ) {
 437                struct ubifs_ch *ch = buf;
 438                int dlen = le32_to_cpu(ch->len);
 439
 440                if (ch->node_type == UBIFS_DATA_NODE && dlen >= UBIFS_CH_SZ &&
 441                    dlen <= UBIFS_MAX_DATA_NODE_SZ)
 442                        /* The corrupt node looks like a data node */
 443                        next_offs = ALIGN(offs + dlen, 8);
 444        }
 445
 446        if (c->min_io_size == 1)
 447                skip = 8;
 448        else
 449                skip = ALIGN(offs + 1, c->min_io_size) - offs;
 450
 451        offs += skip;
 452        buf += skip;
 453        len -= skip;
 454        while (len > 8) {
 455                struct ubifs_ch *ch = buf;
 456                uint32_t magic = le32_to_cpu(ch->magic);
 457                int ret;
 458
 459                if (magic == UBIFS_NODE_MAGIC) {
 460                        ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1);
 461                        if (ret == SCANNED_A_NODE || ret > 0) {
 462                                /*
 463                                 * There is a small chance this is just data in
 464                                 * a data node, so check that possibility. e.g.
 465                                 * this is part of a file that itself contains
 466                                 * a UBIFS image.
 467                                 */
 468                                if (next_offs && offs + le32_to_cpu(ch->len) <=
 469                                    next_offs)
 470                                        continue;
 471                                dbg_rcvry("unexpected node at %d:%d", lnum,
 472                                          offs);
 473                                return 0;
 474                        }
 475                }
 476                offs += 8;
 477                buf += 8;
 478                len -= 8;
 479        }
 480        return 1;
 481}
 482
 483/**
 484 * fix_unclean_leb - fix an unclean LEB.
 485 * @c: UBIFS file-system description object
 486 * @sleb: scanned LEB information
 487 * @start: offset where scan started
 488 */
 489static int fix_unclean_leb(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
 490                           int start)
 491{
 492        int lnum = sleb->lnum, endpt = start;
 493
 494        /* Get the end offset of the last node we are keeping */
 495        if (!list_empty(&sleb->nodes)) {
 496                struct ubifs_scan_node *snod;
 497
 498                snod = list_entry(sleb->nodes.prev,
 499                                  struct ubifs_scan_node, list);
 500                endpt = snod->offs + snod->len;
 501        }
 502
 503        if ((c->vfs_sb->s_flags & MS_RDONLY) && !c->remounting_rw) {
 504                /* Add to recovery list */
 505                struct ubifs_unclean_leb *ucleb;
 506
 507                dbg_rcvry("need to fix LEB %d start %d endpt %d",
 508                          lnum, start, sleb->endpt);
 509                ucleb = kzalloc(sizeof(struct ubifs_unclean_leb), GFP_NOFS);
 510                if (!ucleb)
 511                        return -ENOMEM;
 512                ucleb->lnum = lnum;
 513                ucleb->endpt = endpt;
 514                list_add_tail(&ucleb->list, &c->unclean_leb_list);
 515        } else {
 516                /* Write the fixed LEB back to flash */
 517                int err;
 518
 519                dbg_rcvry("fixing LEB %d start %d endpt %d",
 520                          lnum, start, sleb->endpt);
 521                if (endpt == 0) {
 522                        err = ubifs_leb_unmap(c, lnum);
 523                        if (err)
 524                                return err;
 525                } else {
 526                        int len = ALIGN(endpt, c->min_io_size);
 527
 528                        if (start) {
 529                                err = ubi_read(c->ubi, lnum, sleb->buf, 0,
 530                                               start);
 531                                if (err)
 532                                        return err;
 533                        }
 534                        /* Pad to min_io_size */
 535                        if (len > endpt) {
 536                                int pad_len = len - ALIGN(endpt, 8);
 537
 538                                if (pad_len > 0) {
 539                                        void *buf = sleb->buf + len - pad_len;
 540
 541                                        ubifs_pad(c, buf, pad_len);
 542                                }
 543                        }
 544                        err = ubi_leb_change(c->ubi, lnum, sleb->buf, len,
 545                                             UBI_UNKNOWN);
 546                        if (err)
 547                                return err;
 548                }
 549        }
 550        return 0;
 551}
 552
 553/**
 554 * drop_incomplete_group - drop nodes from an incomplete group.
 555 * @sleb: scanned LEB information
 556 * @offs: offset of dropped nodes is returned here
 557 *
 558 * This function returns %1 if nodes are dropped and %0 otherwise.
 559 */
 560static int drop_incomplete_group(struct ubifs_scan_leb *sleb, int *offs)
 561{
 562        int dropped = 0;
 563
 564        while (!list_empty(&sleb->nodes)) {
 565                struct ubifs_scan_node *snod;
 566                struct ubifs_ch *ch;
 567
 568                snod = list_entry(sleb->nodes.prev, struct ubifs_scan_node,
 569                                  list);
 570                ch = snod->node;
 571                if (ch->group_type != UBIFS_IN_NODE_GROUP)
 572                        return dropped;
 573                dbg_rcvry("dropping node at %d:%d", sleb->lnum, snod->offs);
 574                *offs = snod->offs;
 575                list_del(&snod->list);
 576                kfree(snod);
 577                sleb->nodes_cnt -= 1;
 578                dropped = 1;
 579        }
 580        return dropped;
 581}
 582
 583/**
 584 * ubifs_recover_leb - scan and recover a LEB.
 585 * @c: UBIFS file-system description object
 586 * @lnum: LEB number
 587 * @offs: offset
 588 * @sbuf: LEB-sized buffer to use
 589 * @grouped: nodes may be grouped for recovery
 590 *
 591 * This function does a scan of a LEB, but caters for errors that might have
 592 * been caused by the unclean unmount from which we are attempting to recover.
 593 *
 594 * This function returns %0 on success and a negative error code on failure.
 595 */
 596struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum,
 597                                         int offs, void *sbuf, int grouped)
 598{
 599        int err, len = c->leb_size - offs, need_clean = 0, quiet = 1;
 600        int empty_chkd = 0, start = offs;
 601        struct ubifs_scan_leb *sleb;
 602        void *buf = sbuf + offs;
 603
 604        dbg_rcvry("%d:%d", lnum, offs);
 605
 606        sleb = ubifs_start_scan(c, lnum, offs, sbuf);
 607        if (IS_ERR(sleb))
 608                return sleb;
 609
 610        if (sleb->ecc)
 611                need_clean = 1;
 612
 613        while (len >= 8) {
 614                int ret;
 615
 616                dbg_scan("look at LEB %d:%d (%d bytes left)",
 617                         lnum, offs, len);
 618
 619                cond_resched();
 620
 621                /*
 622                 * Scan quietly until there is an error from which we cannot
 623                 * recover
 624                 */
 625                ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet);
 626
 627                if (ret == SCANNED_A_NODE) {
 628                        /* A valid node, and not a padding node */
 629                        struct ubifs_ch *ch = buf;
 630                        int node_len;
 631
 632                        err = ubifs_add_snod(c, sleb, buf, offs);
 633                        if (err)
 634                                goto error;
 635                        node_len = ALIGN(le32_to_cpu(ch->len), 8);
 636                        offs += node_len;
 637                        buf += node_len;
 638                        len -= node_len;
 639                        continue;
 640                }
 641
 642                if (ret > 0) {
 643                        /* Padding bytes or a valid padding node */
 644                        offs += ret;
 645                        buf += ret;
 646                        len -= ret;
 647                        continue;
 648                }
 649
 650                if (ret == SCANNED_EMPTY_SPACE) {
 651                        if (!is_empty(buf, len)) {
 652                                if (!is_last_write(c, buf, offs))
 653                                        break;
 654                                clean_buf(c, &buf, lnum, &offs, &len);
 655                                need_clean = 1;
 656                        }
 657                        empty_chkd = 1;
 658                        break;
 659                }
 660
 661                if (ret == SCANNED_GARBAGE || ret == SCANNED_A_BAD_PAD_NODE)
 662                        if (is_last_write(c, buf, offs)) {
 663                                clean_buf(c, &buf, lnum, &offs, &len);
 664                                need_clean = 1;
 665                                empty_chkd = 1;
 666                                break;
 667                        }
 668
 669                if (ret == SCANNED_A_CORRUPT_NODE)
 670                        if (no_more_nodes(c, buf, len, lnum, offs)) {
 671                                clean_buf(c, &buf, lnum, &offs, &len);
 672                                need_clean = 1;
 673                                empty_chkd = 1;
 674                                break;
 675                        }
 676
 677                if (quiet) {
 678                        /* Redo the last scan but noisily */
 679                        quiet = 0;
 680                        continue;
 681                }
 682
 683                switch (ret) {
 684                case SCANNED_GARBAGE:
 685                        dbg_err("garbage");
 686                        goto corrupted;
 687                case SCANNED_A_CORRUPT_NODE:
 688                case SCANNED_A_BAD_PAD_NODE:
 689                        dbg_err("bad node");
 690                        goto corrupted;
 691                default:
 692                        dbg_err("unknown");
 693                        goto corrupted;
 694                }
 695        }
 696
 697        if (!empty_chkd && !is_empty(buf, len)) {
 698                if (is_last_write(c, buf, offs)) {
 699                        clean_buf(c, &buf, lnum, &offs, &len);
 700                        need_clean = 1;
 701                } else {
 702                        ubifs_err("corrupt empty space at LEB %d:%d",
 703                                  lnum, offs);
 704                        goto corrupted;
 705                }
 706        }
 707
 708        /* Drop nodes from incomplete group */
 709        if (grouped && drop_incomplete_group(sleb, &offs)) {
 710                buf = sbuf + offs;
 711                len = c->leb_size - offs;
 712                clean_buf(c, &buf, lnum, &offs, &len);
 713                need_clean = 1;
 714        }
 715
 716        if (offs % c->min_io_size) {
 717                clean_buf(c, &buf, lnum, &offs, &len);
 718                need_clean = 1;
 719        }
 720
 721        ubifs_end_scan(c, sleb, lnum, offs);
 722
 723        if (need_clean) {
 724                err = fix_unclean_leb(c, sleb, start);
 725                if (err)
 726                        goto error;
 727        }
 728
 729        return sleb;
 730
 731corrupted:
 732        ubifs_scanned_corruption(c, lnum, offs, buf);
 733        err = -EUCLEAN;
 734error:
 735        ubifs_err("LEB %d scanning failed", lnum);
 736        ubifs_scan_destroy(sleb);
 737        return ERR_PTR(err);
 738}
 739
 740/**
 741 * get_cs_sqnum - get commit start sequence number.
 742 * @c: UBIFS file-system description object
 743 * @lnum: LEB number of commit start node
 744 * @offs: offset of commit start node
 745 * @cs_sqnum: commit start sequence number is returned here
 746 *
 747 * This function returns %0 on success and a negative error code on failure.
 748 */
 749static int get_cs_sqnum(struct ubifs_info *c, int lnum, int offs,
 750                        unsigned long long *cs_sqnum)
 751{
 752        struct ubifs_cs_node *cs_node = NULL;
 753        int err, ret;
 754
 755        dbg_rcvry("at %d:%d", lnum, offs);
 756        cs_node = kmalloc(UBIFS_CS_NODE_SZ, GFP_KERNEL);
 757        if (!cs_node)
 758                return -ENOMEM;
 759        if (c->leb_size - offs < UBIFS_CS_NODE_SZ)
 760                goto out_err;
 761        err = ubi_read(c->ubi, lnum, (void *)cs_node, offs, UBIFS_CS_NODE_SZ);
 762        if (err && err != -EBADMSG)
 763                goto out_free;
 764        ret = ubifs_scan_a_node(c, cs_node, UBIFS_CS_NODE_SZ, lnum, offs, 0);
 765        if (ret != SCANNED_A_NODE) {
 766                dbg_err("Not a valid node");
 767                goto out_err;
 768        }
 769        if (cs_node->ch.node_type != UBIFS_CS_NODE) {
 770                dbg_err("Node a CS node, type is %d", cs_node->ch.node_type);
 771                goto out_err;
 772        }
 773        if (le64_to_cpu(cs_node->cmt_no) != c->cmt_no) {
 774                dbg_err("CS node cmt_no %llu != current cmt_no %llu",
 775                        (unsigned long long)le64_to_cpu(cs_node->cmt_no),
 776                        c->cmt_no);
 777                goto out_err;
 778        }
 779        *cs_sqnum = le64_to_cpu(cs_node->ch.sqnum);
 780        dbg_rcvry("commit start sqnum %llu", *cs_sqnum);
 781        kfree(cs_node);
 782        return 0;
 783
 784out_err:
 785        err = -EINVAL;
 786out_free:
 787        ubifs_err("failed to get CS sqnum");
 788        kfree(cs_node);
 789        return err;
 790}
 791
 792/**
 793 * ubifs_recover_log_leb - scan and recover a log LEB.
 794 * @c: UBIFS file-system description object
 795 * @lnum: LEB number
 796 * @offs: offset
 797 * @sbuf: LEB-sized buffer to use
 798 *
 799 * This function does a scan of a LEB, but caters for errors that might have
 800 * been caused by the unclean unmount from which we are attempting to recover.
 801 *
 802 * This function returns %0 on success and a negative error code on failure.
 803 */
 804struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum,
 805                                             int offs, void *sbuf)
 806{
 807        struct ubifs_scan_leb *sleb;
 808        int next_lnum;
 809
 810        dbg_rcvry("LEB %d", lnum);
 811        next_lnum = lnum + 1;
 812        if (next_lnum >= UBIFS_LOG_LNUM + c->log_lebs)
 813                next_lnum = UBIFS_LOG_LNUM;
 814        if (next_lnum != c->ltail_lnum) {
 815                /*
 816                 * We can only recover at the end of the log, so check that the
 817                 * next log LEB is empty or out of date.
 818                 */
 819                sleb = ubifs_scan(c, next_lnum, 0, sbuf);
 820                if (IS_ERR(sleb))
 821                        return sleb;
 822                if (sleb->nodes_cnt) {
 823                        struct ubifs_scan_node *snod;
 824                        unsigned long long cs_sqnum = c->cs_sqnum;
 825
 826                        snod = list_entry(sleb->nodes.next,
 827                                          struct ubifs_scan_node, list);
 828                        if (cs_sqnum == 0) {
 829                                int err;
 830
 831                                err = get_cs_sqnum(c, lnum, offs, &cs_sqnum);
 832                                if (err) {
 833                                        ubifs_scan_destroy(sleb);
 834                                        return ERR_PTR(err);
 835                                }
 836                        }
 837                        if (snod->sqnum > cs_sqnum) {
 838                                ubifs_err("unrecoverable log corruption "
 839                                          "in LEB %d", lnum);
 840                                ubifs_scan_destroy(sleb);
 841                                return ERR_PTR(-EUCLEAN);
 842                        }
 843                }
 844                ubifs_scan_destroy(sleb);
 845        }
 846        return ubifs_recover_leb(c, lnum, offs, sbuf, 0);
 847}
 848
 849/**
 850 * recover_head - recover a head.
 851 * @c: UBIFS file-system description object
 852 * @lnum: LEB number of head to recover
 853 * @offs: offset of head to recover
 854 * @sbuf: LEB-sized buffer to use
 855 *
 856 * This function ensures that there is no data on the flash at a head location.
 857 *
 858 * This function returns %0 on success and a negative error code on failure.
 859 */
 860static int recover_head(const struct ubifs_info *c, int lnum, int offs,
 861                        void *sbuf)
 862{
 863        int len, err, need_clean = 0;
 864
 865        if (c->min_io_size > 1)
 866                len = c->min_io_size;
 867        else
 868                len = 512;
 869        if (offs + len > c->leb_size)
 870                len = c->leb_size - offs;
 871
 872        if (!len)
 873                return 0;
 874
 875        /* Read at the head location and check it is empty flash */
 876        err = ubi_read(c->ubi, lnum, sbuf, offs, len);
 877        if (err)
 878                need_clean = 1;
 879        else {
 880                uint8_t *p = sbuf;
 881
 882                while (len--)
 883                        if (*p++ != 0xff) {
 884                                need_clean = 1;
 885                                break;
 886                        }
 887        }
 888
 889        if (need_clean) {
 890                dbg_rcvry("cleaning head at %d:%d", lnum, offs);
 891                if (offs == 0)
 892                        return ubifs_leb_unmap(c, lnum);
 893                err = ubi_read(c->ubi, lnum, sbuf, 0, offs);
 894                if (err)
 895                        return err;
 896                return ubi_leb_change(c->ubi, lnum, sbuf, offs, UBI_UNKNOWN);
 897        }
 898
 899        return 0;
 900}
 901
 902/**
 903 * ubifs_recover_inl_heads - recover index and LPT heads.
 904 * @c: UBIFS file-system description object
 905 * @sbuf: LEB-sized buffer to use
 906 *
 907 * This function ensures that there is no data on the flash at the index and
 908 * LPT head locations.
 909 *
 910 * This deals with the recovery of a half-completed journal commit. UBIFS is
 911 * careful never to overwrite the last version of the index or the LPT. Because
 912 * the index and LPT are wandering trees, data from a half-completed commit will
 913 * not be referenced anywhere in UBIFS. The data will be either in LEBs that are
 914 * assumed to be empty and will be unmapped anyway before use, or in the index
 915 * and LPT heads.
 916 *
 917 * This function returns %0 on success and a negative error code on failure.
 918 */
 919int ubifs_recover_inl_heads(const struct ubifs_info *c, void *sbuf)
 920{
 921        int err;
 922
 923        ubifs_assert(!(c->vfs_sb->s_flags & MS_RDONLY) || c->remounting_rw);
 924
 925        dbg_rcvry("checking index head at %d:%d", c->ihead_lnum, c->ihead_offs);
 926        err = recover_head(c, c->ihead_lnum, c->ihead_offs, sbuf);
 927        if (err)
 928                return err;
 929
 930        dbg_rcvry("checking LPT head at %d:%d", c->nhead_lnum, c->nhead_offs);
 931        err = recover_head(c, c->nhead_lnum, c->nhead_offs, sbuf);
 932        if (err)
 933                return err;
 934
 935        return 0;
 936}
 937
 938/**
 939 *  clean_an_unclean_leb - read and write a LEB to remove corruption.
 940 * @c: UBIFS file-system description object
 941 * @ucleb: unclean LEB information
 942 * @sbuf: LEB-sized buffer to use
 943 *
 944 * This function reads a LEB up to a point pre-determined by the mount recovery,
 945 * checks the nodes, and writes the result back to the flash, thereby cleaning
 946 * off any following corruption, or non-fatal ECC errors.
 947 *
 948 * This function returns %0 on success and a negative error code on failure.
 949 */
 950static int clean_an_unclean_leb(const struct ubifs_info *c,
 951                                struct ubifs_unclean_leb *ucleb, void *sbuf)
 952{
 953        int err, lnum = ucleb->lnum, offs = 0, len = ucleb->endpt, quiet = 1;
 954        void *buf = sbuf;
 955
 956        dbg_rcvry("LEB %d len %d", lnum, len);
 957
 958        if (len == 0) {
 959                /* Nothing to read, just unmap it */
 960                err = ubifs_leb_unmap(c, lnum);
 961                if (err)
 962                        return err;
 963                return 0;
 964        }
 965
 966        err = ubi_read(c->ubi, lnum, buf, offs, len);
 967        if (err && err != -EBADMSG)
 968                return err;
 969
 970        while (len >= 8) {
 971                int ret;
 972
 973                cond_resched();
 974
 975                /* Scan quietly until there is an error */
 976                ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet);
 977
 978                if (ret == SCANNED_A_NODE) {
 979                        /* A valid node, and not a padding node */
 980                        struct ubifs_ch *ch = buf;
 981                        int node_len;
 982
 983                        node_len = ALIGN(le32_to_cpu(ch->len), 8);
 984                        offs += node_len;
 985                        buf += node_len;
 986                        len -= node_len;
 987                        continue;
 988                }
 989
 990                if (ret > 0) {
 991                        /* Padding bytes or a valid padding node */
 992                        offs += ret;
 993                        buf += ret;
 994                        len -= ret;
 995                        continue;
 996                }
 997
 998                if (ret == SCANNED_EMPTY_SPACE) {
 999                        ubifs_err("unexpected empty space at %d:%d",
1000                                  lnum, offs);
1001                        return -EUCLEAN;
1002                }
1003
1004                if (quiet) {
1005                        /* Redo the last scan but noisily */
1006                        quiet = 0;
1007                        continue;
1008                }
1009
1010                ubifs_scanned_corruption(c, lnum, offs, buf);
1011                return -EUCLEAN;
1012        }
1013
1014        /* Pad to min_io_size */
1015        len = ALIGN(ucleb->endpt, c->min_io_size);
1016        if (len > ucleb->endpt) {
1017                int pad_len = len - ALIGN(ucleb->endpt, 8);
1018
1019                if (pad_len > 0) {
1020                        buf = c->sbuf + len - pad_len;
1021                        ubifs_pad(c, buf, pad_len);
1022                }
1023        }
1024
1025        /* Write back the LEB atomically */
1026        err = ubi_leb_change(c->ubi, lnum, sbuf, len, UBI_UNKNOWN);
1027        if (err)
1028                return err;
1029
1030        dbg_rcvry("cleaned LEB %d", lnum);
1031
1032        return 0;
1033}
1034
1035/**
1036 * ubifs_clean_lebs - clean LEBs recovered during read-only mount.
1037 * @c: UBIFS file-system description object
1038 * @sbuf: LEB-sized buffer to use
1039 *
1040 * This function cleans a LEB identified during recovery that needs to be
1041 * written but was not because UBIFS was mounted read-only. This happens when
1042 * remounting to read-write mode.
1043 *
1044 * This function returns %0 on success and a negative error code on failure.
1045 */
1046int ubifs_clean_lebs(const struct ubifs_info *c, void *sbuf)
1047{
1048        dbg_rcvry("recovery");
1049        while (!list_empty(&c->unclean_leb_list)) {
1050                struct ubifs_unclean_leb *ucleb;
1051                int err;
1052
1053                ucleb = list_entry(c->unclean_leb_list.next,
1054                                   struct ubifs_unclean_leb, list);
1055                err = clean_an_unclean_leb(c, ucleb, sbuf);
1056                if (err)
1057                        return err;
1058                list_del(&ucleb->list);
1059                kfree(ucleb);
1060        }
1061        return 0;
1062}
1063
1064/**
1065 * ubifs_rcvry_gc_commit - recover the GC LEB number and run the commit.
1066 * @c: UBIFS file-system description object
1067 *
1068 * Out-of-place garbage collection requires always one empty LEB with which to
1069 * start garbage collection. The LEB number is recorded in c->gc_lnum and is
1070 * written to the master node on unmounting. In the case of an unclean unmount
1071 * the value of gc_lnum recorded in the master node is out of date and cannot
1072 * be used. Instead, recovery must allocate an empty LEB for this purpose.
1073 * However, there may not be enough empty space, in which case it must be
1074 * possible to GC the dirtiest LEB into the GC head LEB.
1075 *
1076 * This function also runs the commit which causes the TNC updates from
1077 * size-recovery and orphans to be written to the flash. That is important to
1078 * ensure correct replay order for subsequent mounts.
1079 *
1080 * This function returns %0 on success and a negative error code on failure.
1081 */
1082int ubifs_rcvry_gc_commit(struct ubifs_info *c)
1083{
1084        struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf;
1085        struct ubifs_lprops lp;
1086        int lnum, err;
1087
1088        c->gc_lnum = -1;
1089        if (wbuf->lnum == -1) {
1090                dbg_rcvry("no GC head LEB");
1091                goto find_free;
1092        }
1093        /*
1094         * See whether the used space in the dirtiest LEB fits in the GC head
1095         * LEB.
1096         */
1097        if (wbuf->offs == c->leb_size) {
1098                dbg_rcvry("no room in GC head LEB");
1099                goto find_free;
1100        }
1101        err = ubifs_find_dirty_leb(c, &lp, wbuf->offs, 2);
1102        if (err) {
1103                if (err == -ENOSPC)
1104                        dbg_err("could not find a dirty LEB");
1105                return err;
1106        }
1107        ubifs_assert(!(lp.flags & LPROPS_INDEX));
1108        lnum = lp.lnum;
1109        if (lp.free + lp.dirty == c->leb_size) {
1110                /* An empty LEB was returned */
1111                if (lp.free != c->leb_size) {
1112                        err = ubifs_change_one_lp(c, lnum, c->leb_size,
1113                                                  0, 0, 0, 0);
1114                        if (err)
1115                                return err;
1116                }
1117                err = ubifs_leb_unmap(c, lnum);
1118                if (err)
1119                        return err;
1120                c->gc_lnum = lnum;
1121                dbg_rcvry("allocated LEB %d for GC", lnum);
1122                /* Run the commit */
1123                dbg_rcvry("committing");
1124                return ubifs_run_commit(c);
1125        }
1126        /*
1127         * There was no empty LEB so the used space in the dirtiest LEB must fit
1128         * in the GC head LEB.
1129         */
1130        if (lp.free + lp.dirty < wbuf->offs) {
1131                dbg_rcvry("LEB %d doesn't fit in GC head LEB %d:%d",
1132                          lnum, wbuf->lnum, wbuf->offs);
1133                err = ubifs_return_leb(c, lnum);
1134                if (err)
1135                        return err;
1136                goto find_free;
1137        }
1138        /*
1139         * We run the commit before garbage collection otherwise subsequent
1140         * mounts will see the GC and orphan deletion in a different order.
1141         */
1142        dbg_rcvry("committing");
1143        err = ubifs_run_commit(c);
1144        if (err)
1145                return err;
1146        /*
1147         * The data in the dirtiest LEB fits in the GC head LEB, so do the GC
1148         * - use locking to keep 'ubifs_assert()' happy.
1149         */
1150        dbg_rcvry("GC'ing LEB %d", lnum);
1151        mutex_lock_nested(&wbuf->io_mutex, wbuf->jhead);
1152        err = ubifs_garbage_collect_leb(c, &lp);
1153        if (err >= 0) {
1154                int err2 = ubifs_wbuf_sync_nolock(wbuf);
1155
1156                if (err2)
1157                        err = err2;
1158        }
1159        mutex_unlock(&wbuf->io_mutex);
1160        if (err < 0) {
1161                dbg_err("GC failed, error %d", err);
1162                if (err == -EAGAIN)
1163                        err = -EINVAL;
1164                return err;
1165        }
1166        if (err != LEB_RETAINED) {
1167                dbg_err("GC returned %d", err);
1168                return -EINVAL;
1169        }
1170        err = ubifs_leb_unmap(c, c->gc_lnum);
1171        if (err)
1172                return err;
1173        dbg_rcvry("allocated LEB %d for GC", lnum);
1174        return 0;
1175
1176find_free:
1177        /*
1178         * There is no GC head LEB or the free space in the GC head LEB is too
1179         * small. Allocate gc_lnum by calling 'ubifs_find_free_leb_for_idx()' so
1180         * GC is not run.
1181         */
1182        lnum = ubifs_find_free_leb_for_idx(c);
1183        if (lnum < 0) {
1184                dbg_err("could not find an empty LEB");
1185                return lnum;
1186        }
1187        /* And reset the index flag */
1188        err = ubifs_change_one_lp(c, lnum, LPROPS_NC, LPROPS_NC, 0,
1189                                  LPROPS_INDEX, 0);
1190        if (err)
1191                return err;
1192        c->gc_lnum = lnum;
1193        dbg_rcvry("allocated LEB %d for GC", lnum);
1194        /* Run the commit */
1195        dbg_rcvry("committing");
1196        return ubifs_run_commit(c);
1197}
1198
1199/**
1200 * struct size_entry - inode size information for recovery.
1201 * @rb: link in the RB-tree of sizes
1202 * @inum: inode number
1203 * @i_size: size on inode
1204 * @d_size: maximum size based on data nodes
1205 * @exists: indicates whether the inode exists
1206 * @inode: inode if pinned in memory awaiting rw mode to fix it
1207 */
1208struct size_entry {
1209        struct rb_node rb;
1210        ino_t inum;
1211        loff_t i_size;
1212        loff_t d_size;
1213        int exists;
1214        struct inode *inode;
1215};
1216
1217/**
1218 * add_ino - add an entry to the size tree.
1219 * @c: UBIFS file-system description object
1220 * @inum: inode number
1221 * @i_size: size on inode
1222 * @d_size: maximum size based on data nodes
1223 * @exists: indicates whether the inode exists
1224 */
1225static int add_ino(struct ubifs_info *c, ino_t inum, loff_t i_size,
1226                   loff_t d_size, int exists)
1227{
1228        struct rb_node **p = &c->size_tree.rb_node, *parent = NULL;
1229        struct size_entry *e;
1230
1231        while (*p) {
1232                parent = *p;
1233                e = rb_entry(parent, struct size_entry, rb);
1234                if (inum < e->inum)
1235                        p = &(*p)->rb_left;
1236                else
1237                        p = &(*p)->rb_right;
1238        }
1239
1240        e = kzalloc(sizeof(struct size_entry), GFP_KERNEL);
1241        if (!e)
1242                return -ENOMEM;
1243
1244        e->inum = inum;
1245        e->i_size = i_size;
1246        e->d_size = d_size;
1247        e->exists = exists;
1248
1249        rb_link_node(&e->rb, parent, p);
1250        rb_insert_color(&e->rb, &c->size_tree);
1251
1252        return 0;
1253}
1254
1255/**
1256 * find_ino - find an entry on the size tree.
1257 * @c: UBIFS file-system description object
1258 * @inum: inode number
1259 */
1260static struct size_entry *find_ino(struct ubifs_info *c, ino_t inum)
1261{
1262        struct rb_node *p = c->size_tree.rb_node;
1263        struct size_entry *e;
1264
1265        while (p) {
1266                e = rb_entry(p, struct size_entry, rb);
1267                if (inum < e->inum)
1268                        p = p->rb_left;
1269                else if (inum > e->inum)
1270                        p = p->rb_right;
1271                else
1272                        return e;
1273        }
1274        return NULL;
1275}
1276
1277/**
1278 * remove_ino - remove an entry from the size tree.
1279 * @c: UBIFS file-system description object
1280 * @inum: inode number
1281 */
1282static void remove_ino(struct ubifs_info *c, ino_t inum)
1283{
1284        struct size_entry *e = find_ino(c, inum);
1285
1286        if (!e)
1287                return;
1288        rb_erase(&e->rb, &c->size_tree);
1289        kfree(e);
1290}
1291
1292/**
1293 * ubifs_destroy_size_tree - free resources related to the size tree.
1294 * @c: UBIFS file-system description object
1295 */
1296void ubifs_destroy_size_tree(struct ubifs_info *c)
1297{
1298        struct rb_node *this = c->size_tree.rb_node;
1299        struct size_entry *e;
1300
1301        while (this) {
1302                if (this->rb_left) {
1303                        this = this->rb_left;
1304                        continue;
1305                } else if (this->rb_right) {
1306                        this = this->rb_right;
1307                        continue;
1308                }
1309                e = rb_entry(this, struct size_entry, rb);
1310                if (e->inode)
1311                        iput(e->inode);
1312                this = rb_parent(this);
1313                if (this) {
1314                        if (this->rb_left == &e->rb)
1315                                this->rb_left = NULL;
1316                        else
1317                                this->rb_right = NULL;
1318                }
1319                kfree(e);
1320        }
1321        c->size_tree = RB_ROOT;
1322}
1323
1324/**
1325 * ubifs_recover_size_accum - accumulate inode sizes for recovery.
1326 * @c: UBIFS file-system description object
1327 * @key: node key
1328 * @deletion: node is for a deletion
1329 * @new_size: inode size
1330 *
1331 * This function has two purposes:
1332 *     1) to ensure there are no data nodes that fall outside the inode size
1333 *     2) to ensure there are no data nodes for inodes that do not exist
1334 * To accomplish those purposes, a rb-tree is constructed containing an entry
1335 * for each inode number in the journal that has not been deleted, and recording
1336 * the size from the inode node, the maximum size of any data node (also altered
1337 * by truncations) and a flag indicating a inode number for which no inode node
1338 * was present in the journal.
1339 *
1340 * Note that there is still the possibility that there are data nodes that have
1341 * been committed that are beyond the inode size, however the only way to find
1342 * them would be to scan the entire index. Alternatively, some provision could
1343 * be made to record the size of inodes at the start of commit, which would seem
1344 * very cumbersome for a scenario that is quite unlikely and the only negative
1345 * consequence of which is wasted space.
1346 *
1347 * This functions returns %0 on success and a negative error code on failure.
1348 */
1349int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key,
1350                             int deletion, loff_t new_size)
1351{
1352        ino_t inum = key_inum(c, key);
1353        struct size_entry *e;
1354        int err;
1355
1356        switch (key_type(c, key)) {
1357        case UBIFS_INO_KEY:
1358                if (deletion)
1359                        remove_ino(c, inum);
1360                else {
1361                        e = find_ino(c, inum);
1362                        if (e) {
1363                                e->i_size = new_size;
1364                                e->exists = 1;
1365                        } else {
1366                                err = add_ino(c, inum, new_size, 0, 1);
1367                                if (err)
1368                                        return err;
1369                        }
1370                }
1371                break;
1372        case UBIFS_DATA_KEY:
1373                e = find_ino(c, inum);
1374                if (e) {
1375                        if (new_size > e->d_size)
1376                                e->d_size = new_size;
1377                } else {
1378                        err = add_ino(c, inum, 0, new_size, 0);
1379                        if (err)
1380                                return err;
1381                }
1382                break;
1383        case UBIFS_TRUN_KEY:
1384                e = find_ino(c, inum);
1385                if (e)
1386                        e->d_size = new_size;
1387                break;
1388        }
1389        return 0;
1390}
1391
1392/**
1393 * fix_size_in_place - fix inode size in place on flash.
1394 * @c: UBIFS file-system description object
1395 * @e: inode size information for recovery
1396 */
1397static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e)
1398{
1399        struct ubifs_ino_node *ino = c->sbuf;
1400        unsigned char *p;
1401        union ubifs_key key;
1402        int err, lnum, offs, len;
1403        loff_t i_size;
1404        uint32_t crc;
1405
1406        /* Locate the inode node LEB number and offset */
1407        ino_key_init(c, &key, e->inum);
1408        err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs);
1409        if (err)
1410                goto out;
1411        /*
1412         * If the size recorded on the inode node is greater than the size that
1413         * was calculated from nodes in the journal then don't change the inode.
1414         */
1415        i_size = le64_to_cpu(ino->size);
1416        if (i_size >= e->d_size)
1417                return 0;
1418        /* Read the LEB */
1419        err = ubi_read(c->ubi, lnum, c->sbuf, 0, c->leb_size);
1420        if (err)
1421                goto out;
1422        /* Change the size field and recalculate the CRC */
1423        ino = c->sbuf + offs;
1424        ino->size = cpu_to_le64(e->d_size);
1425        len = le32_to_cpu(ino->ch.len);
1426        crc = crc32(UBIFS_CRC32_INIT, (void *)ino + 8, len - 8);
1427        ino->ch.crc = cpu_to_le32(crc);
1428        /* Work out where data in the LEB ends and free space begins */
1429        p = c->sbuf;
1430        len = c->leb_size - 1;
1431        while (p[len] == 0xff)
1432                len -= 1;
1433        len = ALIGN(len + 1, c->min_io_size);
1434        /* Atomically write the fixed LEB back again */
1435        err = ubi_leb_change(c->ubi, lnum, c->sbuf, len, UBI_UNKNOWN);
1436        if (err)
1437                goto out;
1438        dbg_rcvry("inode %lu at %d:%d size %lld -> %lld ",
1439                  (unsigned long)e->inum, lnum, offs, i_size, e->d_size);
1440        return 0;
1441
1442out:
1443        ubifs_warn("inode %lu failed to fix size %lld -> %lld error %d",
1444                   (unsigned long)e->inum, e->i_size, e->d_size, err);
1445        return err;
1446}
1447
1448/**
1449 * ubifs_recover_size - recover inode size.
1450 * @c: UBIFS file-system description object
1451 *
1452 * This function attempts to fix inode size discrepancies identified by the
1453 * 'ubifs_recover_size_accum()' function.
1454 *
1455 * This functions returns %0 on success and a negative error code on failure.
1456 */
1457int ubifs_recover_size(struct ubifs_info *c)
1458{
1459        struct rb_node *this = rb_first(&c->size_tree);
1460
1461        while (this) {
1462                struct size_entry *e;
1463                int err;
1464
1465                e = rb_entry(this, struct size_entry, rb);
1466                if (!e->exists) {
1467                        union ubifs_key key;
1468
1469                        ino_key_init(c, &key, e->inum);
1470                        err = ubifs_tnc_lookup(c, &key, c->sbuf);
1471                        if (err && err != -ENOENT)
1472                                return err;
1473                        if (err == -ENOENT) {
1474                                /* Remove data nodes that have no inode */
1475                                dbg_rcvry("removing ino %lu",
1476                                          (unsigned long)e->inum);
1477                                err = ubifs_tnc_remove_ino(c, e->inum);
1478                                if (err)
1479                                        return err;
1480                        } else {
1481                                struct ubifs_ino_node *ino = c->sbuf;
1482
1483                                e->exists = 1;
1484                                e->i_size = le64_to_cpu(ino->size);
1485                        }
1486                }
1487                if (e->exists && e->i_size < e->d_size) {
1488                        if (!e->inode && (c->vfs_sb->s_flags & MS_RDONLY)) {
1489                                /* Fix the inode size and pin it in memory */
1490                                struct inode *inode;
1491
1492                                inode = ubifs_iget(c->vfs_sb, e->inum);
1493                                if (IS_ERR(inode))
1494                                        return PTR_ERR(inode);
1495                                if (inode->i_size < e->d_size) {
1496                                        dbg_rcvry("ino %lu size %lld -> %lld",
1497                                                  (unsigned long)e->inum,
1498                                                  e->d_size, inode->i_size);
1499                                        inode->i_size = e->d_size;
1500                                        ubifs_inode(inode)->ui_size = e->d_size;
1501                                        e->inode = inode;
1502                                        this = rb_next(this);
1503                                        continue;
1504                                }
1505                                iput(inode);
1506                        } else {
1507                                /* Fix the size in place */
1508                                err = fix_size_in_place(c, e);
1509                                if (err)
1510                                        return err;
1511                                if (e->inode)
1512                                        iput(e->inode);
1513                        }
1514                }
1515                this = rb_next(this);
1516                rb_erase(&e->rb, &c->size_tree);
1517                kfree(e);
1518        }
1519        return 0;
1520}
1521
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.