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