1. 10 6月, 2009 1 次提交
  2. 18 5月, 2009 1 次提交
    • A
      UBI: fix races in I/O debugging checks · ffb6b7e4
      Artem Bityutskiy 提交于
      When paranoid checs are enabled, the 'io_paral' test from the
      'mtd-utils' package fails. The symptoms are:
      
      UBI error: paranoid_check_all_ff: flash region at PEB 3973:512, length 15872 does not contain all 0xFF bytes
      UBI error: paranoid_check_all_ff: paranoid check failed for PEB 3973
      UBI: hex dump of the 512-16384 region
      
      It turned out to be a bug in the checking function. Suppose there
      are 2 tasks - A and B. Task A is the wear-levelling working
      ('wear_leveling_worker()'). It is reading the VID header to find
      which LEB this PEB belongs to. Say, task A is reading header
      of PEB X. Suppose PEB X is unmapped, and has no VID header.
      Task B is trying to write to PEB X.
      
      Task A: in 'ubi_io_read_vid_hdr()': reads the VID header from PEB X.
              The read data contain all 0xFF bytes.
      Task B: writes VID header and some data to PEB X
      Task A: assumes PEB X is empty, calls 'paranoid_check_all_ff()', which
              fails.
      
      The solution for this problem is to make 'paranoid_check_all_ff()'
      re-read the VID header, re-check it, and only if it is not there,
      check the rest. This now implemented by the 'paranoid_check_empty()'
      function.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      ffb6b7e4
  3. 06 1月, 2009 1 次提交
  4. 28 12月, 2008 1 次提交
  5. 03 12月, 2008 1 次提交
    • A
      UBI: fix warnings when debugging is enabled · ed45819f
      Artem Bityutskiy 提交于
      The 'ubi_io_read_vid_hdr()' and 'ubi_io_read_ec_hdr()' function
      have the 'verbose' argument which controls whether they should
      print a warning if the VID/EC header was not found or was corrupted.
      Some callers require the headers to be OK, and pass 1. Some allow
      a corrupted/not present header, and pass 0.
      
             if (UBI_IO_DEBUG)
                     verbose = 1;
      
      And UBI_IO_DEBUG is 1 if CONFIG_MTD_UBI_DEBUG_MSG_BLD is true. So in
      this case the warning is printed all the time. This confuses people.
      
      Thus, do not print the messages as warnings if UBI_IO_DEBUG is true,
      but print them as debugging messages instead.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      ed45819f
  6. 24 7月, 2008 5 次提交
  7. 17 4月, 2008 1 次提交
  8. 27 12月, 2007 1 次提交
    • A
      UBI: fix error code in ubi_io_read() · 2362a53e
      Artem Bityutskiy 提交于
      When NAND detects an ECC error, it returns -EBADMSG. It does not
      stop reading requested data if one page has an ECC error, it keeps
      going and reads all the requested data. If it fails to read all
      the data, it does not return -EBADMSG, but returns the error code
      which reflects the reason of the failure.
      
      But some drivers may have bugs (e.g., OneNAND had) and stop reading
      after the first ECC error, so it returns -EBADMSG. In turn, UBI
      propagates this up to the caller. The caller will treat this as
      "all the requested data was read, but there was an ECC error".
      
      So we change the error code to -EIO if it is -EBADMSG and the read
      length is less then the requested length. We also add an assertion,
      so if UBI debugging is enabled, UBI will bug.
      Pointed-to-by: NAdrian Hunter <ext-adrian.hunter@nokia.com>
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      2362a53e
  9. 14 10月, 2007 5 次提交
  10. 18 7月, 2007 4 次提交
  11. 27 4月, 2007 1 次提交
    • A
      UBI: Unsorted Block Images · 801c135c
      Artem B. Bityutskiy 提交于
      UBI (Latin: "where?") manages multiple logical volumes on a single
      flash device, specifically supporting NAND flash devices. UBI provides
      a flexible partitioning concept which still allows for wear-levelling
      across the whole flash device.
      
      In a sense, UBI may be compared to the Logical Volume Manager
      (LVM). Whereas LVM maps logical sector numbers to physical HDD sector
      numbers, UBI maps logical eraseblocks to physical eraseblocks.
      
      More information may be found at
      http://www.linux-mtd.infradead.org/doc/ubi.html
      
      Partitioning/Re-partitioning
      
        An UBI volume occupies a certain number of erase blocks. This is
        limited by a configured maximum volume size, which could also be
        viewed as the partition size. Each individual UBI volume's size can
        be changed independently of the other UBI volumes, provided that the
        sum of all volume sizes doesn't exceed a certain limit.
      
        UBI supports dynamic volumes and static volumes. Static volumes are
        read-only and their contents are protected by CRC check sums.
      
      Bad eraseblocks handling
      
        UBI transparently handles bad eraseblocks. When a physical
        eraseblock becomes bad, it is substituted by a good physical
        eraseblock, and the user does not even notice this.
      
      Scrubbing
      
        On a NAND flash bit flips can occur on any write operation,
        sometimes also on read. If bit flips persist on the device, at first
        they can still be corrected by ECC, but once they accumulate,
        correction will become impossible. Thus it is best to actively scrub
        the affected eraseblock, by first copying it to a free eraseblock
        and then erasing the original. The UBI layer performs this type of
        scrubbing under the covers, transparently to the UBI volume users.
      
      Erase Counts
      
        UBI maintains an erase count header per eraseblock. This frees
        higher-level layers (like file systems) from doing this and allows
        for centralized erase count management instead. The erase counts are
        used by the wear-levelling algorithm in the UBI layer. The algorithm
        itself is exchangeable.
      
      Booting from NAND
      
        For booting directly from NAND flash the hardware must at least be
        capable of fetching and executing a small portion of the NAND
        flash. Some NAND flash controllers have this kind of support. They
        usually limit the window to a few kilobytes in erase block 0. This
        "initial program loader" (IPL) must then contain sufficient logic to
        load and execute the next boot phase.
      
        Due to bad eraseblocks, which may be randomly scattered over the
        flash device, it is problematic to store the "secondary program
        loader" (SPL) statically. Also, due to bit-flips it may become
        corrupted over time. UBI allows to solve this problem gracefully by
        storing the SPL in a small static UBI volume.
      
      UBI volumes vs. static partitions
      
        UBI volumes are still very similar to static MTD partitions:
      
          * both consist of eraseblocks (logical eraseblocks in case of UBI
            volumes, and physical eraseblocks in case of static partitions;
          * both support three basic operations - read, write, erase.
      
        But UBI volumes have the following advantages over traditional
        static MTD partitions:
      
          * there are no eraseblock wear-leveling constraints in case of UBI
            volumes, so the user should not care about this;
          * there are no bit-flips and bad eraseblocks in case of UBI volumes.
      
        So, UBI volumes may be considered as flash devices with relaxed
        restrictions.
      
      Where can it be found?
      
        Documentation, kernel code and applications can be found in the MTD
        gits.
      
      What are the applications for?
      
        The applications help to create binary flash images for two purposes: pfi
        files (partial flash images) for in-system update of UBI volumes, and plain
        binary images, with or without OOB data in case of NAND, for a manufacturing
        step. Furthermore some tools are/and will be created that allow flash content
        analysis after a system has crashed..
      
      Who did UBI?
      
        The original ideas, where UBI is based on, were developed by Andreas
        Arnez, Frank Haverkamp and Thomas Gleixner. Josh W. Boyer and some others
        were involved too. The implementation of the kernel layer was done by Artem
        B. Bityutskiy. The user-space applications and tools were written by Oliver
        Lohmann with contributions from Frank Haverkamp, Andreas Arnez, and Artem.
        Joern Engel contributed a patch which modifies JFFS2 so that it can be run on
        a UBI volume. Thomas Gleixner did modifications to the NAND layer. Alexander
        Schmidt made some testing work as well as core functionality improvements.
      Signed-off-by: NArtem B. Bityutskiy <dedekind@linutronix.de>
      Signed-off-by: NFrank Haverkamp <haver@vnet.ibm.com>
      801c135c