1801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/* 2801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Copyright (c) International Business Machines Corp., 2006 3801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 4801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This program is free software; you can redistribute it and/or modify 5801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * it under the terms of the GNU General Public License as published by 6801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * the Free Software Foundation; either version 2 of the License, or 7801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * (at your option) any later version. 8801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 9801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This program is distributed in the hope that it will be useful, 10801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * but WITHOUT ANY WARRANTY; without even the implied warranty of 11801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * the GNU General Public License for more details. 13801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 14801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * You should have received a copy of the GNU General Public License 15801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * along with this program; if not, write to the Free Software 16801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 18801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Author: Artem Bityutskiy (Битюцкий Артём) 19801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 20801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 21801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/* 22fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * UBI attaching sub-system. 23801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 24fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * This sub-system is responsible for attaching MTD devices and it also 25fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * implements flash media scanning. 26801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 27a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * The attaching information is represented by a &struct ubi_attach_info' 28fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * object. Information about volumes is represented by &struct ubi_ainf_volume 29fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * objects which are kept in volume RB-tree with root at the @volumes field. 30fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * The RB-tree is indexed by the volume ID. 31801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 32fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * Logical eraseblocks are represented by &struct ubi_ainf_peb objects. These 33fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * objects are kept in per-volume RB-trees with the root at the corresponding 34fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * &struct ubi_ainf_volume object. To put it differently, we keep an RB-tree of 35fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * per-volume objects and each of these objects is the root of RB-tree of 36fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * per-LEB objects. 37801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 38801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Corrupted physical eraseblocks are put to the @corr list, free physical 39801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * eraseblocks are put to the @free list and the physical eraseblock to be 40801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * erased are put to the @erase list. 410525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 42fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * About corruptions 43fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * ~~~~~~~~~~~~~~~~~ 44fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * 45fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * UBI protects EC and VID headers with CRC-32 checksums, so it can detect 46fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * whether the headers are corrupted or not. Sometimes UBI also protects the 47fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * data with CRC-32, e.g., when it executes the atomic LEB change operation, or 48fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * when it moves the contents of a PEB for wear-leveling purposes. 49fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * 500525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * UBI tries to distinguish between 2 types of corruptions. 51fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * 52fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * 1. Corruptions caused by power cuts. These are expected corruptions and UBI 53fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * tries to handle them gracefully, without printing too many warnings and 54fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * error messages. The idea is that we do not lose important data in these 55fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * cases - we may lose only the data which were being written to the media just 56fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * before the power cut happened, and the upper layers (e.g., UBIFS) are 57fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * supposed to handle such data losses (e.g., by using the FS journal). 58fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * 59fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * When UBI detects a corruption (CRC-32 mismatch) in a PEB, and it looks like 60fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * the reason is a power cut, UBI puts this PEB to the @erase list, and all 61fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * PEBs in the @erase list are scheduled for erasure later. 620525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 630525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 2. Unexpected corruptions which are not caused by power cuts. During 64fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * attaching, such PEBs are put to the @corr list and UBI preserves them. 65fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * Obviously, this lessens the amount of available PEBs, and if at some point 66fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * UBI runs out of free PEBs, it switches to R/O mode. UBI also loudly informs 67fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * about such PEBs every time the MTD device is attached. 6845aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * 6945aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * However, it is difficult to reliably distinguish between these types of 70fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * corruptions and UBI's strategy is as follows (in case of attaching by 71fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * scanning). UBI assumes corruption type 2 if the VID header is corrupted and 72fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * the data area does not contain all 0xFFs, and there were no bit-flips or 73fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * integrity errors (e.g., ECC errors in case of NAND) while reading the data 74fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * area. Otherwise UBI assumes corruption type 1. So the decision criteria 75fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * are as follows. 76fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * o If the data area contains only 0xFFs, there are no data, and it is safe 77fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * to just erase this PEB - this is corruption type 1. 78fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * o If the data area has bit-flips or data integrity errors (ECC errors on 7945aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * NAND), it is probably a PEB which was being erased when power cut 80fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * happened, so this is corruption type 1. However, this is just a guess, 81fef2deb31f6523203a3fa1af485a5f1fef19cf6bArtem Bityutskiy * which might be wrong. 8255393ba1bdedc5ded79b34b4cc08898a7776cddbBrian Norris * o Otherwise this is corruption type 2. 83801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 84801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 85801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy#include <linux/err.h> 865a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 87801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy#include <linux/crc32.h> 883013ee31b6c5fd9a49a81816d6c13e1cdb7a1288Artem Bityutskiy#include <linux/math64.h> 89095751a6e0838a712393a74eb0b7b6559dbdbe81Matthieu CASTET#include <linux/random.h> 90801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy#include "ubi.h" 91801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 92a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiystatic int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai); 93801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 94801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/* Temporary variables used during scanning */ 95801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiystatic struct ubi_ec_hdr *ech; 96801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiystatic struct ubi_vid_hdr *vidh; 97801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 98941dfb07ed91451b1c58626a0d258dfdf468b593Artem Bityutskiy/** 9978d87c95b89ccf86c142494beada3082810ed368Artem Bityutskiy * add_to_list - add physical eraseblock to a list. 100a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 10178d87c95b89ccf86c142494beada3082810ed368Artem Bityutskiy * @pnum: physical eraseblock number to add 1026dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon * @vol_id: the last used volume id for the PEB 1036dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon * @lnum: the last used LEB number for the PEB 10478d87c95b89ccf86c142494beada3082810ed368Artem Bityutskiy * @ec: erase counter of the physical eraseblock 1050525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * @to_head: if not zero, add to the head of the list 10678d87c95b89ccf86c142494beada3082810ed368Artem Bityutskiy * @list: the list to add to 10778d87c95b89ccf86c142494beada3082810ed368Artem Bityutskiy * 108fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * This function allocates a 'struct ubi_ainf_peb' object for physical 109fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * eraseblock @pnum and adds it to the "free", "erase", or "alien" lists. 1106dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon * It stores the @lnum and @vol_id alongside, which can both be 1116dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon * %UBI_UNKNOWN if they are not available, not readable, or not assigned. 1120525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * If @to_head is not zero, PEB will be added to the head of the list, which 1130525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * basically means it will be processed first later. E.g., we add corrupted 1140525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * PEBs (corrupted due to power cuts) to the head of the erase list to make 1150525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * sure we erase them first and get rid of corruptions ASAP. This function 1160525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * returns zero in case of success and a negative error code in case of 1173fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy * failure. 11878d87c95b89ccf86c142494beada3082810ed368Artem Bityutskiy */ 1196dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardonstatic int add_to_list(struct ubi_attach_info *ai, int pnum, int vol_id, 1206dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon int lnum, int ec, int to_head, struct list_head *list) 121801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 1222c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb; 123801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 124a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (list == &ai->free) { 125801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("add to free: PEB %d, EC %d", pnum, ec); 126a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy } else if (list == &ai->erase) { 127801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("add to erase: PEB %d, EC %d", pnum, ec); 128a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy } else if (list == &ai->alien) { 129801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("add to alien: PEB %d, EC %d", pnum, ec); 130a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->alien_peb_count += 1; 13133789fb9d4470e27d18596c0966339e2ca8865a9Artem Bityutskiy } else 132801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy BUG(); 133801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1341fc2e3e59d78999fc4be7349af769cf6621b9e61Artem Bityutskiy aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); 1352c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (!aeb) 136801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -ENOMEM; 137801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1382c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->pnum = pnum; 1396dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon aeb->vol_id = vol_id; 1406dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon aeb->lnum = lnum; 1412c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->ec = ec; 1420525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy if (to_head) 1432c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy list_add(&aeb->u.list, list); 1440525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy else 1452c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy list_add_tail(&aeb->u.list, list); 146801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 147801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 148801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 149801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 1503fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy * add_corrupted - add a corrupted physical eraseblock. 151a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 1523fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy * @pnum: physical eraseblock number to add 1533fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy * @ec: erase counter of the physical eraseblock 1543fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy * 155fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * This function allocates a 'struct ubi_ainf_peb' object for a corrupted 156fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * physical eraseblock @pnum and adds it to the 'corr' list. The corruption 157fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * was presumably not caused by a power cut. Returns zero in case of success 158fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * and a negative error code in case of failure. 1593fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy */ 160a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiystatic int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec) 1613fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy{ 1622c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb; 1633fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy 1643fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec); 1653fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy 1661fc2e3e59d78999fc4be7349af769cf6621b9e61Artem Bityutskiy aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); 1672c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (!aeb) 1683fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy return -ENOMEM; 1693fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy 170a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->corr_peb_count += 1; 1712c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->pnum = pnum; 1722c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->ec = ec; 173a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_add(&aeb->u.list, &ai->corr); 1743fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy return 0; 1753fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy} 1763fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy 1773fb34124da9d5e37576d9f87d7a5005ba1d82dd7Artem Bityutskiy/** 178ebaaf1af3e9ef05c4fb7c61e4530c15e1ad10e3bArtem Bityutskiy * validate_vid_hdr - check volume identifier header. 179801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @vid_hdr: the volume identifier header to check 180517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy * @av: information about the volume this logical eraseblock belongs to 181801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @pnum: physical eraseblock number the VID header came from 182801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 183801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This function checks that data stored in @vid_hdr is consistent. Returns 184801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * non-zero if an inconsistency was found and zero if not. 185801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 186801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Note, UBI does sanity check of everything it reads from the flash media. 18785c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * Most of the checks are done in the I/O sub-system. Here we check that the 188801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * information in the VID header is consistent to the information in other VID 189801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * headers of the same volume. 190801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 191801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiystatic int validate_vid_hdr(const struct ubi_vid_hdr *vid_hdr, 192517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy const struct ubi_ainf_volume *av, int pnum) 193801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 194801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int vol_type = vid_hdr->vol_type; 1953261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig int vol_id = be32_to_cpu(vid_hdr->vol_id); 1963261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig int used_ebs = be32_to_cpu(vid_hdr->used_ebs); 1973261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig int data_pad = be32_to_cpu(vid_hdr->data_pad); 198801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 199517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->leb_count != 0) { 200517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy int av_vol_type; 201801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 202801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 203801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This is not the first logical eraseblock belonging to this 204801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * volume. Ensure that the data in its VID header is consistent 205801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * to the data in previous logical eraseblock headers. 206801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 207801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 208517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (vol_id != av->vol_id) { 209e2986827d5d0759788d00f3759bcd46fc28f96c5Artem Bityutskiy ubi_err("inconsistent vol_id"); 210801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad; 211801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 212801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 213517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_type == UBI_STATIC_VOLUME) 214517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av_vol_type = UBI_VID_STATIC; 215801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy else 216517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av_vol_type = UBI_VID_DYNAMIC; 217801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 218517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (vol_type != av_vol_type) { 219e2986827d5d0759788d00f3759bcd46fc28f96c5Artem Bityutskiy ubi_err("inconsistent vol_type"); 220801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad; 221801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 222801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 223517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (used_ebs != av->used_ebs) { 224e2986827d5d0759788d00f3759bcd46fc28f96c5Artem Bityutskiy ubi_err("inconsistent used_ebs"); 225801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad; 226801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 227801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 228517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (data_pad != av->data_pad) { 229e2986827d5d0759788d00f3759bcd46fc28f96c5Artem Bityutskiy ubi_err("inconsistent data_pad"); 230801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad; 231801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 232801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 233801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 234801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 235801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 236801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiybad: 237801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("inconsistent VID header at PEB %d", pnum); 238a904e3f1deb21b986b7789a830fa8f132ff3d406Artem Bityutskiy ubi_dump_vid_hdr(vid_hdr); 239517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_dump_av(av); 240801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -EINVAL; 241801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 242801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 243801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 244a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * add_volume - add volume to the attaching information. 245a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 246801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @vol_id: ID of the volume to add 247801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @pnum: physical eraseblock number 248801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @vid_hdr: volume identifier header 249801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 250801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * If the volume corresponding to the @vid_hdr logical eraseblock is already 251a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * present in the attaching information, this function does nothing. Otherwise 252a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * it adds corresponding volume to the attaching information. Returns a pointer 253fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * to the allocated "av" object in case of success and a negative error code in 254fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * case of failure. 255801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 256a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiystatic struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai, 257afc15a814b9b5879ec361b76d45f68dc3b2cd4c1Artem Bityutskiy int vol_id, int pnum, 258801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy const struct ubi_vid_hdr *vid_hdr) 259801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 260517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy struct ubi_ainf_volume *av; 261a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy struct rb_node **p = &ai->volumes.rb_node, *parent = NULL; 262801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 2633261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig ubi_assert(vol_id == be32_to_cpu(vid_hdr->vol_id)); 264801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 265801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* Walk the volume RB-tree to look if this volume is already present */ 266801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy while (*p) { 267801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy parent = *p; 268517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av = rb_entry(parent, struct ubi_ainf_volume, rb); 269801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 270517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (vol_id == av->vol_id) 271517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy return av; 272801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 273517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (vol_id > av->vol_id) 274801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy p = &(*p)->rb_left; 275801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy else 276801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy p = &(*p)->rb_right; 277801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 278801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 279801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* The volume is absent - add it */ 280517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av = kmalloc(sizeof(struct ubi_ainf_volume), GFP_KERNEL); 281517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (!av) 282801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return ERR_PTR(-ENOMEM); 283801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 284517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->highest_lnum = av->leb_count = 0; 285517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->vol_id = vol_id; 286517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->root = RB_ROOT; 287517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->used_ebs = be32_to_cpu(vid_hdr->used_ebs); 288517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->data_pad = be32_to_cpu(vid_hdr->data_pad); 289517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->compat = vid_hdr->compat; 290517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->vol_type = vid_hdr->vol_type == UBI_VID_DYNAMIC ? UBI_DYNAMIC_VOLUME 291801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy : UBI_STATIC_VOLUME; 292a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (vol_id > ai->highest_vol_id) 293a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->highest_vol_id = vol_id; 294801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 295517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy rb_link_node(&av->rb, parent, p); 296517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy rb_insert_color(&av->rb, &ai->volumes); 297a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->vols_found += 1; 298801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("added volume %d", vol_id); 299517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy return av; 300801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 301801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 302801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 303dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * ubi_compare_lebs - find out which logical eraseblock is newer. 304801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ubi: UBI device description object 3052c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy * @aeb: first logical eraseblock to compare 306801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @pnum: physical eraseblock number of the second logical eraseblock to 307801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * compare 308801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @vid_hdr: volume identifier header of the second logical eraseblock 309801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 310801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This function compares 2 copies of a LEB and informs which one is newer. In 311801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * case of success this function returns a positive value, in case of failure, a 312801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * negative error code is returned. The success return codes use the following 313801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * bits: 3142c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy * o bit 0 is cleared: the first PEB (described by @aeb) is newer than the 315801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * second PEB (described by @pnum and @vid_hdr); 316801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * o bit 0 is set: the second PEB is newer; 317801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * o bit 1 is cleared: no bit-flips were detected in the newer LEB; 318801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * o bit 1 is set: bit-flips were detected in the newer LEB; 319801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * o bit 2 is cleared: the older LEB is not corrupted; 320801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * o bit 2 is set: the older LEB is corrupted. 321801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 322dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerint ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb, 323e88d6e10e5c848fd5be8f89e09e3bce2570886b7Artem Bityutskiy int pnum, const struct ubi_vid_hdr *vid_hdr) 324801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 325801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int len, err, second_is_newer, bitflips = 0, corrupted = 0; 326801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy uint32_t data_crc, crc; 3278bc22961966b845aa5f965be30771902146c2fccArtem Bityutskiy struct ubi_vid_hdr *vh = NULL; 3283261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig unsigned long long sqnum2 = be64_to_cpu(vid_hdr->sqnum); 329801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 3302c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (sqnum2 == aeb->sqnum) { 331801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 3329869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * This must be a really ancient UBI image which has been 3339869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * created before sequence numbers support has been added. At 3349869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * that times we used 32-bit LEB versions stored in logical 3359869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * eraseblocks. That was before UBI got into mainline. We do not 3360525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * support these images anymore. Well, those images still work, 3370525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * but only if no unclean reboots happened. 338801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 339dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ubi_err("unsupported on-flash UBI format"); 3409869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy return -EINVAL; 3419869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy } 34264203195edf44601d9825284101dcaf7ad54ece8Artem Bityutskiy 3439869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy /* Obviously the LEB with lower sequence counter is older */ 3442c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy second_is_newer = (sqnum2 > aeb->sqnum); 345801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 346801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 347801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Now we know which copy is newer. If the copy flag of the PEB with 348801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * newer version is not set, then we just return, otherwise we have to 349801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * check data CRC. For the second PEB we already have the VID header, 350801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * for the first one - we'll need to re-read it from flash. 351801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 3529869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * Note: this may be optimized so that we wouldn't read twice. 353801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 354801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 355801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (second_is_newer) { 356801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (!vid_hdr->copy_flag) { 357801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* It is not a copy, so it is newer */ 358801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("second PEB %d is newer, copy_flag is unset", 359801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy pnum); 360801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 1; 361801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 362801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } else { 3632c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (!aeb->copy_flag) { 364fb22b59b2c38054cc847f6acc5c46daa26dc6dd3Artem Bityutskiy /* It is not a copy, so it is newer */ 365fb22b59b2c38054cc847f6acc5c46daa26dc6dd3Artem Bityutskiy dbg_bld("first PEB %d is newer, copy_flag is unset", 366fb22b59b2c38054cc847f6acc5c46daa26dc6dd3Artem Bityutskiy pnum); 367fb22b59b2c38054cc847f6acc5c46daa26dc6dd3Artem Bityutskiy return bitflips << 1; 368fb22b59b2c38054cc847f6acc5c46daa26dc6dd3Artem Bityutskiy } 369801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 37033818bbb84cd371b63ed8849cc5264d24c8b3aa2Artem Bityutskiy vh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); 3718bc22961966b845aa5f965be30771902146c2fccArtem Bityutskiy if (!vh) 372801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -ENOMEM; 373801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 3742c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy pnum = aeb->pnum; 3758bc22961966b845aa5f965be30771902146c2fccArtem Bityutskiy err = ubi_io_read_vid_hdr(ubi, pnum, vh, 0); 376801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) { 377801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err == UBI_IO_BITFLIPS) 378801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy bitflips = 1; 379801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy else { 380049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy ubi_err("VID of PEB %d header is bad, but it was OK earlier, err %d", 381049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy pnum, err); 382801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err > 0) 383801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = -EIO; 384801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 385801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out_free_vidh; 386801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 387801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 388801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 3898bc22961966b845aa5f965be30771902146c2fccArtem Bityutskiy vid_hdr = vh; 390801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 391801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 392801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* Read the data of the copy and check the CRC */ 393801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 3943261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig len = be32_to_cpu(vid_hdr->data_size); 395801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 396d125a753425b9de3c251df519e521024c79c663dArtem Bityutskiy mutex_lock(&ubi->buf_mutex); 397d125a753425b9de3c251df519e521024c79c663dArtem Bityutskiy err = ubi_io_read_data(ubi, ubi->peb_buf, pnum, 0, len); 398d57f40544a41fdfe90fd863b6865138c5a82f1ccBrian Norris if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err)) 399d125a753425b9de3c251df519e521024c79c663dArtem Bityutskiy goto out_unlock; 400801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 4013261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig data_crc = be32_to_cpu(vid_hdr->data_crc); 402d125a753425b9de3c251df519e521024c79c663dArtem Bityutskiy crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, len); 403801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (crc != data_crc) { 404801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("PEB %d CRC error: calculated %#08x, must be %#08x", 405801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy pnum, crc, data_crc); 406801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy corrupted = 1; 407801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy bitflips = 0; 408801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy second_is_newer = !second_is_newer; 409801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } else { 410801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("PEB %d CRC is OK", pnum); 411801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy bitflips = !!err; 412801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 413d125a753425b9de3c251df519e521024c79c663dArtem Bityutskiy mutex_unlock(&ubi->buf_mutex); 414801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 4158bc22961966b845aa5f965be30771902146c2fccArtem Bityutskiy ubi_free_vid_hdr(ubi, vh); 416801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 417801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (second_is_newer) 418801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("second PEB %d is newer, copy_flag is set", pnum); 419801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy else 420801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("first PEB %d is newer, copy_flag is set", pnum); 421801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 422801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return second_is_newer | (bitflips << 1) | (corrupted << 2); 423801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 424d125a753425b9de3c251df519e521024c79c663dArtem Bityutskiyout_unlock: 425d125a753425b9de3c251df519e521024c79c663dArtem Bityutskiy mutex_unlock(&ubi->buf_mutex); 426801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiyout_free_vidh: 4278bc22961966b845aa5f965be30771902146c2fccArtem Bityutskiy ubi_free_vid_hdr(ubi, vh); 428801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 429801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 430801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 431801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 432fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * ubi_add_to_av - add used physical eraseblock to the attaching information. 433801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ubi: UBI device description object 434a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 435801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @pnum: the physical eraseblock number 436801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ec: erase counter 437801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @vid_hdr: the volume identifier header 438801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @bitflips: if bit-flips were detected when this physical eraseblock was read 439801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 44079b510c0f21174f4bd055d1aab156e548ae3a5f2Artem Bityutskiy * This function adds information about a used physical eraseblock to the 44179b510c0f21174f4bd055d1aab156e548ae3a5f2Artem Bityutskiy * 'used' tree of the corresponding volume. The function is rather complex 44279b510c0f21174f4bd055d1aab156e548ae3a5f2Artem Bityutskiy * because it has to handle cases when this is not the first physical 44379b510c0f21174f4bd055d1aab156e548ae3a5f2Artem Bityutskiy * eraseblock belonging to the same logical eraseblock, and the newer one has 44479b510c0f21174f4bd055d1aab156e548ae3a5f2Artem Bityutskiy * to be picked, while the older one has to be dropped. This function returns 44579b510c0f21174f4bd055d1aab156e548ae3a5f2Artem Bityutskiy * zero in case of success and a negative error code in case of failure. 446801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 4473561188ac29580bdc0e8db3cf3c029b87cf2c6cdArtem Bityutskiyint ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum, 4483561188ac29580bdc0e8db3cf3c029b87cf2c6cdArtem Bityutskiy int ec, const struct ubi_vid_hdr *vid_hdr, int bitflips) 449801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 450801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int err, vol_id, lnum; 451801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy unsigned long long sqnum; 452517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy struct ubi_ainf_volume *av; 4532c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb; 454801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy struct rb_node **p, *parent = NULL; 455801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 4563261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig vol_id = be32_to_cpu(vid_hdr->vol_id); 4573261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig lnum = be32_to_cpu(vid_hdr->lnum); 4583261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig sqnum = be64_to_cpu(vid_hdr->sqnum); 459801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 4609869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy dbg_bld("PEB %d, LEB %d:%d, EC %d, sqnum %llu, bitflips %d", 4619869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy pnum, vol_id, lnum, ec, sqnum, bitflips); 462801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 463517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av = add_volume(ai, vol_id, pnum, vid_hdr); 464517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (IS_ERR(av)) 465517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy return PTR_ERR(av); 466801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 467a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ai->max_sqnum < sqnum) 468a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->max_sqnum = sqnum; 46976eafe479ec30dd72b8cf209c4f576eac3c93112Brijesh Singh 470801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 471801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Walk the RB-tree of logical eraseblocks of volume @vol_id to look 472801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * if this is the first instance of this logical eraseblock or not. 473801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 474517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy p = &av->root.rb_node; 475801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy while (*p) { 476801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int cmp_res; 477801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 478801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy parent = *p; 4792c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb = rb_entry(parent, struct ubi_ainf_peb, u.rb); 4802c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (lnum != aeb->lnum) { 4812c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (lnum < aeb->lnum) 482801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy p = &(*p)->rb_left; 483801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy else 484801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy p = &(*p)->rb_right; 485801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy continue; 486801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 487801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 488801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 489801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * There is already a physical eraseblock describing the same 490801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * logical eraseblock present. 491801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 492801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 4932c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy dbg_bld("this LEB already exists: PEB %d, sqnum %llu, EC %d", 4942c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->pnum, aeb->sqnum, aeb->ec); 495801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 496801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 497801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Make sure that the logical eraseblocks have different 498801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * sequence numbers. Otherwise the image is bad. 499801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 5009869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * However, if the sequence number is zero, we assume it must 5019869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * be an ancient UBI image from the era when UBI did not have 5029869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * sequence numbers. We still can attach these images, unless 5039869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * there is a need to distinguish between old and new 5049869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * eraseblocks, in which case we'll refuse the image in 505dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * 'ubi_compare_lebs()'. In other words, we attach old clean 5069869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * images, but refuse attaching old images with duplicated 5079869cd801c107bbae91663c3f4edbb6b5715919fArtem Bityutskiy * logical eraseblocks because there was an unclean reboot. 508801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 5092c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (aeb->sqnum == sqnum && sqnum != 0) { 510801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("two LEBs with same sequence number %llu", 511801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy sqnum); 5122c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy ubi_dump_aeb(aeb, 0); 513a904e3f1deb21b986b7789a830fa8f132ff3d406Artem Bityutskiy ubi_dump_vid_hdr(vid_hdr); 514801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -EINVAL; 515801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 516801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 517801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 518801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Now we have to drop the older one and preserve the newer 519801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * one. 520801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 521dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger cmp_res = ubi_compare_lebs(ubi, aeb, pnum, vid_hdr); 522801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (cmp_res < 0) 523801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return cmp_res; 524801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 525801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (cmp_res & 1) { 526801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 5273f5026222e8a16daaa830eec4d72c6745b74407eShinya Kuribayashi * This logical eraseblock is newer than the one 528801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * found earlier. 529801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 530517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy err = validate_vid_hdr(vid_hdr, av, pnum); 531801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 532801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 533801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 5346dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon err = add_to_list(ai, aeb->pnum, aeb->vol_id, 5356dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon aeb->lnum, aeb->ec, cmp_res & 4, 536a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy &ai->erase); 537801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 538801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 539801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 5402c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->ec = ec; 5412c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->pnum = pnum; 5426dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon aeb->vol_id = vol_id; 5436dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon aeb->lnum = lnum; 5442c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->scrub = ((cmp_res & 2) || bitflips); 5452c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->copy_flag = vid_hdr->copy_flag; 5462c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->sqnum = sqnum; 547801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 548517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->highest_lnum == lnum) 549517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->last_data_size = 5503261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig be32_to_cpu(vid_hdr->data_size); 551801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 552801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 553801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } else { 554801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 555025dfdafe77f20b3890981a394774baab7b9c827Frederik Schwarzer * This logical eraseblock is older than the one found 556801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * previously. 557801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 5586dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon return add_to_list(ai, pnum, vol_id, lnum, ec, 5596dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon cmp_res & 4, &ai->erase); 560801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 561801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 562801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 563801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 564801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * We've met this logical eraseblock for the first time, add it to the 565a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * attaching information. 566801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 567801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 568517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy err = validate_vid_hdr(vid_hdr, av, pnum); 569801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 570801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 571801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 5721fc2e3e59d78999fc4be7349af769cf6621b9e61Artem Bityutskiy aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL); 5732c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (!aeb) 574801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -ENOMEM; 575801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 5762c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->ec = ec; 5772c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->pnum = pnum; 5786dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon aeb->vol_id = vol_id; 5792c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->lnum = lnum; 5802c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->scrub = bitflips; 5812c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->copy_flag = vid_hdr->copy_flag; 5822c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->sqnum = sqnum; 583801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 584517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->highest_lnum <= lnum) { 585517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->highest_lnum = lnum; 586517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->last_data_size = be32_to_cpu(vid_hdr->data_size); 587801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 588801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 589517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->leb_count += 1; 5902c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy rb_link_node(&aeb->u.rb, parent, p); 591517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy rb_insert_color(&aeb->u.rb, &av->root); 592801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 593801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 594801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 595801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 596dcd85fdd1040259f0053137f252321faec0a259fArtem Bityutskiy * ubi_find_av - find volume in the attaching information. 597a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 598801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @vol_id: the requested volume ID 599801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 600801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This function returns a pointer to the volume description or %NULL if there 601a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * are no data about this volume in the attaching information. 602801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 603dcd85fdd1040259f0053137f252321faec0a259fArtem Bityutskiystruct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai, 604dcd85fdd1040259f0053137f252321faec0a259fArtem Bityutskiy int vol_id) 605801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 606517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy struct ubi_ainf_volume *av; 607a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy struct rb_node *p = ai->volumes.rb_node; 608801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 609801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy while (p) { 610517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av = rb_entry(p, struct ubi_ainf_volume, rb); 611801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 612517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (vol_id == av->vol_id) 613517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy return av; 614801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 615517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (vol_id > av->vol_id) 616801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy p = p->rb_left; 617801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy else 618801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy p = p->rb_right; 619801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 620801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 621801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return NULL; 622801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 623801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 624801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 625d717dc2f85f07f68d313ac4f8f9f460f1e17dee0Artem Bityutskiy * ubi_remove_av - delete attaching information about a volume. 626a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 627517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy * @av: the volume attaching information to delete 628801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 629d717dc2f85f07f68d313ac4f8f9f460f1e17dee0Artem Bityutskiyvoid ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av) 630801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 631801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy struct rb_node *rb; 6322c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb; 633801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 634517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy dbg_bld("remove attaching information about volume %d", av->vol_id); 635801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 636517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy while ((rb = rb_first(&av->root))) { 6372c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb = rb_entry(rb, struct ubi_ainf_peb, u.rb); 638517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy rb_erase(&aeb->u.rb, &av->root); 639a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_add_tail(&aeb->u.list, &ai->erase); 640801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 641801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 642517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy rb_erase(&av->rb, &ai->volumes); 643517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy kfree(av); 644a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->vols_found -= 1; 645801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 646801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 647801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 64813d33dad35c2a168d17cc993ea496b8eb9dd9624Artem Bityutskiy * early_erase_peb - erase a physical eraseblock. 649801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ubi: UBI device description object 650a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 651801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @pnum: physical eraseblock number to erase; 6529c47fb2fbe585698e9e6dac3ec033ea94765f38cArtem Bityutskiy * @ec: erase counter value to write (%UBI_UNKNOWN if it is unknown) 653801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 654801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This function erases physical eraseblock 'pnum', and writes the erase 655801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * counter header to it. This function should only be used on UBI device 65685c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * initialization stages, when the EBA sub-system had not been yet initialized. 65785c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * This function returns zero in case of success and a negative error code in 65885c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * case of failure. 659801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 66013d33dad35c2a168d17cc993ea496b8eb9dd9624Artem Bityutskiystatic int early_erase_peb(struct ubi_device *ubi, 66113d33dad35c2a168d17cc993ea496b8eb9dd9624Artem Bityutskiy const struct ubi_attach_info *ai, int pnum, int ec) 662801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 663801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int err; 664801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy struct ubi_ec_hdr *ec_hdr; 665801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 666801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if ((long long)ec >= UBI_MAX_ERASECOUNTER) { 667801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 668801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Erase counter overflow. Upgrade UBI and use 64-bit 669801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * erase counters internally. 670801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 671801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("erase counter overflow at PEB %d, EC %d", pnum, ec); 672801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -EINVAL; 673801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 674801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 675dcec4c3bdc4d5f4bd2d858ee1ce11e3424cbaed7Florin Malita ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); 676dcec4c3bdc4d5f4bd2d858ee1ce11e3424cbaed7Florin Malita if (!ec_hdr) 677dcec4c3bdc4d5f4bd2d858ee1ce11e3424cbaed7Florin Malita return -ENOMEM; 678dcec4c3bdc4d5f4bd2d858ee1ce11e3424cbaed7Florin Malita 6793261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig ec_hdr->ec = cpu_to_be64(ec); 680801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 681801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = ubi_io_sync_erase(ubi, pnum, 0); 682801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err < 0) 683801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out_free; 684801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 685801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = ubi_io_write_ec_hdr(ubi, pnum, ec_hdr); 686801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 687801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiyout_free: 688801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy kfree(ec_hdr); 689801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 690801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 691801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 692801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 693c87fbd7deb08315314654de5360c102acc8716eeArtem Bityutskiy * ubi_early_get_peb - get a free physical eraseblock. 694801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ubi: UBI device description object 695a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 696801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 697801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This function returns a free physical eraseblock. It is supposed to be 69885c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * called on the UBI initialization stages when the wear-leveling sub-system is 69985c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * not initialized yet. This function picks a physical eraseblocks from one of 70085c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * the lists, writes the EC header if it is needed, and removes it from the 70185c6e6e28259e9b58b8984db536c45bc3161f40cArtem Bityutskiy * list. 702801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 703fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * This function returns a pointer to the "aeb" of the found free PEB in case 704fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * of success and an error code in case of failure. 705801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 706c87fbd7deb08315314654de5360c102acc8716eeArtem Bityutskiystruct ubi_ainf_peb *ubi_early_get_peb(struct ubi_device *ubi, 707c87fbd7deb08315314654de5360c102acc8716eeArtem Bityutskiy struct ubi_attach_info *ai) 708801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 7095fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy int err = 0; 7102c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb, *tmp_aeb; 711801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 712a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (!list_empty(&ai->free)) { 713a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list); 7142c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy list_del(&aeb->u.list); 7152c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy dbg_bld("return free PEB %d, EC %d", aeb->pnum, aeb->ec); 7162c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy return aeb; 717801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 718801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 7195fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy /* 7205fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy * We try to erase the first physical eraseblock from the erase list 7215fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy * and pick it if we succeed, or try to erase the next one if not. And 7225fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy * so forth. We don't want to take care about bad eraseblocks here - 7235fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy * they'll be handled later. 7245fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy */ 725a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) { 7269c47fb2fbe585698e9e6dac3ec033ea94765f38cArtem Bityutskiy if (aeb->ec == UBI_UNKNOWN) 727a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy aeb->ec = ai->mean_ec; 728801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 72913d33dad35c2a168d17cc993ea496b8eb9dd9624Artem Bityutskiy err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1); 7305fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy if (err) 7315fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy continue; 732801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 7332c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->ec += 1; 7342c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy list_del(&aeb->u.list); 7352c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy dbg_bld("return PEB %d, EC %d", aeb->pnum, aeb->ec); 7362c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy return aeb; 737801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 738801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 7395fc01ab6934c43b42c41bc753fe1123c16d7f38fArtem Bityutskiy ubi_err("no free eraseblocks"); 740801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return ERR_PTR(-ENOSPC); 741801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 742801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 743801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 74445aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * check_corruption - check the data area of PEB. 745feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * @ubi: UBI device description object 746dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @vid_hdr: the (corrupted) VID header of this PEB 747feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * @pnum: the physical eraseblock number to check 748feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * 749feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * This is a helper function which is used to distinguish between VID header 750feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * corruptions caused by power cuts and other reasons. If the PEB contains only 75145aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * 0xFF bytes in the data area, the VID header is most probably corrupted 752feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * because of a power cut (%0 is returned in this case). Otherwise, it was 75345aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * probably corrupted for some other reasons (%1 is returned in this case). A 75445aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * negative error code is returned if a read error occurred. 755feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * 756feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * If the corruption reason was a power cut, UBI can safely erase this PEB. 757feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * Otherwise, it should preserve it to avoid possibly destroying important 758feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * information. 759feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy */ 76045aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiystatic int check_corruption(struct ubi_device *ubi, struct ubi_vid_hdr *vid_hdr, 76145aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy int pnum) 762feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy{ 763feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy int err; 764feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy 765feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy mutex_lock(&ubi->buf_mutex); 7660ca39d74de8b269fb61eac11b75bd6c3fc887c28Artem Bityutskiy memset(ubi->peb_buf, 0x00, ubi->leb_size); 767feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy 7680ca39d74de8b269fb61eac11b75bd6c3fc887c28Artem Bityutskiy err = ubi_io_read(ubi, ubi->peb_buf, pnum, ubi->leb_start, 769feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy ubi->leb_size); 770d57f40544a41fdfe90fd863b6865138c5a82f1ccBrian Norris if (err == UBI_IO_BITFLIPS || mtd_is_eccerr(err)) { 77145aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy /* 77245aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * Bit-flips or integrity errors while reading the data area. 77345aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * It is difficult to say for sure what type of corruption is 77445aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * this, but presumably a power cut happened while this PEB was 77545aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * erased, so it became unstable and corrupted, and should be 77645aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * erased. 77745aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy */ 7781b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenter err = 0; 7791b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenter goto out_unlock; 78045aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy } 78145aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy 78245aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy if (err) 7831b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenter goto out_unlock; 784feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy 7850ca39d74de8b269fb61eac11b75bd6c3fc887c28Artem Bityutskiy if (ubi_check_pattern(ubi->peb_buf, 0xFF, ubi->leb_size)) 7861b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenter goto out_unlock; 787feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy 788049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy ubi_err("PEB %d contains corrupted VID header, and the data does not contain all 0xFF", 789049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy pnum); 790049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy ubi_err("this may be a non-UBI PEB or a severe VID header corruption which requires manual inspection"); 791a904e3f1deb21b986b7789a830fa8f132ff3d406Artem Bityutskiy ubi_dump_vid_hdr(vid_hdr); 792719bb84017fcfc949a77e150dd5b045e90a4ebc9Artem Bityutskiy pr_err("hexdump of PEB %d offset %d, length %d", 793719bb84017fcfc949a77e150dd5b045e90a4ebc9Artem Bityutskiy pnum, ubi->leb_start, ubi->leb_size); 794feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy ubi_dbg_print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, 7950ca39d74de8b269fb61eac11b75bd6c3fc887c28Artem Bityutskiy ubi->peb_buf, ubi->leb_size, 1); 7961b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenter err = 1; 7971b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenter 7981b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenterout_unlock: 799feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy mutex_unlock(&ubi->buf_mutex); 8001b1d76e2df2a0aa965d6a227db7061d3fff029b1Dan Carpenter return err; 801feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy} 802feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy 803feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy/** 804fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * scan_peb - scan and process UBI headers of a PEB. 805801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ubi: UBI device description object 806a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 807801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @pnum: the physical eraseblock number 808dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @vid: The volume ID of the found volume will be stored in this pointer 809dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @sqnum: The sqnum of the found volume will be stored in this pointer 810801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 811fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * This function reads UBI headers of PEB @pnum, checks them, and adds 812fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * information about this PEB to the corresponding list or RB-tree in the 813fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * "attaching info" structure. Returns zero if the physical eraseblock was 814fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * successfully handled and a negative error code in case of failure. 815801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 816fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiystatic int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai, 817dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger int pnum, int *vid, unsigned long long *sqnum) 818801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 819c18a84186cc05bee19d55823f1a35f4ea91a92d6Artem Bityutskiy long long uninitialized_var(ec); 820dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger int err, bitflips = 0, vol_id = -1, ec_err = 0; 821801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 822801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy dbg_bld("scan PEB %d", pnum); 823801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 824801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* Skip bad physical eraseblocks */ 825801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = ubi_io_is_bad(ubi, pnum); 826801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err < 0) 827801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 828801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy else if (err) { 829a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->bad_peb_count += 1; 830801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 831801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 832801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 833801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); 834801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err < 0) 835801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 836b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy switch (err) { 837b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case 0: 838b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy break; 839b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_BITFLIPS: 840801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy bitflips = 1; 841b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy break; 842b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_FF: 843a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->empty_peb_count += 1; 8446dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, 8456dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon UBI_UNKNOWN, 0, &ai->erase); 846b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_FF_BITFLIPS: 847a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->empty_peb_count += 1; 8486dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, 8496dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon UBI_UNKNOWN, 1, &ai->erase); 850b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_BAD_HDR_EBADMSG: 851b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_BAD_HDR: 852801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 853801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * We have to also look at the VID header, possibly it is not 854801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * corrupted. Set %bitflips flag in order to make this PEB be 855801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * moved and EC be re-created. 856801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 857e0e718c281ce1dd4006681e1255535cc6f2857d4Artem Bityutskiy ec_err = err; 8589c47fb2fbe585698e9e6dac3ec033ea94765f38cArtem Bityutskiy ec = UBI_UNKNOWN; 859801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy bitflips = 1; 860b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy break; 861b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy default: 862b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy ubi_err("'ubi_io_read_ec_hdr()' returned unknown code %d", err); 863b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy return -EINVAL; 864801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 865801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 866e0e718c281ce1dd4006681e1255535cc6f2857d4Artem Bityutskiy if (!ec_err) { 867fe96efc1a3c049f0a1bcd9b65e0faeb751ce5ec6Artem Bityutskiy int image_seq; 868fe96efc1a3c049f0a1bcd9b65e0faeb751ce5ec6Artem Bityutskiy 869801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* Make sure UBI version is OK */ 870801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (ech->version != UBI_VERSION) { 871801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("this UBI version is %d, image version is %d", 872801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy UBI_VERSION, (int)ech->version); 873801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -EINVAL; 874801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 875801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 8763261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig ec = be64_to_cpu(ech->ec); 877801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (ec > UBI_MAX_ERASECOUNTER) { 878801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 879801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Erase counter overflow. The EC headers have 64 bits 880801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * reserved, but we anyway make use of only 31 bit 881801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * values, as this seems to be enough for any existing 882801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * flash. Upgrade UBI and use 64-bit erase counters 883801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * internally. 884801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 885801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("erase counter overflow, max is %d", 886801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy UBI_MAX_ERASECOUNTER); 887a904e3f1deb21b986b7789a830fa8f132ff3d406Artem Bityutskiy ubi_dump_ec_hdr(ech); 888801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -EINVAL; 889801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 890fe96efc1a3c049f0a1bcd9b65e0faeb751ce5ec6Artem Bityutskiy 89132bc4820287a1a03982979515949e8ea56eac641Adrian Hunter /* 89232bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * Make sure that all PEBs have the same image sequence number. 89332bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * This allows us to detect situations when users flash UBI 89432bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * images incorrectly, so that the flash has the new UBI image 89532bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * and leftovers from the old one. This feature was added 89632bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * relatively recently, and the sequence number was always 89732bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * zero, because old UBI implementations always set it to zero. 89832bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * For this reasons, we do not panic if some PEBs have zero 89932bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * sequence number, while other PEBs have non-zero sequence 90032bc4820287a1a03982979515949e8ea56eac641Adrian Hunter * number. 90132bc4820287a1a03982979515949e8ea56eac641Adrian Hunter */ 9023dc948da783e713cd3dc8bbd8f293f8795af8f06Holger Brunck image_seq = be32_to_cpu(ech->image_seq); 90355b80c409a1368b8dff3c78943101bccb0ea3aa1Richard Genoud if (!ubi->image_seq) 904fe96efc1a3c049f0a1bcd9b65e0faeb751ce5ec6Artem Bityutskiy ubi->image_seq = image_seq; 90555b80c409a1368b8dff3c78943101bccb0ea3aa1Richard Genoud if (image_seq && ubi->image_seq != image_seq) { 906049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy ubi_err("bad image sequence number %d in PEB %d, expected %d", 907049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy image_seq, pnum, ubi->image_seq); 908a904e3f1deb21b986b7789a830fa8f132ff3d406Artem Bityutskiy ubi_dump_ec_hdr(ech); 909fe96efc1a3c049f0a1bcd9b65e0faeb751ce5ec6Artem Bityutskiy return -EINVAL; 910fe96efc1a3c049f0a1bcd9b65e0faeb751ce5ec6Artem Bityutskiy } 911801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 912801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 913801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* OK, we've done with the EC header, let's look at the VID header */ 914801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 915801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = ubi_io_read_vid_hdr(ubi, pnum, vidh, 0); 916801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err < 0) 917801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 918b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy switch (err) { 919b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case 0: 920b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy break; 921b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_BITFLIPS: 922801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy bitflips = 1; 923b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy break; 924b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_BAD_HDR_EBADMSG: 9250525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy if (ec_err == UBI_IO_BAD_HDR_EBADMSG) 9260525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy /* 9270525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * Both EC and VID headers are corrupted and were read 9280525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * with data integrity error, probably this is a bad 9290525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * PEB, bit it is not marked as bad yet. This may also 9300525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * be a result of power cut during erasure. 9310525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy */ 932a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->maybe_bad_peb_count += 1; 933b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_BAD_HDR: 934feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy if (ec_err) 935feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy /* 936feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * Both headers are corrupted. There is a possibility 937feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * that this a valid UBI PEB which has corresponding 938feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * LEB, but the headers are corrupted. However, it is 939feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * impossible to distinguish it from a PEB which just 94045aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy * contains garbage because of a power cut during erase 941feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * operation. So we just schedule this PEB for erasure. 9427ac760c2f78ddd8e1bd633767b01becfbbf96720Artem Bityutskiy * 94325985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * Besides, in case of NOR flash, we deliberately 9447ac760c2f78ddd8e1bd633767b01becfbbf96720Artem Bityutskiy * corrupt both headers because NOR flash erasure is 9457ac760c2f78ddd8e1bd633767b01becfbbf96720Artem Bityutskiy * slow and can start from the end. 946feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy */ 947feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy err = 0; 948feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy else 949feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy /* 950feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * The EC was OK, but the VID header is corrupted. We 951feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy * have to check what is in the data area. 952feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy */ 95345aafd32996e27bfc4862654ff31231bdddbe200Artem Bityutskiy err = check_corruption(ubi, vidh, pnum); 954df3fca4cdddfa6e1f51b65214d4342660649bd1fArtem Bityutskiy 955df3fca4cdddfa6e1f51b65214d4342660649bd1fArtem Bityutskiy if (err < 0) 956df3fca4cdddfa6e1f51b65214d4342660649bd1fArtem Bityutskiy return err; 957df3fca4cdddfa6e1f51b65214d4342660649bd1fArtem Bityutskiy else if (!err) 958feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy /* This corruption is caused by a power cut */ 9596dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon err = add_to_list(ai, pnum, UBI_UNKNOWN, 9606dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon UBI_UNKNOWN, ec, 1, &ai->erase); 961feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy else 962feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy /* This is an unexpected corruption */ 963a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy err = add_corrupted(ai, pnum, ec); 964feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy if (err) 965feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy return err; 966feeba4b872e5166ca64c44fbb5bbec234dfce199Artem Bityutskiy goto adjust_mean_ec; 967b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_FF_BITFLIPS: 9686dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon err = add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN, 9696dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon ec, 1, &ai->erase); 970801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 971801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 972801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto adjust_mean_ec; 973b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy case UBI_IO_FF: 974193819cf2e6e395b1e1be2d36785dc5563a6edcaMatthieu CASTET if (ec_err || bitflips) 9756dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon err = add_to_list(ai, pnum, UBI_UNKNOWN, 9766dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon UBI_UNKNOWN, ec, 1, &ai->erase); 977b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy else 9786dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon err = add_to_list(ai, pnum, UBI_UNKNOWN, 9796dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon UBI_UNKNOWN, ec, 0, &ai->free); 980801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 981801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 982801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto adjust_mean_ec; 983b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy default: 984b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy ubi_err("'ubi_io_read_vid_hdr()' returned unknown code %d", 985b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy err); 986b33215084c1c06258a2d9deb035d343aafa4066eArtem Bityutskiy return -EINVAL; 987801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 988801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 9893261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig vol_id = be32_to_cpu(vidh->vol_id); 990dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (vid) 991dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger *vid = vol_id; 992dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (sqnum) 993dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger *sqnum = be64_to_cpu(vidh->sqnum); 99491f2d53cd75a8fa3557246af965155208c4c69a7Artem Bityutskiy if (vol_id > UBI_MAX_VOLUMES && vol_id != UBI_LAYOUT_VOLUME_ID) { 9953261ebd7d4194ff30d0eae7ba8d937dcccf7235dChristoph Hellwig int lnum = be32_to_cpu(vidh->lnum); 996801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 997801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* Unsupported internal volume */ 998801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy switch (vidh->compat) { 999801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy case UBI_COMPAT_DELETE: 1000dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (vol_id != UBI_FM_SB_VOLUME_ID 1001dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger && vol_id != UBI_FM_DATA_VOLUME_ID) { 1002dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ubi_msg("\"delete\" compatible internal volume %d:%d found, will remove it", 1003dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger vol_id, lnum); 1004dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 10056dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon err = add_to_list(ai, pnum, vol_id, lnum, 10066dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon ec, 1, &ai->erase); 1007801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 1008801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 1009158132c9abbccce802def10e5ffaf044b266a6e1Brijesh Singh return 0; 1010801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1011801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy case UBI_COMPAT_RO: 1012049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy ubi_msg("read-only compatible internal volume %d:%d found, switch to read-only mode", 1013801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy vol_id, lnum); 1014801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi->ro_mode = 1; 1015801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy break; 1016801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1017801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy case UBI_COMPAT_PRESERVE: 1018049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy ubi_msg("\"preserve\" compatible internal volume %d:%d found", 1019049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy vol_id, lnum); 10206dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon err = add_to_list(ai, pnum, vol_id, lnum, 10216dd3bc7e6032ffb392477fadca77172c1c9e346bJoel Reardon ec, 0, &ai->alien); 1022801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 1023801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 1024801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 1025801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1026801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy case UBI_COMPAT_REJECT: 1027801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("incompatible internal volume %d:%d found", 1028801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy vol_id, lnum); 1029801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -EINVAL; 1030801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1031801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1032801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1033e0e718c281ce1dd4006681e1255535cc6f2857d4Artem Bityutskiy if (ec_err) 103429a88c99d29834fb3314e0144900b187ede83106Artem Bityutskiy ubi_warn("valid VID header but corrupted EC header at PEB %d", 103529a88c99d29834fb3314e0144900b187ede83106Artem Bityutskiy pnum); 10363561188ac29580bdc0e8db3cf3c029b87cf2c6cdArtem Bityutskiy err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips); 1037801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 1038801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 1039801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1040801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiyadjust_mean_ec: 1041e0e718c281ce1dd4006681e1255535cc6f2857d4Artem Bityutskiy if (!ec_err) { 1042a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->ec_sum += ec; 1043a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->ec_count += 1; 1044a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ec > ai->max_ec) 1045a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->max_ec = ec; 1046a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ec < ai->min_ec) 1047a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->min_ec = ec; 1048801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1049801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1050801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 1051801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 1052801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1053801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 1054fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * late_analysis - analyze the overall situation with PEB. 10550798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy * @ubi: UBI device description object 1056a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 10570798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy * 1058fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * This is a helper function which takes a look what PEBs we have after we 1059fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * gather information about all of them ("ai" is compete). It decides whether 1060fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * the flash is empty and should be formatted of whether there are too many 1061fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * corrupted PEBs and we should not attach this MTD device. Returns zero if we 1062fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * should proceed with attaching the MTD device, and %-EINVAL if we should not. 10630798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy */ 1064fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiystatic int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai) 10650798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy{ 10662c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb; 10670525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy int max_corr, peb_count; 10680798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy 1069a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count; 10700525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy max_corr = peb_count / 20 ?: 8; 10710798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy 10720798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy /* 10730525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * Few corrupted PEBs is not a problem and may be just a result of 10740798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy * unclean reboots. However, many of them may indicate some problems 10750798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy * with the flash HW or driver. 10760798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy */ 1077a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ai->corr_peb_count) { 10780525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy ubi_err("%d PEBs are corrupted and preserved", 1079a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->corr_peb_count); 1080e28453bbb76c290d67eb28b3ff6875a6519c3998Artem Bityutskiy pr_err("Corrupted PEBs are:"); 1081a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->corr, u.list) 1082e28453bbb76c290d67eb28b3ff6875a6519c3998Artem Bityutskiy pr_cont(" %d", aeb->pnum); 1083e28453bbb76c290d67eb28b3ff6875a6519c3998Artem Bityutskiy pr_cont("\n"); 10840798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy 10850798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy /* 10860798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy * If too many PEBs are corrupted, we refuse attaching, 10870798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy * otherwise, only print a warning. 10880798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy */ 1089a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ai->corr_peb_count >= max_corr) { 1090feddbb34ebd75e9b6bf573b852079e327a88c07aArtem Bityutskiy ubi_err("too many corrupted PEBs, refusing"); 10910798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy return -EINVAL; 10920798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy } 10930798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy } 10940798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy 1095a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) { 10960525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy /* 10970525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * All PEBs are empty, or almost all - a couple PEBs look like 10980525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * they may be bad PEBs which were not marked as bad yet. 10990525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 11000525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * This piece of code basically tries to distinguish between 11010525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * the following situations: 11020525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 11030525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 1. Flash is empty, but there are few bad PEBs, which are not 11040525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * marked as bad so far, and which were read with error. We 11050525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * want to go ahead and format this flash. While formatting, 11060525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * the faulty PEBs will probably be marked as bad. 11070525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 11080525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * 2. Flash contains non-UBI data and we do not want to format 11090525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy * it and destroy possibly important information. 11100525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy */ 1111a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ai->maybe_bad_peb_count <= 2) { 1112a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->is_empty = 1; 11130798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy ubi_msg("empty MTD device detected"); 11140525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy get_random_bytes(&ubi->image_seq, 11150525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy sizeof(ubi->image_seq)); 11160798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy } else { 1117049333cecbde11988c49ad4d7861eefbc3534422Artem Bityutskiy ubi_err("MTD device is not UBI-formatted and possibly contains non-UBI data - refusing it"); 11180798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy return -EINVAL; 11190798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy } 11200525dac9fd31e5a12fb934238abd09e2752a5967Artem Bityutskiy 11210798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy } 11220798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy 11230798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy return 0; 11240798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy} 11250798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy 11260798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy/** 1127dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * destroy_av - free volume attaching information. 1128dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @av: volume attaching information 1129dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @ai: attaching information 1130dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * 1131dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * This function destroys the volume attaching information. 1132dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger */ 1133dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerstatic void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av) 1134dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger{ 1135dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger struct ubi_ainf_peb *aeb; 1136dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger struct rb_node *this = av->root.rb_node; 1137dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1138dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger while (this) { 1139dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (this->rb_left) 1140dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger this = this->rb_left; 1141dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger else if (this->rb_right) 1142dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger this = this->rb_right; 1143dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger else { 1144dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger aeb = rb_entry(this, struct ubi_ainf_peb, u.rb); 1145dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger this = rb_parent(this); 1146dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (this) { 1147dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (this->rb_left == &aeb->u.rb) 1148dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger this->rb_left = NULL; 1149dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger else 1150dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger this->rb_right = NULL; 1151dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1152dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1153dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kmem_cache_free(ai->aeb_slab_cache, aeb); 1154dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1155dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1156dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kfree(av); 1157dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger} 1158dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1159dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger/** 1160dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * destroy_ai - destroy attaching information. 1161dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @ai: attaching information 1162dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger */ 1163dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerstatic void destroy_ai(struct ubi_attach_info *ai) 1164dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger{ 1165dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger struct ubi_ainf_peb *aeb, *aeb_tmp; 1166dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger struct ubi_ainf_volume *av; 1167dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger struct rb_node *rb; 1168dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1169dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) { 1170dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_del(&aeb->u.list); 1171dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kmem_cache_free(ai->aeb_slab_cache, aeb); 1172dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1173dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, u.list) { 1174dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_del(&aeb->u.list); 1175dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kmem_cache_free(ai->aeb_slab_cache, aeb); 1176dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1177dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_for_each_entry_safe(aeb, aeb_tmp, &ai->corr, u.list) { 1178dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_del(&aeb->u.list); 1179dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kmem_cache_free(ai->aeb_slab_cache, aeb); 1180dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1181dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_for_each_entry_safe(aeb, aeb_tmp, &ai->free, u.list) { 1182dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger list_del(&aeb->u.list); 1183dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kmem_cache_free(ai->aeb_slab_cache, aeb); 1184dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1185dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1186dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger /* Destroy the volume RB-tree */ 1187dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger rb = ai->volumes.rb_node; 1188dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger while (rb) { 1189dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (rb->rb_left) 1190dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger rb = rb->rb_left; 1191dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger else if (rb->rb_right) 1192dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger rb = rb->rb_right; 1193dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger else { 1194dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger av = rb_entry(rb, struct ubi_ainf_volume, rb); 1195dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1196dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger rb = rb_parent(rb); 1197dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (rb) { 1198dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (rb->rb_left == &av->rb) 1199dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger rb->rb_left = NULL; 1200dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger else 1201dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger rb->rb_right = NULL; 1202dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1203dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1204dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger destroy_av(ai, av); 1205dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1206dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1207dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1208dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (ai->aeb_slab_cache) 1209dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kmem_cache_destroy(ai->aeb_slab_cache); 1210dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1211dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kfree(ai); 1212dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger} 1213dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1214dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger/** 121547e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy * scan_all - scan entire MTD device. 1216801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ubi: UBI device description object 1217dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @ai: attach info object 1218dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @start: start scanning at this PEB 1219801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 1220801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * This function does full scanning of an MTD device and returns complete 1221fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * information about it in form of a "struct ubi_attach_info" object. In case 1222fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy * of failure, an error code is returned. 1223801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 1224dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerstatic int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai, 1225dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger int start) 1226801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 1227801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int err, pnum; 1228801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy struct rb_node *rb1, *rb2; 1229517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy struct ubi_ainf_volume *av; 12302c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb; 1231801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1232801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = -ENOMEM; 12336c1e875ca6f3a47b40dce715bd07fdfdb8388d55Artem Bityutskiy 1234801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); 1235801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (!ech) 1236dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return err; 1237801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 123833818bbb84cd371b63ed8849cc5264d24c8b3aa2Artem Bityutskiy vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); 1239801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (!vidh) 1240801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out_ech; 1241801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1242dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger for (pnum = start; pnum < ubi->peb_count; pnum++) { 1243801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy cond_resched(); 1244801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1245c8566350a3229ca505b84313c65d1403b4d0cbfcArtem Bityutskiy dbg_gen("process PEB %d", pnum); 1246dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = scan_peb(ubi, ai, pnum, NULL, NULL); 1247801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err < 0) 1248801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out_vidh; 1249801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1250801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1251719bb84017fcfc949a77e150dd5b045e90a4ebc9Artem Bityutskiy ubi_msg("scanning is finished"); 1252801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 12534bc1dca4b0eb4dfbf100895bfc1256f21e3c901aArtem Bityutskiy /* Calculate mean erase counter */ 1254a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ai->ec_count) 1255a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count); 1256801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1257fbd0107f4d33be01c9fb2c630036bd66b7e3d4dcArtem Bityutskiy err = late_analysis(ubi, ai); 12580798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy if (err) 12590798cea8c2e1afee59686c51d27d0e96b05e42d1Artem Bityutskiy goto out_vidh; 12604a406856ea6830d8b8dba6a27d9f9331c5f4c13aArtem Bityutskiy 12614a406856ea6830d8b8dba6a27d9f9331c5f4c13aArtem Bityutskiy /* 1262801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * In case of unknown erase counter we use the mean erase counter 1263801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * value. 1264801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 1265517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { 1266517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) 12679c47fb2fbe585698e9e6dac3ec033ea94765f38cArtem Bityutskiy if (aeb->ec == UBI_UNKNOWN) 1268a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy aeb->ec = ai->mean_ec; 1269801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1270801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1271a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->free, u.list) { 12729c47fb2fbe585698e9e6dac3ec033ea94765f38cArtem Bityutskiy if (aeb->ec == UBI_UNKNOWN) 1273a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy aeb->ec = ai->mean_ec; 1274801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1275801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1276a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->corr, u.list) 12779c47fb2fbe585698e9e6dac3ec033ea94765f38cArtem Bityutskiy if (aeb->ec == UBI_UNKNOWN) 1278a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy aeb->ec = ai->mean_ec; 1279801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1280a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->erase, u.list) 12819c47fb2fbe585698e9e6dac3ec033ea94765f38cArtem Bityutskiy if (aeb->ec == UBI_UNKNOWN) 1282a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy aeb->ec = ai->mean_ec; 1283801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1284a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy err = self_check_ai(ubi, ai); 1285adbf05e3ec6ea380ba145b6fa89d9125ed76eb98Artem Bityutskiy if (err) 1286801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out_vidh; 1287801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1288801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_free_vid_hdr(ubi, vidh); 1289801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy kfree(ech); 1290801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1291dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return 0; 1292801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1293801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiyout_vidh: 1294801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_free_vid_hdr(ubi, vidh); 1295801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiyout_ech: 1296801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy kfree(ech); 1297dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return err; 1298dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger} 1299dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1300dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger#ifdef CONFIG_MTD_UBI_FASTMAP 1301dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1302dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger/** 1303dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * scan_fastmap - try to find a fastmap and attach from it. 1304dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @ubi: UBI device description object 1305dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @ai: attach info object 1306dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * 1307dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * Returns 0 on success, negative return values indicate an internal 1308dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * error. 1309dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * UBI_NO_FASTMAP denotes that no fastmap was found. 1310dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * UBI_BAD_FASTMAP denotes that the found fastmap was invalid. 1311dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger */ 1312dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerstatic int scan_fast(struct ubi_device *ubi, struct ubi_attach_info *ai) 1313dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger{ 1314dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger int err, pnum, fm_anchor = -1; 1315dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger unsigned long long max_sqnum = 0; 1316dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1317dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = -ENOMEM; 1318dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1319dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); 1320dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (!ech) 1321dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger goto out; 1322dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1323dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); 1324dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (!vidh) 1325dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger goto out_ech; 1326dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1327dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger for (pnum = 0; pnum < UBI_FM_MAX_START; pnum++) { 1328dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger int vol_id = -1; 1329dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger unsigned long long sqnum = -1; 1330dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger cond_resched(); 1331dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1332dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger dbg_gen("process PEB %d", pnum); 1333dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = scan_peb(ubi, ai, pnum, &vol_id, &sqnum); 1334dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (err < 0) 1335dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger goto out_vidh; 1336dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1337dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (vol_id == UBI_FM_SB_VOLUME_ID && sqnum > max_sqnum) { 1338dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger max_sqnum = sqnum; 1339dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger fm_anchor = pnum; 1340dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1341dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1342dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1343dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ubi_free_vid_hdr(ubi, vidh); 1344dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kfree(ech); 1345dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1346dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (fm_anchor < 0) 1347dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return UBI_NO_FASTMAP; 1348dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1349dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return ubi_scan_fastmap(ubi, ai, fm_anchor); 1350dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1351dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerout_vidh: 1352dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ubi_free_vid_hdr(ubi, vidh); 1353dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerout_ech: 1354dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kfree(ech); 1355dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerout: 1356dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return err; 1357dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger} 1358dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1359dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger#endif 1360dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1361dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerstatic struct ubi_attach_info *alloc_ai(const char *slab_name) 1362dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger{ 1363dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger struct ubi_attach_info *ai; 1364dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1365dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL); 1366dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (!ai) 1367dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return ai; 1368dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1369dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger INIT_LIST_HEAD(&ai->corr); 1370dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger INIT_LIST_HEAD(&ai->free); 1371dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger INIT_LIST_HEAD(&ai->erase); 1372dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger INIT_LIST_HEAD(&ai->alien); 1373dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ai->volumes = RB_ROOT; 1374dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ai->aeb_slab_cache = kmem_cache_create(slab_name, 1375dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger sizeof(struct ubi_ainf_peb), 1376dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 0, 0, NULL); 1377dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (!ai->aeb_slab_cache) { 1378dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger kfree(ai); 1379dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ai = NULL; 1380dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1381dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1382dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return ai; 1383801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 1384801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1385801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy/** 138647e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy * ubi_attach - attach an MTD device. 138747e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy * @ubi: UBI device descriptor 1388dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger * @force_scan: if set to non-zero attach by scanning 138947e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy * 139047e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy * This function returns zero in case of success and a negative error code in 139147e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy * case of failure. 139247e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy */ 1393dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinbergerint ubi_attach(struct ubi_device *ubi, int force_scan) 139447e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy{ 139547e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy int err; 139647e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy struct ubi_attach_info *ai; 139747e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 1398dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ai = alloc_ai("ubi_aeb_slab_cache"); 1399dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (!ai) 1400dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return -ENOMEM; 1401dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1402dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger#ifdef CONFIG_MTD_UBI_FASTMAP 1403dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger /* On small flash devices we disable fastmap in any case. */ 1404dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if ((int)mtd_div_by_eb(ubi->mtd->size, ubi->mtd) <= UBI_FM_MAX_START) { 1405dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ubi->fm_disabled = 1; 1406dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger force_scan = 1; 1407dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1408dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1409dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (force_scan) 1410dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = scan_all(ubi, ai, 0); 1411dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger else { 1412dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = scan_fast(ubi, ai); 1413dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (err > 0) { 1414dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (err != UBI_NO_FASTMAP) { 1415dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger destroy_ai(ai); 1416dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger ai = alloc_ai("ubi_aeb_slab_cache2"); 1417dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (!ai) 1418dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger return -ENOMEM; 1419dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 14204b3e0a25aa5518892ec8dbfafdd6a57789aa0c22Richard Weinberger err = scan_all(ubi, ai, 0); 14214b3e0a25aa5518892ec8dbfafdd6a57789aa0c22Richard Weinberger } else { 14224b3e0a25aa5518892ec8dbfafdd6a57789aa0c22Richard Weinberger err = scan_all(ubi, ai, UBI_FM_MAX_START); 14234b3e0a25aa5518892ec8dbfafdd6a57789aa0c22Richard Weinberger } 1424dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1425dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1426dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger#else 1427dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = scan_all(ubi, ai, 0); 1428dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger#endif 1429dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (err) 1430dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger goto out_ai; 143147e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 143247e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy ubi->bad_peb_count = ai->bad_peb_count; 143347e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy ubi->good_peb_count = ubi->peb_count - ubi->bad_peb_count; 143447e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy ubi->corr_peb_count = ai->corr_peb_count; 143547e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy ubi->max_ec = ai->max_ec; 143647e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy ubi->mean_ec = ai->mean_ec; 1437719bb84017fcfc949a77e150dd5b045e90a4ebc9Artem Bityutskiy dbg_gen("max. sequence number: %llu", ai->max_sqnum); 143847e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 143947e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy err = ubi_read_volume_table(ubi, ai); 144047e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy if (err) 144147e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy goto out_ai; 144247e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 144347e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy err = ubi_wl_init(ubi, ai); 144447e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy if (err) 144547e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy goto out_vtbl; 144647e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 144747e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy err = ubi_eba_init(ubi, ai); 144847e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy if (err) 144947e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy goto out_wl; 145047e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 1451dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger#ifdef CONFIG_MTD_UBI_FASTMAP 145264575574f26d7969713ede9bde750c979da4037eEzequiel Garcia if (ubi->fm && ubi_dbg_chk_gen(ubi)) { 1453dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger struct ubi_attach_info *scan_ai; 1454dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1455dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger scan_ai = alloc_ai("ubi_ckh_aeb_slab_cache"); 14564d525145a6f12b8835795beb833444d3da48fd05Julia Lawall if (!scan_ai) { 14574d525145a6f12b8835795beb833444d3da48fd05Julia Lawall err = -ENOMEM; 1458dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger goto out_wl; 14594d525145a6f12b8835795beb833444d3da48fd05Julia Lawall } 1460dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1461dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = scan_all(ubi, scan_ai, 0); 1462dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (err) { 1463dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger destroy_ai(scan_ai); 1464dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger goto out_wl; 1465dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1466dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1467dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger err = self_check_eba(ubi, ai, scan_ai); 1468dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger destroy_ai(scan_ai); 1469dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1470dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger if (err) 1471dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger goto out_wl; 1472dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger } 1473dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger#endif 1474dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger 1475dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger destroy_ai(ai); 147647e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy return 0; 147747e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 147847e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiyout_wl: 147947e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy ubi_wl_close(ubi); 148047e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiyout_vtbl: 148147e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy ubi_free_internal_volumes(ubi); 148247e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy vfree(ubi->vtbl); 148347e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiyout_ai: 1484dac6e2087a4143cfc3fc1017bf24b9d4be3055b7Richard Weinberger destroy_ai(ai); 148547e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy return err; 148647e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy} 148747e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy 148847e1ec70b2c57f39752ae3210d89a625768f3e12Artem Bityutskiy/** 1489a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * self_check_ai - check the attaching information. 1490801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * @ubi: UBI device description object 1491a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * @ai: attaching information 1492801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * 1493a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * This function returns zero if the attaching information is all right, and a 1494adbf05e3ec6ea380ba145b6fa89d9125ed76eb98Artem Bityutskiy * negative error code if not or if an error occurred. 1495801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 1496a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiystatic int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai) 1497801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy{ 1498801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int pnum, err, vols_found = 0; 1499801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy struct rb_node *rb1, *rb2; 1500517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy struct ubi_ainf_volume *av; 15012c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy struct ubi_ainf_peb *aeb, *last_aeb; 1502801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy uint8_t *buf; 1503801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 150464575574f26d7969713ede9bde750c979da4037eEzequiel Garcia if (!ubi_dbg_chk_gen(ubi)) 150592d124f5314913a21f7fa98b22ee457dab171eddArtem Bityutskiy return 0; 150692d124f5314913a21f7fa98b22ee457dab171eddArtem Bityutskiy 1507801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 1508a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy * At first, check that attaching information is OK. 1509801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 1510517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { 1511801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int leb_count = 0; 1512801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1513801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy cond_resched(); 1514801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1515801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy vols_found += 1; 1516801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1517a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (ai->is_empty) { 1518801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad is_empty flag"); 1519517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy goto bad_av; 1520801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1521801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1522517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_id < 0 || av->highest_lnum < 0 || 1523517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->leb_count < 0 || av->vol_type < 0 || av->used_ebs < 0 || 1524517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->data_pad < 0 || av->last_data_size < 0) { 1525801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("negative values"); 1526517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy goto bad_av; 1527801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1528801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1529517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_id >= UBI_MAX_VOLUMES && 1530517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->vol_id < UBI_INTERNAL_VOL_START) { 1531801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad vol_id"); 1532517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy goto bad_av; 1533801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1534801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1535517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_id > ai->highest_vol_id) { 1536801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("highest_vol_id is %d, but vol_id %d is there", 1537517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ai->highest_vol_id, av->vol_id); 1538801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out; 1539801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1540801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1541517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_type != UBI_DYNAMIC_VOLUME && 1542517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy av->vol_type != UBI_STATIC_VOLUME) { 1543801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad vol_type"); 1544517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy goto bad_av; 1545801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1546801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1547517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->data_pad > ubi->leb_size / 2) { 1548801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad data_pad"); 1549517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy goto bad_av; 1550801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1551801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 15522c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy last_aeb = NULL; 1553517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) { 1554801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy cond_resched(); 1555801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 15562c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy last_aeb = aeb; 1557801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy leb_count += 1; 1558801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 15592c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (aeb->pnum < 0 || aeb->ec < 0) { 1560801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("negative values"); 15612c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1562801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1563801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1564a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (aeb->ec < ai->min_ec) { 1565a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ubi_err("bad ai->min_ec (%d), %d found", 1566a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->min_ec, aeb->ec); 15672c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1568801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1569801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1570a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (aeb->ec > ai->max_ec) { 1571a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ubi_err("bad ai->max_ec (%d), %d found", 1572a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->max_ec, aeb->ec); 15732c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1574801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1575801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 15762c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (aeb->pnum >= ubi->peb_count) { 1577801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("too high PEB number %d, total PEBs %d", 15782c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb->pnum, ubi->peb_count); 15792c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1580801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1581801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1582517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_type == UBI_STATIC_VOLUME) { 1583517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (aeb->lnum >= av->used_ebs) { 1584801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad lnum or used_ebs"); 15852c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1586801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1587801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } else { 1588517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->used_ebs != 0) { 1589801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("non-zero used_ebs"); 15902c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1591801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1592801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1593801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1594517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (aeb->lnum > av->highest_lnum) { 1595801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("incorrect highest_lnum or lnum"); 15962c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1597801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1598801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1599801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1600517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->leb_count != leb_count) { 1601801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad leb_count, %d objects in the tree", 1602801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy leb_count); 1603517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy goto bad_av; 1604801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1605801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 16062c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (!last_aeb) 1607801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy continue; 1608801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 16092c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy aeb = last_aeb; 1610801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1611517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (aeb->lnum != av->highest_lnum) { 1612801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad highest_lnum"); 16132c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy goto bad_aeb; 1614801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1615801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1616801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1617a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy if (vols_found != ai->vols_found) { 1618a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ubi_err("bad ai->vols_found %d, should be %d", 1619a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ai->vols_found, vols_found); 1620801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out; 1621801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1622801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1623a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy /* Check that attaching information is correct */ 1624517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) { 16252c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy last_aeb = NULL; 1626517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) { 1627801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy int vol_type; 1628801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1629801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy cond_resched(); 1630801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 16312c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy last_aeb = aeb; 1632801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 16332c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy err = ubi_io_read_vid_hdr(ubi, aeb->pnum, vidh, 1); 1634801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err && err != UBI_IO_BITFLIPS) { 1635801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("VID header is not OK (%d)", err); 1636801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err > 0) 1637801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = -EIO; 1638801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 1639801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1640801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1641801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy vol_type = vidh->vol_type == UBI_VID_DYNAMIC ? 1642801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy UBI_DYNAMIC_VOLUME : UBI_STATIC_VOLUME; 1643517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_type != vol_type) { 1644801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad vol_type"); 1645801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1646801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1647801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 16482c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (aeb->sqnum != be64_to_cpu(vidh->sqnum)) { 16492c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy ubi_err("bad sqnum %llu", aeb->sqnum); 1650801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1651801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1652801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1653517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->vol_id != be32_to_cpu(vidh->vol_id)) { 1654517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_err("bad vol_id %d", av->vol_id); 1655801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1656801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1657801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1658517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->compat != vidh->compat) { 1659801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("bad compat %d", vidh->compat); 1660801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1661801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1662801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 16632c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (aeb->lnum != be32_to_cpu(vidh->lnum)) { 16642c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy ubi_err("bad lnum %d", aeb->lnum); 1665801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1666801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1667801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1668517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->used_ebs != be32_to_cpu(vidh->used_ebs)) { 1669517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_err("bad used_ebs %d", av->used_ebs); 1670801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1671801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1672801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1673517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->data_pad != be32_to_cpu(vidh->data_pad)) { 1674517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_err("bad data_pad %d", av->data_pad); 1675801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1676801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1677801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1678801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 16792c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy if (!last_aeb) 1680801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy continue; 1681801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1682517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->highest_lnum != be32_to_cpu(vidh->lnum)) { 1683517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_err("bad highest_lnum %d", av->highest_lnum); 1684801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1685801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1686801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1687517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy if (av->last_data_size != be32_to_cpu(vidh->data_size)) { 1688517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_err("bad last_data_size %d", av->last_data_size); 1689801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto bad_vid_hdr; 1690801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1691801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1692801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1693801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy /* 1694801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * Make sure that all the physical eraseblocks are in one of the lists 1695801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy * or trees. 1696801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy */ 1697d9b0744d6c75f7b268b728cdd1843f31bdeba311Mariusz Kozlowski buf = kzalloc(ubi->peb_count, GFP_KERNEL); 1698801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (!buf) 1699801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return -ENOMEM; 1700801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1701801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy for (pnum = 0; pnum < ubi->peb_count; pnum++) { 1702801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = ubi_io_is_bad(ubi, pnum); 1703341e1a0cf2d8965c8b2f7941a6b2f2c2170df469Artem Bityutskiy if (err < 0) { 1704341e1a0cf2d8965c8b2f7941a6b2f2c2170df469Artem Bityutskiy kfree(buf); 1705801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return err; 17069c9ec147709e63e4e8ac6a037c6bb50688ff8e9cArtem Bityutskiy } else if (err) 1707d9b0744d6c75f7b268b728cdd1843f31bdeba311Mariusz Kozlowski buf[pnum] = 1; 1708801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1709801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1710517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) 1711517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) 17122c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy buf[aeb->pnum] = 1; 1713801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1714a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->free, u.list) 17152c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy buf[aeb->pnum] = 1; 1716801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1717a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->corr, u.list) 17182c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy buf[aeb->pnum] = 1; 1719801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1720a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->erase, u.list) 17212c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy buf[aeb->pnum] = 1; 1722801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1723a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy list_for_each_entry(aeb, &ai->alien, u.list) 17242c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy buf[aeb->pnum] = 1; 1725801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1726801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = 0; 1727801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy for (pnum = 0; pnum < ubi->peb_count; pnum++) 1728d9b0744d6c75f7b268b728cdd1843f31bdeba311Mariusz Kozlowski if (!buf[pnum]) { 1729801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy ubi_err("PEB %d is not referred", pnum); 1730801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy err = 1; 1731801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy } 1732801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1733801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy kfree(buf); 1734801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy if (err) 1735801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out; 1736801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy return 0; 1737801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 17382c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiybad_aeb: 1739a4e6042f1d073073f88e0ad6d2a7450da9a3937dArtem Bityutskiy ubi_err("bad attaching information about LEB %d", aeb->lnum); 17402c5ec5ce66c0170829c5c128b9235429936442acArtem Bityutskiy ubi_dump_aeb(aeb, 0); 1741517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_dump_av(av); 1742801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out; 1743801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1744517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiybad_av: 1745517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_err("bad attaching information about volume %d", av->vol_id); 1746517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_dump_av(av); 1747801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy goto out; 1748801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1749801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiybad_vid_hdr: 1750517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_err("bad attaching information about volume %d", av->vol_id); 1751517af48c0540e61bbe0ebbb5f463afe937b73894Artem Bityutskiy ubi_dump_av(av); 1752a904e3f1deb21b986b7789a830fa8f132ff3d406Artem Bityutskiy ubi_dump_vid_hdr(vidh); 1753801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy 1754801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiyout: 175525886a368d58edd9bb0f63d4417d2f73592b9dbaArtem Bityutskiy dump_stack(); 1756adbf05e3ec6ea380ba145b6fa89d9125ed76eb98Artem Bityutskiy return -EINVAL; 1757801c135ce73d5df1caf3eca35b66a10824ae0707Artem B. Bityutskiy} 1758