Blame view

drivers/mtd/ubi/attach.c 46.9 KB
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  /*
   * Copyright (c) International Business Machines Corp., 2006
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
   * the GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
   *
   * Author: Artem Bityutskiy (Битюцкий Артём)
   */
  
  /*
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
22
   * UBI attaching sub-system.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
23
   *
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
24
25
   * This sub-system is responsible for attaching MTD devices and it also
   * implements flash media scanning.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
26
   *
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
27
   * The attaching information is represented by a &struct ubi_attach_info'
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
28
29
30
   * object. Information about volumes is represented by &struct ubi_ainf_volume
   * objects which are kept in volume RB-tree with root at the @volumes field.
   * The RB-tree is indexed by the volume ID.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
31
   *
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
32
33
34
35
36
   * Logical eraseblocks are represented by &struct ubi_ainf_peb objects. These
   * objects are kept in per-volume RB-trees with the root at the corresponding
   * &struct ubi_ainf_volume object. To put it differently, we keep an RB-tree of
   * per-volume objects and each of these objects is the root of RB-tree of
   * per-LEB objects.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
37
38
39
40
   *
   * Corrupted physical eraseblocks are put to the @corr list, free physical
   * eraseblocks are put to the @free list and the physical eraseblock to be
   * erased are put to the @erase list.
0525dac9f   Artem Bityutskiy   UBI: do not put e...
41
   *
fef2deb31   Artem Bityutskiy   UBI: cleanup comm...
42
43
44
45
46
47
48
49
   * About corruptions
   * ~~~~~~~~~~~~~~~~~
   *
   * UBI protects EC and VID headers with CRC-32 checksums, so it can detect
   * whether the headers are corrupted or not. Sometimes UBI also protects the
   * data with CRC-32, e.g., when it executes the atomic LEB change operation, or
   * when it moves the contents of a PEB for wear-leveling purposes.
   *
0525dac9f   Artem Bityutskiy   UBI: do not put e...
50
   * UBI tries to distinguish between 2 types of corruptions.
fef2deb31   Artem Bityutskiy   UBI: cleanup comm...
51
52
53
   *
   * 1. Corruptions caused by power cuts. These are expected corruptions and UBI
   * tries to handle them gracefully, without printing too many warnings and
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
54
55
56
57
   * error messages. The idea is that we do not lose important data in these
   * cases - we may lose only the data which were being written to the media just
   * before the power cut happened, and the upper layers (e.g., UBIFS) are
   * supposed to handle such data losses (e.g., by using the FS journal).
fef2deb31   Artem Bityutskiy   UBI: cleanup comm...
58
59
60
61
   *
   * When UBI detects a corruption (CRC-32 mismatch) in a PEB, and it looks like
   * the reason is a power cut, UBI puts this PEB to the @erase list, and all
   * PEBs in the @erase list are scheduled for erasure later.
0525dac9f   Artem Bityutskiy   UBI: do not put e...
62
63
   *
   * 2. Unexpected corruptions which are not caused by power cuts. During
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
64
   * attaching, such PEBs are put to the @corr list and UBI preserves them.
fef2deb31   Artem Bityutskiy   UBI: cleanup comm...
65
66
67
   * Obviously, this lessens the amount of available PEBs, and if at some  point
   * UBI runs out of free PEBs, it switches to R/O mode. UBI also loudly informs
   * about such PEBs every time the MTD device is attached.
45aafd329   Artem Bityutskiy   UBI: tighten the ...
68
69
   *
   * However, it is difficult to reliably distinguish between these types of
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
70
71
72
73
74
75
76
   * corruptions and UBI's strategy is as follows (in case of attaching by
   * scanning). UBI assumes corruption type 2 if the VID header is corrupted and
   * the data area does not contain all 0xFFs, and there were no bit-flips or
   * integrity errors (e.g., ECC errors in case of NAND) while reading the data
   * area.  Otherwise UBI assumes corruption type 1. So the decision criteria
   * are as follows.
   *   o If the data area contains only 0xFFs, there are no data, and it is safe
fef2deb31   Artem Bityutskiy   UBI: cleanup comm...
77
78
   *     to just erase this PEB - this is corruption type 1.
   *   o If the data area has bit-flips or data integrity errors (ECC errors on
45aafd329   Artem Bityutskiy   UBI: tighten the ...
79
   *     NAND), it is probably a PEB which was being erased when power cut
fef2deb31   Artem Bityutskiy   UBI: cleanup comm...
80
81
   *     happened, so this is corruption type 1. However, this is just a guess,
   *     which might be wrong.
55393ba1b   Brian Norris   UBI: fix trivial ...
82
   *   o Otherwise this is corruption type 2.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
83
84
85
   */
  
  #include <linux/err.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
86
  #include <linux/slab.h>
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
87
  #include <linux/crc32.h>
3013ee31b   Artem Bityutskiy   UBI: use nicer 64...
88
  #include <linux/math64.h>
095751a6e   Matthieu CASTET   UBI: generate ran...
89
  #include <linux/random.h>
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
90
  #include "ubi.h"
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
91
  static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
92
93
94
95
  
  /* Temporary variables used during scanning */
  static struct ubi_ec_hdr *ech;
  static struct ubi_vid_hdr *vidh;
941dfb07e   Artem Bityutskiy   UBI: set correct ...
96
  /**
78d87c95b   Artem Bityutskiy   UBI: fix error pa...
97
   * add_to_list - add physical eraseblock to a list.
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
98
   * @ai: attaching information
78d87c95b   Artem Bityutskiy   UBI: fix error pa...
99
   * @pnum: physical eraseblock number to add
6dd3bc7e6   Joel Reardon   UBI: add volume i...
100
101
   * @vol_id: the last used volume id for the PEB
   * @lnum: the last used LEB number for the PEB
78d87c95b   Artem Bityutskiy   UBI: fix error pa...
102
   * @ec: erase counter of the physical eraseblock
0525dac9f   Artem Bityutskiy   UBI: do not put e...
103
   * @to_head: if not zero, add to the head of the list
78d87c95b   Artem Bityutskiy   UBI: fix error pa...
104
105
   * @list: the list to add to
   *
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
106
107
   * This function allocates a 'struct ubi_ainf_peb' object for physical
   * eraseblock @pnum and adds it to the "free", "erase", or "alien" lists.
6dd3bc7e6   Joel Reardon   UBI: add volume i...
108
109
   * It stores the @lnum and @vol_id alongside, which can both be
   * %UBI_UNKNOWN if they are not available, not readable, or not assigned.
0525dac9f   Artem Bityutskiy   UBI: do not put e...
110
111
112
113
114
   * If @to_head is not zero, PEB will be added to the head of the list, which
   * basically means it will be processed first later. E.g., we add corrupted
   * PEBs (corrupted due to power cuts) to the head of the erase list to make
   * sure we erase them first and get rid of corruptions ASAP. This function
   * returns zero in case of success and a negative error code in case of
3fb34124d   Artem Bityutskiy   UBI: separate out...
115
   * failure.
78d87c95b   Artem Bityutskiy   UBI: fix error pa...
116
   */
6dd3bc7e6   Joel Reardon   UBI: add volume i...
117
118
  static int add_to_list(struct ubi_attach_info *ai, int pnum, int vol_id,
  		       int lnum, int ec, int to_head, struct list_head *list)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
119
  {
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
120
  	struct ubi_ainf_peb *aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
121

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
122
  	if (list == &ai->free) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
123
  		dbg_bld("add to free: PEB %d, EC %d", pnum, ec);
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
124
  	} else if (list == &ai->erase) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
125
  		dbg_bld("add to erase: PEB %d, EC %d", pnum, ec);
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
126
  	} else if (list == &ai->alien) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
127
  		dbg_bld("add to alien: PEB %d, EC %d", pnum, ec);
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
128
  		ai->alien_peb_count += 1;
33789fb9d   Artem Bityutskiy   UBI: introduce er...
129
  	} else
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
130
  		BUG();
1fc2e3e59   Artem Bityutskiy   UBI: rename ubi_s...
131
  	aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
132
  	if (!aeb)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
133
  		return -ENOMEM;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
134
  	aeb->pnum = pnum;
6dd3bc7e6   Joel Reardon   UBI: add volume i...
135
136
  	aeb->vol_id = vol_id;
  	aeb->lnum = lnum;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
137
  	aeb->ec = ec;
0525dac9f   Artem Bityutskiy   UBI: do not put e...
138
  	if (to_head)
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
139
  		list_add(&aeb->u.list, list);
0525dac9f   Artem Bityutskiy   UBI: do not put e...
140
  	else
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
141
  		list_add_tail(&aeb->u.list, list);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
142
143
144
145
  	return 0;
  }
  
  /**
3fb34124d   Artem Bityutskiy   UBI: separate out...
146
   * add_corrupted - add a corrupted physical eraseblock.
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
147
   * @ai: attaching information
3fb34124d   Artem Bityutskiy   UBI: separate out...
148
149
150
   * @pnum: physical eraseblock number to add
   * @ec: erase counter of the physical eraseblock
   *
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
151
152
153
154
   * This function allocates a 'struct ubi_ainf_peb' object for a corrupted
   * physical eraseblock @pnum and adds it to the 'corr' list.  The corruption
   * was presumably not caused by a power cut. Returns zero in case of success
   * and a negative error code in case of failure.
3fb34124d   Artem Bityutskiy   UBI: separate out...
155
   */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
156
  static int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec)
3fb34124d   Artem Bityutskiy   UBI: separate out...
157
  {
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
158
  	struct ubi_ainf_peb *aeb;
3fb34124d   Artem Bityutskiy   UBI: separate out...
159
160
  
  	dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec);
1fc2e3e59   Artem Bityutskiy   UBI: rename ubi_s...
161
  	aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
162
  	if (!aeb)
3fb34124d   Artem Bityutskiy   UBI: separate out...
163
  		return -ENOMEM;
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
164
  	ai->corr_peb_count += 1;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
165
166
  	aeb->pnum = pnum;
  	aeb->ec = ec;
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
167
  	list_add(&aeb->u.list, &ai->corr);
3fb34124d   Artem Bityutskiy   UBI: separate out...
168
169
170
171
  	return 0;
  }
  
  /**
ebaaf1af3   Artem Bityutskiy   UBI: fix kernel-d...
172
   * validate_vid_hdr - check volume identifier header.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
173
   * @vid_hdr: the volume identifier header to check
517af48c0   Artem Bityutskiy   UBI: rename sv to av
174
   * @av: information about the volume this logical eraseblock belongs to
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
175
176
177
178
179
180
   * @pnum: physical eraseblock number the VID header came from
   *
   * This function checks that data stored in @vid_hdr is consistent. Returns
   * non-zero if an inconsistency was found and zero if not.
   *
   * Note, UBI does sanity check of everything it reads from the flash media.
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
181
   * Most of the checks are done in the I/O sub-system. Here we check that the
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
182
183
184
185
   * information in the VID header is consistent to the information in other VID
   * headers of the same volume.
   */
  static int validate_vid_hdr(const struct ubi_vid_hdr *vid_hdr,
517af48c0   Artem Bityutskiy   UBI: rename sv to av
186
  			    const struct ubi_ainf_volume *av, int pnum)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
187
188
  {
  	int vol_type = vid_hdr->vol_type;
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
189
190
191
  	int vol_id = be32_to_cpu(vid_hdr->vol_id);
  	int used_ebs = be32_to_cpu(vid_hdr->used_ebs);
  	int data_pad = be32_to_cpu(vid_hdr->data_pad);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
192

517af48c0   Artem Bityutskiy   UBI: rename sv to av
193
194
  	if (av->leb_count != 0) {
  		int av_vol_type;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
195
196
197
198
199
200
  
  		/*
  		 * This is not the first logical eraseblock belonging to this
  		 * volume. Ensure that the data in its VID header is consistent
  		 * to the data in previous logical eraseblock headers.
  		 */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
201
  		if (vol_id != av->vol_id) {
e2986827d   Artem Bityutskiy   UBI: get rid of d...
202
  			ubi_err("inconsistent vol_id");
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
203
204
  			goto bad;
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
205
206
  		if (av->vol_type == UBI_STATIC_VOLUME)
  			av_vol_type = UBI_VID_STATIC;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
207
  		else
517af48c0   Artem Bityutskiy   UBI: rename sv to av
208
  			av_vol_type = UBI_VID_DYNAMIC;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
209

517af48c0   Artem Bityutskiy   UBI: rename sv to av
210
  		if (vol_type != av_vol_type) {
e2986827d   Artem Bityutskiy   UBI: get rid of d...
211
  			ubi_err("inconsistent vol_type");
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
212
213
  			goto bad;
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
214
  		if (used_ebs != av->used_ebs) {
e2986827d   Artem Bityutskiy   UBI: get rid of d...
215
  			ubi_err("inconsistent used_ebs");
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
216
217
  			goto bad;
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
218
  		if (data_pad != av->data_pad) {
e2986827d   Artem Bityutskiy   UBI: get rid of d...
219
  			ubi_err("inconsistent data_pad");
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
220
221
222
223
224
225
226
227
  			goto bad;
  		}
  	}
  
  	return 0;
  
  bad:
  	ubi_err("inconsistent VID header at PEB %d", pnum);
a904e3f1d   Artem Bityutskiy   UBI: always dump ...
228
  	ubi_dump_vid_hdr(vid_hdr);
517af48c0   Artem Bityutskiy   UBI: rename sv to av
229
  	ubi_dump_av(av);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
230
231
232
233
  	return -EINVAL;
  }
  
  /**
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
234
235
   * add_volume - add volume to the attaching information.
   * @ai: attaching information
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
236
237
238
239
240
   * @vol_id: ID of the volume to add
   * @pnum: physical eraseblock number
   * @vid_hdr: volume identifier header
   *
   * If the volume corresponding to the @vid_hdr logical eraseblock is already
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
241
242
   * present in the attaching information, this function does nothing. Otherwise
   * it adds corresponding volume to the attaching information. Returns a pointer
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
243
244
   * to the allocated "av" object in case of success and a negative error code in
   * case of failure.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
245
   */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
246
  static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai,
afc15a814   Artem Bityutskiy   UBI: rename struc...
247
  					  int vol_id, int pnum,
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
248
249
  					  const struct ubi_vid_hdr *vid_hdr)
  {
517af48c0   Artem Bityutskiy   UBI: rename sv to av
250
  	struct ubi_ainf_volume *av;
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
251
  	struct rb_node **p = &ai->volumes.rb_node, *parent = NULL;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
252

3261ebd7d   Christoph Hellwig   UBI: kill homegro...
253
  	ubi_assert(vol_id == be32_to_cpu(vid_hdr->vol_id));
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
254
255
256
257
  
  	/* Walk the volume RB-tree to look if this volume is already present */
  	while (*p) {
  		parent = *p;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
258
  		av = rb_entry(parent, struct ubi_ainf_volume, rb);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
259

517af48c0   Artem Bityutskiy   UBI: rename sv to av
260
261
  		if (vol_id == av->vol_id)
  			return av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
262

517af48c0   Artem Bityutskiy   UBI: rename sv to av
263
  		if (vol_id > av->vol_id)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
264
265
266
267
268
269
  			p = &(*p)->rb_left;
  		else
  			p = &(*p)->rb_right;
  	}
  
  	/* The volume is absent - add it */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
270
271
  	av = kmalloc(sizeof(struct ubi_ainf_volume), GFP_KERNEL);
  	if (!av)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
272
  		return ERR_PTR(-ENOMEM);
517af48c0   Artem Bityutskiy   UBI: rename sv to av
273
274
275
276
277
278
279
  	av->highest_lnum = av->leb_count = 0;
  	av->vol_id = vol_id;
  	av->root = RB_ROOT;
  	av->used_ebs = be32_to_cpu(vid_hdr->used_ebs);
  	av->data_pad = be32_to_cpu(vid_hdr->data_pad);
  	av->compat = vid_hdr->compat;
  	av->vol_type = vid_hdr->vol_type == UBI_VID_DYNAMIC ? UBI_DYNAMIC_VOLUME
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
280
  							    : UBI_STATIC_VOLUME;
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
281
282
  	if (vol_id > ai->highest_vol_id)
  		ai->highest_vol_id = vol_id;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
283

517af48c0   Artem Bityutskiy   UBI: rename sv to av
284
285
  	rb_link_node(&av->rb, parent, p);
  	rb_insert_color(&av->rb, &ai->volumes);
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
286
  	ai->vols_found += 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
287
  	dbg_bld("added volume %d", vol_id);
517af48c0   Artem Bityutskiy   UBI: rename sv to av
288
  	return av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
289
290
291
  }
  
  /**
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
292
   * ubi_compare_lebs - find out which logical eraseblock is newer.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
293
   * @ubi: UBI device description object
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
294
   * @aeb: first logical eraseblock to compare
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
295
296
297
298
299
300
301
302
   * @pnum: physical eraseblock number of the second logical eraseblock to
   * compare
   * @vid_hdr: volume identifier header of the second logical eraseblock
   *
   * This function compares 2 copies of a LEB and informs which one is newer. In
   * case of success this function returns a positive value, in case of failure, a
   * negative error code is returned. The success return codes use the following
   * bits:
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
303
   *     o bit 0 is cleared: the first PEB (described by @aeb) is newer than the
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
304
305
306
307
308
309
310
   *       second PEB (described by @pnum and @vid_hdr);
   *     o bit 0 is set: the second PEB is newer;
   *     o bit 1 is cleared: no bit-flips were detected in the newer LEB;
   *     o bit 1 is set: bit-flips were detected in the newer LEB;
   *     o bit 2 is cleared: the older LEB is not corrupted;
   *     o bit 2 is set: the older LEB is corrupted.
   */
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
311
  int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
e88d6e10e   Artem Bityutskiy   UBI: do not use v...
312
  			int pnum, const struct ubi_vid_hdr *vid_hdr)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
313
  {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
314
315
  	int len, err, second_is_newer, bitflips = 0, corrupted = 0;
  	uint32_t data_crc, crc;
8bc229619   Artem Bityutskiy   UBI: fix sparse w...
316
  	struct ubi_vid_hdr *vh = NULL;
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
317
  	unsigned long long sqnum2 = be64_to_cpu(vid_hdr->sqnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
318

2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
319
  	if (sqnum2 == aeb->sqnum) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
320
  		/*
9869cd801   Artem Bityutskiy   UBI: remove pre-s...
321
322
323
324
  		 * This must be a really ancient UBI image which has been
  		 * created before sequence numbers support has been added. At
  		 * that times we used 32-bit LEB versions stored in logical
  		 * eraseblocks. That was before UBI got into mainline. We do not
0525dac9f   Artem Bityutskiy   UBI: do not put e...
325
326
  		 * support these images anymore. Well, those images still work,
  		 * but only if no unclean reboots happened.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
327
  		 */
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
328
  		ubi_err("unsupported on-flash UBI format");
9869cd801   Artem Bityutskiy   UBI: remove pre-s...
329
330
  		return -EINVAL;
  	}
64203195e   Artem Bityutskiy   UBI: add sanity c...
331

9869cd801   Artem Bityutskiy   UBI: remove pre-s...
332
  	/* Obviously the LEB with lower sequence counter is older */
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
333
  	second_is_newer = (sqnum2 > aeb->sqnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
334
335
336
337
338
339
340
  
  	/*
  	 * Now we know which copy is newer. If the copy flag of the PEB with
  	 * newer version is not set, then we just return, otherwise we have to
  	 * check data CRC. For the second PEB we already have the VID header,
  	 * for the first one - we'll need to re-read it from flash.
  	 *
9869cd801   Artem Bityutskiy   UBI: remove pre-s...
341
  	 * Note: this may be optimized so that we wouldn't read twice.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
342
343
344
345
346
347
348
349
350
351
  	 */
  
  	if (second_is_newer) {
  		if (!vid_hdr->copy_flag) {
  			/* It is not a copy, so it is newer */
  			dbg_bld("second PEB %d is newer, copy_flag is unset",
  				pnum);
  			return 1;
  		}
  	} else {
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
352
  		if (!aeb->copy_flag) {
fb22b59b2   Artem Bityutskiy   UBI: remember cop...
353
354
355
356
357
  			/* It is not a copy, so it is newer */
  			dbg_bld("first PEB %d is newer, copy_flag is unset",
  				pnum);
  			return bitflips << 1;
  		}
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
358

33818bbb8   Artem Bityutskiy   UBI: allocate mem...
359
  		vh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
8bc229619   Artem Bityutskiy   UBI: fix sparse w...
360
  		if (!vh)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
361
  			return -ENOMEM;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
362
  		pnum = aeb->pnum;
8bc229619   Artem Bityutskiy   UBI: fix sparse w...
363
  		err = ubi_io_read_vid_hdr(ubi, pnum, vh, 0);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
364
365
366
367
  		if (err) {
  			if (err == UBI_IO_BITFLIPS)
  				bitflips = 1;
  			else {
049333cec   Artem Bityutskiy   UBI: comply with ...
368
369
  				ubi_err("VID of PEB %d header is bad, but it was OK earlier, err %d",
  					pnum, err);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
370
371
372
373
374
375
  				if (err > 0)
  					err = -EIO;
  
  				goto out_free_vidh;
  			}
  		}
8bc229619   Artem Bityutskiy   UBI: fix sparse w...
376
  		vid_hdr = vh;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
377
378
379
  	}
  
  	/* Read the data of the copy and check the CRC */
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
380
  	len = be32_to_cpu(vid_hdr->data_size);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
381

d125a7534   Artem Bityutskiy   UBI: do not alloc...
382
383
  	mutex_lock(&ubi->buf_mutex);
  	err = ubi_io_read_data(ubi, ubi->peb_buf, pnum, 0, len);
d57f40544   Brian Norris   mtd: utilize `mtd...
384
  	if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err))
d125a7534   Artem Bityutskiy   UBI: do not alloc...
385
  		goto out_unlock;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
386

3261ebd7d   Christoph Hellwig   UBI: kill homegro...
387
  	data_crc = be32_to_cpu(vid_hdr->data_crc);
d125a7534   Artem Bityutskiy   UBI: do not alloc...
388
  	crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, len);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
389
390
391
392
393
394
395
396
397
398
  	if (crc != data_crc) {
  		dbg_bld("PEB %d CRC error: calculated %#08x, must be %#08x",
  			pnum, crc, data_crc);
  		corrupted = 1;
  		bitflips = 0;
  		second_is_newer = !second_is_newer;
  	} else {
  		dbg_bld("PEB %d CRC is OK", pnum);
  		bitflips = !!err;
  	}
d125a7534   Artem Bityutskiy   UBI: do not alloc...
399
  	mutex_unlock(&ubi->buf_mutex);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
400

8bc229619   Artem Bityutskiy   UBI: fix sparse w...
401
  	ubi_free_vid_hdr(ubi, vh);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
402
403
404
405
406
407
408
  
  	if (second_is_newer)
  		dbg_bld("second PEB %d is newer, copy_flag is set", pnum);
  	else
  		dbg_bld("first PEB %d is newer, copy_flag is set", pnum);
  
  	return second_is_newer | (bitflips << 1) | (corrupted << 2);
d125a7534   Artem Bityutskiy   UBI: do not alloc...
409
410
  out_unlock:
  	mutex_unlock(&ubi->buf_mutex);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
411
  out_free_vidh:
8bc229619   Artem Bityutskiy   UBI: fix sparse w...
412
  	ubi_free_vid_hdr(ubi, vh);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
413
414
415
416
  	return err;
  }
  
  /**
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
417
   * ubi_add_to_av - add used physical eraseblock to the attaching information.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
418
   * @ubi: UBI device description object
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
419
   * @ai: attaching information
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
420
421
422
423
424
   * @pnum: the physical eraseblock number
   * @ec: erase counter
   * @vid_hdr: the volume identifier header
   * @bitflips: if bit-flips were detected when this physical eraseblock was read
   *
79b510c0f   Artem Bityutskiy   UBI: add few more...
425
426
427
428
429
430
   * This function adds information about a used physical eraseblock to the
   * 'used' tree of the corresponding volume. The function is rather complex
   * because it has to handle cases when this is not the first physical
   * eraseblock belonging to the same logical eraseblock, and the newer one has
   * to be picked, while the older one has to be dropped. This function returns
   * zero in case of success and a negative error code in case of failure.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
431
   */
3561188ac   Artem Bityutskiy   UBI: rename ubi_s...
432
433
  int ubi_add_to_av(struct ubi_device *ubi, struct ubi_attach_info *ai, int pnum,
  		  int ec, const struct ubi_vid_hdr *vid_hdr, int bitflips)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
434
435
  {
  	int err, vol_id, lnum;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
436
  	unsigned long long sqnum;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
437
  	struct ubi_ainf_volume *av;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
438
  	struct ubi_ainf_peb *aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
439
  	struct rb_node **p, *parent = NULL;
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
440
441
442
  	vol_id = be32_to_cpu(vid_hdr->vol_id);
  	lnum = be32_to_cpu(vid_hdr->lnum);
  	sqnum = be64_to_cpu(vid_hdr->sqnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
443

9869cd801   Artem Bityutskiy   UBI: remove pre-s...
444
445
  	dbg_bld("PEB %d, LEB %d:%d, EC %d, sqnum %llu, bitflips %d",
  		pnum, vol_id, lnum, ec, sqnum, bitflips);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
446

517af48c0   Artem Bityutskiy   UBI: rename sv to av
447
448
449
  	av = add_volume(ai, vol_id, pnum, vid_hdr);
  	if (IS_ERR(av))
  		return PTR_ERR(av);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
450

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
451
452
  	if (ai->max_sqnum < sqnum)
  		ai->max_sqnum = sqnum;
76eafe479   Brijesh Singh   UBI: bugfix in sq...
453

801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
454
455
456
457
  	/*
  	 * Walk the RB-tree of logical eraseblocks of volume @vol_id to look
  	 * if this is the first instance of this logical eraseblock or not.
  	 */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
458
  	p = &av->root.rb_node;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
459
460
461
462
  	while (*p) {
  		int cmp_res;
  
  		parent = *p;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
463
464
465
  		aeb = rb_entry(parent, struct ubi_ainf_peb, u.rb);
  		if (lnum != aeb->lnum) {
  			if (lnum < aeb->lnum)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
466
467
468
469
470
471
472
473
474
475
  				p = &(*p)->rb_left;
  			else
  				p = &(*p)->rb_right;
  			continue;
  		}
  
  		/*
  		 * There is already a physical eraseblock describing the same
  		 * logical eraseblock present.
  		 */
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
476
477
  		dbg_bld("this LEB already exists: PEB %d, sqnum %llu, EC %d",
  			aeb->pnum, aeb->sqnum, aeb->ec);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
478
479
480
481
482
  
  		/*
  		 * Make sure that the logical eraseblocks have different
  		 * sequence numbers. Otherwise the image is bad.
  		 *
9869cd801   Artem Bityutskiy   UBI: remove pre-s...
483
484
485
486
487
  		 * However, if the sequence number is zero, we assume it must
  		 * be an ancient UBI image from the era when UBI did not have
  		 * sequence numbers. We still can attach these images, unless
  		 * there is a need to distinguish between old and new
  		 * eraseblocks, in which case we'll refuse the image in
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
488
  		 * 'ubi_compare_lebs()'. In other words, we attach old clean
9869cd801   Artem Bityutskiy   UBI: remove pre-s...
489
490
  		 * images, but refuse attaching old images with duplicated
  		 * logical eraseblocks because there was an unclean reboot.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
491
  		 */
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
492
  		if (aeb->sqnum == sqnum && sqnum != 0) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
493
494
  			ubi_err("two LEBs with same sequence number %llu",
  				sqnum);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
495
  			ubi_dump_aeb(aeb, 0);
a904e3f1d   Artem Bityutskiy   UBI: always dump ...
496
  			ubi_dump_vid_hdr(vid_hdr);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
497
498
499
500
501
502
503
  			return -EINVAL;
  		}
  
  		/*
  		 * Now we have to drop the older one and preserve the newer
  		 * one.
  		 */
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
504
  		cmp_res = ubi_compare_lebs(ubi, aeb, pnum, vid_hdr);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
505
506
507
508
509
  		if (cmp_res < 0)
  			return cmp_res;
  
  		if (cmp_res & 1) {
  			/*
3f5026222   Shinya Kuribayashi   UBI: fix s/then/t...
510
  			 * This logical eraseblock is newer than the one
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
511
512
  			 * found earlier.
  			 */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
513
  			err = validate_vid_hdr(vid_hdr, av, pnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
514
515
  			if (err)
  				return err;
6dd3bc7e6   Joel Reardon   UBI: add volume i...
516
517
  			err = add_to_list(ai, aeb->pnum, aeb->vol_id,
  					  aeb->lnum, aeb->ec, cmp_res & 4,
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
518
  					  &ai->erase);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
519
520
  			if (err)
  				return err;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
521
522
  			aeb->ec = ec;
  			aeb->pnum = pnum;
6dd3bc7e6   Joel Reardon   UBI: add volume i...
523
524
  			aeb->vol_id = vol_id;
  			aeb->lnum = lnum;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
525
526
527
  			aeb->scrub = ((cmp_res & 2) || bitflips);
  			aeb->copy_flag = vid_hdr->copy_flag;
  			aeb->sqnum = sqnum;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
528

517af48c0   Artem Bityutskiy   UBI: rename sv to av
529
530
  			if (av->highest_lnum == lnum)
  				av->last_data_size =
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
531
  					be32_to_cpu(vid_hdr->data_size);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
532
533
534
535
  
  			return 0;
  		} else {
  			/*
025dfdafe   Frederik Schwarzer   trivial: fix then...
536
  			 * This logical eraseblock is older than the one found
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
537
538
  			 * previously.
  			 */
6dd3bc7e6   Joel Reardon   UBI: add volume i...
539
540
  			return add_to_list(ai, pnum, vol_id, lnum, ec,
  					   cmp_res & 4, &ai->erase);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
541
542
543
544
545
  		}
  	}
  
  	/*
  	 * We've met this logical eraseblock for the first time, add it to the
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
546
  	 * attaching information.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
547
  	 */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
548
  	err = validate_vid_hdr(vid_hdr, av, pnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
549
550
  	if (err)
  		return err;
1fc2e3e59   Artem Bityutskiy   UBI: rename ubi_s...
551
  	aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
552
  	if (!aeb)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
553
  		return -ENOMEM;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
554
555
  	aeb->ec = ec;
  	aeb->pnum = pnum;
6dd3bc7e6   Joel Reardon   UBI: add volume i...
556
  	aeb->vol_id = vol_id;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
557
558
559
560
  	aeb->lnum = lnum;
  	aeb->scrub = bitflips;
  	aeb->copy_flag = vid_hdr->copy_flag;
  	aeb->sqnum = sqnum;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
561

517af48c0   Artem Bityutskiy   UBI: rename sv to av
562
563
564
  	if (av->highest_lnum <= lnum) {
  		av->highest_lnum = lnum;
  		av->last_data_size = be32_to_cpu(vid_hdr->data_size);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
565
  	}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
566
  	av->leb_count += 1;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
567
  	rb_link_node(&aeb->u.rb, parent, p);
517af48c0   Artem Bityutskiy   UBI: rename sv to av
568
  	rb_insert_color(&aeb->u.rb, &av->root);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
569
570
571
572
  	return 0;
  }
  
  /**
dcd85fdd1   Artem Bityutskiy   UBI: rename ubi_s...
573
   * ubi_find_av - find volume in the attaching information.
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
574
   * @ai: attaching information
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
575
576
577
   * @vol_id: the requested volume ID
   *
   * This function returns a pointer to the volume description or %NULL if there
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
578
   * are no data about this volume in the attaching information.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
579
   */
dcd85fdd1   Artem Bityutskiy   UBI: rename ubi_s...
580
581
  struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai,
  				    int vol_id)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
582
  {
517af48c0   Artem Bityutskiy   UBI: rename sv to av
583
  	struct ubi_ainf_volume *av;
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
584
  	struct rb_node *p = ai->volumes.rb_node;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
585
586
  
  	while (p) {
517af48c0   Artem Bityutskiy   UBI: rename sv to av
587
  		av = rb_entry(p, struct ubi_ainf_volume, rb);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
588

517af48c0   Artem Bityutskiy   UBI: rename sv to av
589
590
  		if (vol_id == av->vol_id)
  			return av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
591

517af48c0   Artem Bityutskiy   UBI: rename sv to av
592
  		if (vol_id > av->vol_id)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
593
594
595
596
597
598
599
600
601
  			p = p->rb_left;
  		else
  			p = p->rb_right;
  	}
  
  	return NULL;
  }
  
  /**
d717dc2f8   Artem Bityutskiy   UBI: rename ubi_s...
602
   * ubi_remove_av - delete attaching information about a volume.
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
603
   * @ai: attaching information
517af48c0   Artem Bityutskiy   UBI: rename sv to av
604
   * @av: the volume attaching information to delete
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
605
   */
d717dc2f8   Artem Bityutskiy   UBI: rename ubi_s...
606
  void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
607
608
  {
  	struct rb_node *rb;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
609
  	struct ubi_ainf_peb *aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
610

517af48c0   Artem Bityutskiy   UBI: rename sv to av
611
  	dbg_bld("remove attaching information about volume %d", av->vol_id);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
612

517af48c0   Artem Bityutskiy   UBI: rename sv to av
613
  	while ((rb = rb_first(&av->root))) {
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
614
  		aeb = rb_entry(rb, struct ubi_ainf_peb, u.rb);
517af48c0   Artem Bityutskiy   UBI: rename sv to av
615
  		rb_erase(&aeb->u.rb, &av->root);
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
616
  		list_add_tail(&aeb->u.list, &ai->erase);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
617
  	}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
618
619
  	rb_erase(&av->rb, &ai->volumes);
  	kfree(av);
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
620
  	ai->vols_found -= 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
621
622
623
  }
  
  /**
13d33dad3   Artem Bityutskiy   UBI: make ubi_sca...
624
   * early_erase_peb - erase a physical eraseblock.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
625
   * @ubi: UBI device description object
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
626
   * @ai: attaching information
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
627
   * @pnum: physical eraseblock number to erase;
9c47fb2fb   Artem Bityutskiy   UBI: rename UBI_S...
628
   * @ec: erase counter value to write (%UBI_UNKNOWN if it is unknown)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
629
630
631
   *
   * This function erases physical eraseblock 'pnum', and writes the erase
   * counter header to it. This function should only be used on UBI device
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
632
633
634
   * initialization stages, when the EBA sub-system had not been yet initialized.
   * This function returns zero in case of success and a negative error code in
   * case of failure.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
635
   */
13d33dad3   Artem Bityutskiy   UBI: make ubi_sca...
636
637
  static int early_erase_peb(struct ubi_device *ubi,
  			   const struct ubi_attach_info *ai, int pnum, int ec)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
638
639
640
  {
  	int err;
  	struct ubi_ec_hdr *ec_hdr;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
641
642
643
644
645
646
647
648
  	if ((long long)ec >= UBI_MAX_ERASECOUNTER) {
  		/*
  		 * Erase counter overflow. Upgrade UBI and use 64-bit
  		 * erase counters internally.
  		 */
  		ubi_err("erase counter overflow at PEB %d, EC %d", pnum, ec);
  		return -EINVAL;
  	}
dcec4c3bd   Florin Malita   UBI: fix leak in ...
649
650
651
  	ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
  	if (!ec_hdr)
  		return -ENOMEM;
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
652
  	ec_hdr->ec = cpu_to_be64(ec);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
653
654
655
656
657
658
659
660
661
662
663
664
665
  
  	err = ubi_io_sync_erase(ubi, pnum, 0);
  	if (err < 0)
  		goto out_free;
  
  	err = ubi_io_write_ec_hdr(ubi, pnum, ec_hdr);
  
  out_free:
  	kfree(ec_hdr);
  	return err;
  }
  
  /**
c87fbd7de   Artem Bityutskiy   UBI: rename ubi_s...
666
   * ubi_early_get_peb - get a free physical eraseblock.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
667
   * @ubi: UBI device description object
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
668
   * @ai: attaching information
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
669
670
   *
   * This function returns a free physical eraseblock. It is supposed to be
85c6e6e28   Artem Bityutskiy   UBI: amend commen...
671
672
673
674
   * called on the UBI initialization stages when the wear-leveling sub-system is
   * not initialized yet. This function picks a physical eraseblocks from one of
   * the lists, writes the EC header if it is needed, and removes it from the
   * list.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
675
   *
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
676
677
   * This function returns a pointer to the "aeb" of the found free PEB in case
   * of success and an error code in case of failure.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
678
   */
c87fbd7de   Artem Bityutskiy   UBI: rename ubi_s...
679
680
  struct ubi_ainf_peb *ubi_early_get_peb(struct ubi_device *ubi,
  				       struct ubi_attach_info *ai)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
681
  {
5fc01ab69   Artem Bityutskiy   UBI: preserve cor...
682
  	int err = 0;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
683
  	struct ubi_ainf_peb *aeb, *tmp_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
684

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
685
686
  	if (!list_empty(&ai->free)) {
  		aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
687
688
689
  		list_del(&aeb->u.list);
  		dbg_bld("return free PEB %d, EC %d", aeb->pnum, aeb->ec);
  		return aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
690
  	}
5fc01ab69   Artem Bityutskiy   UBI: preserve cor...
691
692
693
694
695
696
  	/*
  	 * We try to erase the first physical eraseblock from the erase list
  	 * and pick it if we succeed, or try to erase the next one if not. And
  	 * so forth. We don't want to take care about bad eraseblocks here -
  	 * they'll be handled later.
  	 */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
697
  	list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) {
9c47fb2fb   Artem Bityutskiy   UBI: rename UBI_S...
698
  		if (aeb->ec == UBI_UNKNOWN)
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
699
  			aeb->ec = ai->mean_ec;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
700

13d33dad3   Artem Bityutskiy   UBI: make ubi_sca...
701
  		err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1);
5fc01ab69   Artem Bityutskiy   UBI: preserve cor...
702
703
  		if (err)
  			continue;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
704

2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
705
706
707
708
  		aeb->ec += 1;
  		list_del(&aeb->u.list);
  		dbg_bld("return PEB %d, EC %d", aeb->pnum, aeb->ec);
  		return aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
709
  	}
5fc01ab69   Artem Bityutskiy   UBI: preserve cor...
710
  	ubi_err("no free eraseblocks");
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
711
712
713
714
  	return ERR_PTR(-ENOSPC);
  }
  
  /**
45aafd329   Artem Bityutskiy   UBI: tighten the ...
715
   * check_corruption - check the data area of PEB.
feeba4b87   Artem Bityutskiy   UBI: add truly co...
716
   * @ubi: UBI device description object
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
717
   * @vid_hdr: the (corrupted) VID header of this PEB
feeba4b87   Artem Bityutskiy   UBI: add truly co...
718
719
720
721
   * @pnum: the physical eraseblock number to check
   *
   * This is a helper function which is used to distinguish between VID header
   * corruptions caused by power cuts and other reasons. If the PEB contains only
45aafd329   Artem Bityutskiy   UBI: tighten the ...
722
   * 0xFF bytes in the data area, the VID header is most probably corrupted
feeba4b87   Artem Bityutskiy   UBI: add truly co...
723
   * because of a power cut (%0 is returned in this case). Otherwise, it was
45aafd329   Artem Bityutskiy   UBI: tighten the ...
724
725
   * probably corrupted for some other reasons (%1 is returned in this case). A
   * negative error code is returned if a read error occurred.
feeba4b87   Artem Bityutskiy   UBI: add truly co...
726
727
728
729
730
   *
   * If the corruption reason was a power cut, UBI can safely erase this PEB.
   * Otherwise, it should preserve it to avoid possibly destroying important
   * information.
   */
45aafd329   Artem Bityutskiy   UBI: tighten the ...
731
732
  static int check_corruption(struct ubi_device *ubi, struct ubi_vid_hdr *vid_hdr,
  			    int pnum)
feeba4b87   Artem Bityutskiy   UBI: add truly co...
733
734
735
736
  {
  	int err;
  
  	mutex_lock(&ubi->buf_mutex);
0ca39d74d   Artem Bityutskiy   UBI: rename peb_b...
737
  	memset(ubi->peb_buf, 0x00, ubi->leb_size);
feeba4b87   Artem Bityutskiy   UBI: add truly co...
738

0ca39d74d   Artem Bityutskiy   UBI: rename peb_b...
739
  	err = ubi_io_read(ubi, ubi->peb_buf, pnum, ubi->leb_start,
feeba4b87   Artem Bityutskiy   UBI: add truly co...
740
  			  ubi->leb_size);
d57f40544   Brian Norris   mtd: utilize `mtd...
741
  	if (err == UBI_IO_BITFLIPS || mtd_is_eccerr(err)) {
45aafd329   Artem Bityutskiy   UBI: tighten the ...
742
743
744
745
746
747
748
  		/*
  		 * Bit-flips or integrity errors while reading the data area.
  		 * It is difficult to say for sure what type of corruption is
  		 * this, but presumably a power cut happened while this PEB was
  		 * erased, so it became unstable and corrupted, and should be
  		 * erased.
  		 */
1b1d76e2d   Dan Carpenter   UBI: release lock...
749
750
  		err = 0;
  		goto out_unlock;
45aafd329   Artem Bityutskiy   UBI: tighten the ...
751
752
753
  	}
  
  	if (err)
1b1d76e2d   Dan Carpenter   UBI: release lock...
754
  		goto out_unlock;
feeba4b87   Artem Bityutskiy   UBI: add truly co...
755

0ca39d74d   Artem Bityutskiy   UBI: rename peb_b...
756
  	if (ubi_check_pattern(ubi->peb_buf, 0xFF, ubi->leb_size))
1b1d76e2d   Dan Carpenter   UBI: release lock...
757
  		goto out_unlock;
feeba4b87   Artem Bityutskiy   UBI: add truly co...
758

049333cec   Artem Bityutskiy   UBI: comply with ...
759
760
761
  	ubi_err("PEB %d contains corrupted VID header, and the data does not contain all 0xFF",
  		pnum);
  	ubi_err("this may be a non-UBI PEB or a severe VID header corruption which requires manual inspection");
a904e3f1d   Artem Bityutskiy   UBI: always dump ...
762
  	ubi_dump_vid_hdr(vid_hdr);
719bb8401   Artem Bityutskiy   UBI: print less
763
764
  	pr_err("hexdump of PEB %d offset %d, length %d",
  	       pnum, ubi->leb_start, ubi->leb_size);
feeba4b87   Artem Bityutskiy   UBI: add truly co...
765
  	ubi_dbg_print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1,
0ca39d74d   Artem Bityutskiy   UBI: rename peb_b...
766
  			       ubi->peb_buf, ubi->leb_size, 1);
1b1d76e2d   Dan Carpenter   UBI: release lock...
767
768
769
  	err = 1;
  
  out_unlock:
feeba4b87   Artem Bityutskiy   UBI: add truly co...
770
  	mutex_unlock(&ubi->buf_mutex);
1b1d76e2d   Dan Carpenter   UBI: release lock...
771
  	return err;
feeba4b87   Artem Bityutskiy   UBI: add truly co...
772
773
774
  }
  
  /**
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
775
   * scan_peb - scan and process UBI headers of a PEB.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
776
   * @ubi: UBI device description object
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
777
   * @ai: attaching information
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
778
   * @pnum: the physical eraseblock number
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
779
780
   * @vid: The volume ID of the found volume will be stored in this pointer
   * @sqnum: The sqnum of the found volume will be stored in this pointer
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
781
   *
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
782
783
784
785
   * This function reads UBI headers of PEB @pnum, checks them, and adds
   * information about this PEB to the corresponding list or RB-tree in the
   * "attaching info" structure. Returns zero if the physical eraseblock was
   * successfully handled and a negative error code in case of failure.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
786
   */
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
787
  static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
788
  		    int pnum, int *vid, unsigned long long *sqnum)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
789
  {
c18a84186   Artem Bityutskiy   UBI: fix warnings
790
  	long long uninitialized_var(ec);
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
791
  	int err, bitflips = 0, vol_id = -1, ec_err = 0;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
792
793
794
795
796
797
798
799
  
  	dbg_bld("scan PEB %d", pnum);
  
  	/* Skip bad physical eraseblocks */
  	err = ubi_io_is_bad(ubi, pnum);
  	if (err < 0)
  		return err;
  	else if (err) {
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
800
  		ai->bad_peb_count += 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
801
802
803
804
805
806
  		return 0;
  	}
  
  	err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
  	if (err < 0)
  		return err;
b33215084   Artem Bityutskiy   UBI: change casca...
807
808
809
810
  	switch (err) {
  	case 0:
  		break;
  	case UBI_IO_BITFLIPS:
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
811
  		bitflips = 1;
b33215084   Artem Bityutskiy   UBI: change casca...
812
813
  		break;
  	case UBI_IO_FF:
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
814
  		ai->empty_peb_count += 1;
6dd3bc7e6   Joel Reardon   UBI: add volume i...
815
816
  		return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
  				   UBI_UNKNOWN, 0, &ai->erase);
b33215084   Artem Bityutskiy   UBI: change casca...
817
  	case UBI_IO_FF_BITFLIPS:
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
818
  		ai->empty_peb_count += 1;
6dd3bc7e6   Joel Reardon   UBI: add volume i...
819
820
  		return add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
  				   UBI_UNKNOWN, 1, &ai->erase);
b33215084   Artem Bityutskiy   UBI: change casca...
821
  	case UBI_IO_BAD_HDR_EBADMSG:
b33215084   Artem Bityutskiy   UBI: change casca...
822
  	case UBI_IO_BAD_HDR:
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
823
824
825
826
827
  		/*
  		 * We have to also look at the VID header, possibly it is not
  		 * corrupted. Set %bitflips flag in order to make this PEB be
  		 * moved and EC be re-created.
  		 */
e0e718c28   Artem Bityutskiy   UBI: rename a loc...
828
  		ec_err = err;
9c47fb2fb   Artem Bityutskiy   UBI: rename UBI_S...
829
  		ec = UBI_UNKNOWN;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
830
  		bitflips = 1;
b33215084   Artem Bityutskiy   UBI: change casca...
831
832
833
834
  		break;
  	default:
  		ubi_err("'ubi_io_read_ec_hdr()' returned unknown code %d", err);
  		return -EINVAL;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
835
  	}
e0e718c28   Artem Bityutskiy   UBI: rename a loc...
836
  	if (!ec_err) {
fe96efc1a   Artem Bityutskiy   UBI: nicify image...
837
  		int image_seq;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
838
839
840
841
842
843
  		/* Make sure UBI version is OK */
  		if (ech->version != UBI_VERSION) {
  			ubi_err("this UBI version is %d, image version is %d",
  				UBI_VERSION, (int)ech->version);
  			return -EINVAL;
  		}
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
844
  		ec = be64_to_cpu(ech->ec);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
845
846
847
848
849
850
851
852
853
854
  		if (ec > UBI_MAX_ERASECOUNTER) {
  			/*
  			 * Erase counter overflow. The EC headers have 64 bits
  			 * reserved, but we anyway make use of only 31 bit
  			 * values, as this seems to be enough for any existing
  			 * flash. Upgrade UBI and use 64-bit erase counters
  			 * internally.
  			 */
  			ubi_err("erase counter overflow, max is %d",
  				UBI_MAX_ERASECOUNTER);
a904e3f1d   Artem Bityutskiy   UBI: always dump ...
855
  			ubi_dump_ec_hdr(ech);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
856
857
  			return -EINVAL;
  		}
fe96efc1a   Artem Bityutskiy   UBI: nicify image...
858

32bc48202   Adrian Hunter   UBI: compatible f...
859
860
861
862
863
864
865
866
867
868
869
  		/*
  		 * Make sure that all PEBs have the same image sequence number.
  		 * This allows us to detect situations when users flash UBI
  		 * images incorrectly, so that the flash has the new UBI image
  		 * and leftovers from the old one. This feature was added
  		 * relatively recently, and the sequence number was always
  		 * zero, because old UBI implementations always set it to zero.
  		 * For this reasons, we do not panic if some PEBs have zero
  		 * sequence number, while other PEBs have non-zero sequence
  		 * number.
  		 */
3dc948da7   Holger Brunck   UBI: fix bug in i...
870
  		image_seq = be32_to_cpu(ech->image_seq);
55b80c409   Richard Genoud   UBI: simplify ima...
871
  		if (!ubi->image_seq)
fe96efc1a   Artem Bityutskiy   UBI: nicify image...
872
  			ubi->image_seq = image_seq;
55b80c409   Richard Genoud   UBI: simplify ima...
873
  		if (image_seq && ubi->image_seq != image_seq) {
049333cec   Artem Bityutskiy   UBI: comply with ...
874
875
  			ubi_err("bad image sequence number %d in PEB %d, expected %d",
  				image_seq, pnum, ubi->image_seq);
a904e3f1d   Artem Bityutskiy   UBI: always dump ...
876
  			ubi_dump_ec_hdr(ech);
fe96efc1a   Artem Bityutskiy   UBI: nicify image...
877
878
  			return -EINVAL;
  		}
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
879
880
881
882
883
884
885
  	}
  
  	/* OK, we've done with the EC header, let's look at the VID header */
  
  	err = ubi_io_read_vid_hdr(ubi, pnum, vidh, 0);
  	if (err < 0)
  		return err;
b33215084   Artem Bityutskiy   UBI: change casca...
886
887
888
889
  	switch (err) {
  	case 0:
  		break;
  	case UBI_IO_BITFLIPS:
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
890
  		bitflips = 1;
b33215084   Artem Bityutskiy   UBI: change casca...
891
892
  		break;
  	case UBI_IO_BAD_HDR_EBADMSG:
0525dac9f   Artem Bityutskiy   UBI: do not put e...
893
894
895
896
897
898
899
  		if (ec_err == UBI_IO_BAD_HDR_EBADMSG)
  			/*
  			 * Both EC and VID headers are corrupted and were read
  			 * with data integrity error, probably this is a bad
  			 * PEB, bit it is not marked as bad yet. This may also
  			 * be a result of power cut during erasure.
  			 */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
900
  			ai->maybe_bad_peb_count += 1;
b33215084   Artem Bityutskiy   UBI: change casca...
901
  	case UBI_IO_BAD_HDR:
feeba4b87   Artem Bityutskiy   UBI: add truly co...
902
903
904
905
906
907
  		if (ec_err)
  			/*
  			 * Both headers are corrupted. There is a possibility
  			 * that this a valid UBI PEB which has corresponding
  			 * LEB, but the headers are corrupted. However, it is
  			 * impossible to distinguish it from a PEB which just
45aafd329   Artem Bityutskiy   UBI: tighten the ...
908
  			 * contains garbage because of a power cut during erase
feeba4b87   Artem Bityutskiy   UBI: add truly co...
909
  			 * operation. So we just schedule this PEB for erasure.
7ac760c2f   Artem Bityutskiy   UBI: fix corrupte...
910
  			 *
25985edce   Lucas De Marchi   Fix common misspe...
911
  			 * Besides, in case of NOR flash, we deliberately
7ac760c2f   Artem Bityutskiy   UBI: fix corrupte...
912
913
  			 * corrupt both headers because NOR flash erasure is
  			 * slow and can start from the end.
feeba4b87   Artem Bityutskiy   UBI: add truly co...
914
915
916
917
918
919
920
  			 */
  			err = 0;
  		else
  			/*
  			 * The EC was OK, but the VID header is corrupted. We
  			 * have to check what is in the data area.
  			 */
45aafd329   Artem Bityutskiy   UBI: tighten the ...
921
  			err = check_corruption(ubi, vidh, pnum);
df3fca4cd   Artem Bityutskiy   UBI: fix check_da...
922
923
924
925
  
  		if (err < 0)
  			return err;
  		else if (!err)
feeba4b87   Artem Bityutskiy   UBI: add truly co...
926
  			/* This corruption is caused by a power cut */
6dd3bc7e6   Joel Reardon   UBI: add volume i...
927
928
  			err = add_to_list(ai, pnum, UBI_UNKNOWN,
  					  UBI_UNKNOWN, ec, 1, &ai->erase);
feeba4b87   Artem Bityutskiy   UBI: add truly co...
929
930
  		else
  			/* This is an unexpected corruption */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
931
  			err = add_corrupted(ai, pnum, ec);
feeba4b87   Artem Bityutskiy   UBI: add truly co...
932
933
934
  		if (err)
  			return err;
  		goto adjust_mean_ec;
b33215084   Artem Bityutskiy   UBI: change casca...
935
  	case UBI_IO_FF_BITFLIPS:
6dd3bc7e6   Joel Reardon   UBI: add volume i...
936
937
  		err = add_to_list(ai, pnum, UBI_UNKNOWN, UBI_UNKNOWN,
  				  ec, 1, &ai->erase);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
938
939
940
  		if (err)
  			return err;
  		goto adjust_mean_ec;
b33215084   Artem Bityutskiy   UBI: change casca...
941
  	case UBI_IO_FF:
193819cf2   Matthieu CASTET   UBI: erase free P...
942
  		if (ec_err || bitflips)
6dd3bc7e6   Joel Reardon   UBI: add volume i...
943
944
  			err = add_to_list(ai, pnum, UBI_UNKNOWN,
  					  UBI_UNKNOWN, ec, 1, &ai->erase);
b33215084   Artem Bityutskiy   UBI: change casca...
945
  		else
6dd3bc7e6   Joel Reardon   UBI: add volume i...
946
947
  			err = add_to_list(ai, pnum, UBI_UNKNOWN,
  					  UBI_UNKNOWN, ec, 0, &ai->free);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
948
949
950
  		if (err)
  			return err;
  		goto adjust_mean_ec;
b33215084   Artem Bityutskiy   UBI: change casca...
951
952
953
954
  	default:
  		ubi_err("'ubi_io_read_vid_hdr()' returned unknown code %d",
  			err);
  		return -EINVAL;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
955
  	}
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
956
  	vol_id = be32_to_cpu(vidh->vol_id);
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
957
958
959
960
  	if (vid)
  		*vid = vol_id;
  	if (sqnum)
  		*sqnum = be64_to_cpu(vidh->sqnum);
91f2d53cd   Artem Bityutskiy   UBI: add layout v...
961
  	if (vol_id > UBI_MAX_VOLUMES && vol_id != UBI_LAYOUT_VOLUME_ID) {
3261ebd7d   Christoph Hellwig   UBI: kill homegro...
962
  		int lnum = be32_to_cpu(vidh->lnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
963
964
965
966
  
  		/* Unsupported internal volume */
  		switch (vidh->compat) {
  		case UBI_COMPAT_DELETE:
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
967
968
969
970
971
  			if (vol_id != UBI_FM_SB_VOLUME_ID
  			    && vol_id != UBI_FM_DATA_VOLUME_ID) {
  				ubi_msg("\"delete\" compatible internal volume %d:%d found, will remove it",
  					vol_id, lnum);
  			}
6dd3bc7e6   Joel Reardon   UBI: add volume i...
972
973
  			err = add_to_list(ai, pnum, vol_id, lnum,
  					  ec, 1, &ai->erase);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
974
975
  			if (err)
  				return err;
158132c9a   Brijesh Singh   UBI: improve dele...
976
  			return 0;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
977
978
  
  		case UBI_COMPAT_RO:
049333cec   Artem Bityutskiy   UBI: comply with ...
979
  			ubi_msg("read-only compatible internal volume %d:%d found, switch to read-only mode",
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
980
981
982
983
984
  				vol_id, lnum);
  			ubi->ro_mode = 1;
  			break;
  
  		case UBI_COMPAT_PRESERVE:
049333cec   Artem Bityutskiy   UBI: comply with ...
985
986
  			ubi_msg("\"preserve\" compatible internal volume %d:%d found",
  				vol_id, lnum);
6dd3bc7e6   Joel Reardon   UBI: add volume i...
987
988
  			err = add_to_list(ai, pnum, vol_id, lnum,
  					  ec, 0, &ai->alien);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
989
990
  			if (err)
  				return err;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
991
992
993
994
995
996
997
998
  			return 0;
  
  		case UBI_COMPAT_REJECT:
  			ubi_err("incompatible internal volume %d:%d found",
  				vol_id, lnum);
  			return -EINVAL;
  		}
  	}
e0e718c28   Artem Bityutskiy   UBI: rename a loc...
999
  	if (ec_err)
29a88c99d   Artem Bityutskiy   UBI: print a mess...
1000
1001
  		ubi_warn("valid VID header but corrupted EC header at PEB %d",
  			 pnum);
3561188ac   Artem Bityutskiy   UBI: rename ubi_s...
1002
  	err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1003
1004
1005
1006
  	if (err)
  		return err;
  
  adjust_mean_ec:
e0e718c28   Artem Bityutskiy   UBI: rename a loc...
1007
  	if (!ec_err) {
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1008
1009
1010
1011
1012
1013
  		ai->ec_sum += ec;
  		ai->ec_count += 1;
  		if (ec > ai->max_ec)
  			ai->max_ec = ec;
  		if (ec < ai->min_ec)
  			ai->min_ec = ec;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1014
1015
1016
1017
1018
1019
  	}
  
  	return 0;
  }
  
  /**
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
1020
   * late_analysis - analyze the overall situation with PEB.
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1021
   * @ubi: UBI device description object
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1022
   * @ai: attaching information
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1023
   *
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
1024
1025
1026
1027
1028
   * This is a helper function which takes a look what PEBs we have after we
   * gather information about all of them ("ai" is compete). It decides whether
   * the flash is empty and should be formatted of whether there are too many
   * corrupted PEBs and we should not attach this MTD device. Returns zero if we
   * should proceed with attaching the MTD device, and %-EINVAL if we should not.
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1029
   */
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
1030
  static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai)
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1031
  {
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1032
  	struct ubi_ainf_peb *aeb;
0525dac9f   Artem Bityutskiy   UBI: do not put e...
1033
  	int max_corr, peb_count;
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1034

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1035
  	peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count;
0525dac9f   Artem Bityutskiy   UBI: do not put e...
1036
  	max_corr = peb_count / 20 ?: 8;
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1037
1038
  
  	/*
0525dac9f   Artem Bityutskiy   UBI: do not put e...
1039
  	 * Few corrupted PEBs is not a problem and may be just a result of
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1040
1041
1042
  	 * unclean reboots. However, many of them may indicate some problems
  	 * with the flash HW or driver.
  	 */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1043
  	if (ai->corr_peb_count) {
0525dac9f   Artem Bityutskiy   UBI: do not put e...
1044
  		ubi_err("%d PEBs are corrupted and preserved",
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1045
  			ai->corr_peb_count);
e28453bbb   Artem Bityutskiy   UBI: use pr_ help...
1046
  		pr_err("Corrupted PEBs are:");
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1047
  		list_for_each_entry(aeb, &ai->corr, u.list)
e28453bbb   Artem Bityutskiy   UBI: use pr_ help...
1048
1049
1050
  			pr_cont(" %d", aeb->pnum);
  		pr_cont("
  ");
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1051
1052
1053
1054
1055
  
  		/*
  		 * If too many PEBs are corrupted, we refuse attaching,
  		 * otherwise, only print a warning.
  		 */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1056
  		if (ai->corr_peb_count >= max_corr) {
feddbb34e   Artem Bityutskiy   UBI: fix minor st...
1057
  			ubi_err("too many corrupted PEBs, refusing");
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1058
1059
1060
  			return -EINVAL;
  		}
  	}
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1061
  	if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) {
0525dac9f   Artem Bityutskiy   UBI: do not put e...
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
  		/*
  		 * All PEBs are empty, or almost all - a couple PEBs look like
  		 * they may be bad PEBs which were not marked as bad yet.
  		 *
  		 * This piece of code basically tries to distinguish between
  		 * the following situations:
  		 *
  		 * 1. Flash is empty, but there are few bad PEBs, which are not
  		 *    marked as bad so far, and which were read with error. We
  		 *    want to go ahead and format this flash. While formatting,
  		 *    the faulty PEBs will probably be marked as bad.
  		 *
  		 * 2. Flash contains non-UBI data and we do not want to format
  		 *    it and destroy possibly important information.
  		 */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1077
1078
  		if (ai->maybe_bad_peb_count <= 2) {
  			ai->is_empty = 1;
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1079
  			ubi_msg("empty MTD device detected");
0525dac9f   Artem Bityutskiy   UBI: do not put e...
1080
1081
  			get_random_bytes(&ubi->image_seq,
  					 sizeof(ubi->image_seq));
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1082
  		} else {
049333cec   Artem Bityutskiy   UBI: comply with ...
1083
  			ubi_err("MTD device is not UBI-formatted and possibly contains non-UBI data - refusing it");
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1084
1085
  			return -EINVAL;
  		}
0525dac9f   Artem Bityutskiy   UBI: do not put e...
1086

0798cea8c   Artem Bityutskiy   UBI: improve corr...
1087
  	}
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1088
1089
1090
1091
  	return 0;
  }
  
  /**
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
   * destroy_av - free volume attaching information.
   * @av: volume attaching information
   * @ai: attaching information
   *
   * This function destroys the volume attaching information.
   */
  static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av)
  {
  	struct ubi_ainf_peb *aeb;
  	struct rb_node *this = av->root.rb_node;
  
  	while (this) {
  		if (this->rb_left)
  			this = this->rb_left;
  		else if (this->rb_right)
  			this = this->rb_right;
  		else {
  			aeb = rb_entry(this, struct ubi_ainf_peb, u.rb);
  			this = rb_parent(this);
  			if (this) {
  				if (this->rb_left == &aeb->u.rb)
  					this->rb_left = NULL;
  				else
  					this->rb_right = NULL;
  			}
  
  			kmem_cache_free(ai->aeb_slab_cache, aeb);
  		}
  	}
  	kfree(av);
  }
  
  /**
   * destroy_ai - destroy attaching information.
   * @ai: attaching information
   */
  static void destroy_ai(struct ubi_attach_info *ai)
  {
  	struct ubi_ainf_peb *aeb, *aeb_tmp;
  	struct ubi_ainf_volume *av;
  	struct rb_node *rb;
  
  	list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) {
  		list_del(&aeb->u.list);
  		kmem_cache_free(ai->aeb_slab_cache, aeb);
  	}
  	list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, u.list) {
  		list_del(&aeb->u.list);
  		kmem_cache_free(ai->aeb_slab_cache, aeb);
  	}
  	list_for_each_entry_safe(aeb, aeb_tmp, &ai->corr, u.list) {
  		list_del(&aeb->u.list);
  		kmem_cache_free(ai->aeb_slab_cache, aeb);
  	}
  	list_for_each_entry_safe(aeb, aeb_tmp, &ai->free, u.list) {
  		list_del(&aeb->u.list);
  		kmem_cache_free(ai->aeb_slab_cache, aeb);
  	}
  
  	/* Destroy the volume RB-tree */
  	rb = ai->volumes.rb_node;
  	while (rb) {
  		if (rb->rb_left)
  			rb = rb->rb_left;
  		else if (rb->rb_right)
  			rb = rb->rb_right;
  		else {
  			av = rb_entry(rb, struct ubi_ainf_volume, rb);
  
  			rb = rb_parent(rb);
  			if (rb) {
  				if (rb->rb_left == &av->rb)
  					rb->rb_left = NULL;
  				else
  					rb->rb_right = NULL;
  			}
  
  			destroy_av(ai, av);
  		}
  	}
  
  	if (ai->aeb_slab_cache)
  		kmem_cache_destroy(ai->aeb_slab_cache);
  
  	kfree(ai);
  }
  
  /**
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1180
   * scan_all - scan entire MTD device.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1181
   * @ubi: UBI device description object
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1182
1183
   * @ai: attach info object
   * @start: start scanning at this PEB
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1184
1185
   *
   * This function does full scanning of an MTD device and returns complete
fbd0107f4   Artem Bityutskiy   UBI: amend commen...
1186
1187
   * information about it in form of a "struct ubi_attach_info" object. In case
   * of failure, an error code is returned.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1188
   */
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1189
1190
  static int scan_all(struct ubi_device *ubi, struct ubi_attach_info *ai,
  		    int start)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1191
1192
1193
  {
  	int err, pnum;
  	struct rb_node *rb1, *rb2;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1194
  	struct ubi_ainf_volume *av;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1195
  	struct ubi_ainf_peb *aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1196
1197
  
  	err = -ENOMEM;
6c1e875ca   Artem Bityutskiy   UBI: add slab cac...
1198

801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1199
1200
  	ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
  	if (!ech)
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1201
  		return err;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1202

33818bbb8   Artem Bityutskiy   UBI: allocate mem...
1203
  	vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1204
1205
  	if (!vidh)
  		goto out_ech;
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1206
  	for (pnum = start; pnum < ubi->peb_count; pnum++) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1207
  		cond_resched();
c8566350a   Artem Bityutskiy   UBI: fix and re-w...
1208
  		dbg_gen("process PEB %d", pnum);
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1209
  		err = scan_peb(ubi, ai, pnum, NULL, NULL);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1210
1211
1212
  		if (err < 0)
  			goto out_vidh;
  	}
719bb8401   Artem Bityutskiy   UBI: print less
1213
  	ubi_msg("scanning is finished");
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1214

4bc1dca4b   Artem Bityutskiy   UBI: fix mean EC ...
1215
  	/* Calculate mean erase counter */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1216
1217
  	if (ai->ec_count)
  		ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1218

fbd0107f4   Artem Bityutskiy   UBI: amend commen...
1219
  	err = late_analysis(ubi, ai);
0798cea8c   Artem Bityutskiy   UBI: improve corr...
1220
1221
  	if (err)
  		goto out_vidh;
4a406856e   Artem Bityutskiy   UBI: print a warn...
1222
1223
  
  	/*
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1224
1225
1226
  	 * In case of unknown erase counter we use the mean erase counter
  	 * value.
  	 */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1227
1228
  	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
  		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb)
9c47fb2fb   Artem Bityutskiy   UBI: rename UBI_S...
1229
  			if (aeb->ec == UBI_UNKNOWN)
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1230
  				aeb->ec = ai->mean_ec;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1231
  	}
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1232
  	list_for_each_entry(aeb, &ai->free, u.list) {
9c47fb2fb   Artem Bityutskiy   UBI: rename UBI_S...
1233
  		if (aeb->ec == UBI_UNKNOWN)
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1234
  			aeb->ec = ai->mean_ec;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1235
  	}
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1236
  	list_for_each_entry(aeb, &ai->corr, u.list)
9c47fb2fb   Artem Bityutskiy   UBI: rename UBI_S...
1237
  		if (aeb->ec == UBI_UNKNOWN)
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1238
  			aeb->ec = ai->mean_ec;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1239

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1240
  	list_for_each_entry(aeb, &ai->erase, u.list)
9c47fb2fb   Artem Bityutskiy   UBI: rename UBI_S...
1241
  		if (aeb->ec == UBI_UNKNOWN)
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1242
  			aeb->ec = ai->mean_ec;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1243

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1244
  	err = self_check_ai(ubi, ai);
adbf05e3e   Artem Bityutskiy   UBI: simplify deb...
1245
  	if (err)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1246
  		goto out_vidh;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1247
1248
1249
  
  	ubi_free_vid_hdr(ubi, vidh);
  	kfree(ech);
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1250
  	return 0;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1251
1252
1253
1254
1255
  
  out_vidh:
  	ubi_free_vid_hdr(ubi, vidh);
  out_ech:
  	kfree(ech);
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
  	return err;
  }
  
  #ifdef CONFIG_MTD_UBI_FASTMAP
  
  /**
   * scan_fastmap - try to find a fastmap and attach from it.
   * @ubi: UBI device description object
   * @ai: attach info object
   *
   * Returns 0 on success, negative return values indicate an internal
   * error.
   * UBI_NO_FASTMAP denotes that no fastmap was found.
   * UBI_BAD_FASTMAP denotes that the found fastmap was invalid.
   */
  static int scan_fast(struct ubi_device *ubi, struct ubi_attach_info *ai)
  {
  	int err, pnum, fm_anchor = -1;
  	unsigned long long max_sqnum = 0;
  
  	err = -ENOMEM;
  
  	ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
  	if (!ech)
  		goto out;
  
  	vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
  	if (!vidh)
  		goto out_ech;
  
  	for (pnum = 0; pnum < UBI_FM_MAX_START; pnum++) {
  		int vol_id = -1;
  		unsigned long long sqnum = -1;
  		cond_resched();
  
  		dbg_gen("process PEB %d", pnum);
  		err = scan_peb(ubi, ai, pnum, &vol_id, &sqnum);
  		if (err < 0)
  			goto out_vidh;
  
  		if (vol_id == UBI_FM_SB_VOLUME_ID && sqnum > max_sqnum) {
  			max_sqnum = sqnum;
  			fm_anchor = pnum;
  		}
  	}
  
  	ubi_free_vid_hdr(ubi, vidh);
  	kfree(ech);
  
  	if (fm_anchor < 0)
  		return UBI_NO_FASTMAP;
  
  	return ubi_scan_fastmap(ubi, ai, fm_anchor);
  
  out_vidh:
  	ubi_free_vid_hdr(ubi, vidh);
  out_ech:
  	kfree(ech);
  out:
  	return err;
  }
  
  #endif
  
  static struct ubi_attach_info *alloc_ai(const char *slab_name)
  {
  	struct ubi_attach_info *ai;
  
  	ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL);
  	if (!ai)
  		return ai;
  
  	INIT_LIST_HEAD(&ai->corr);
  	INIT_LIST_HEAD(&ai->free);
  	INIT_LIST_HEAD(&ai->erase);
  	INIT_LIST_HEAD(&ai->alien);
  	ai->volumes = RB_ROOT;
  	ai->aeb_slab_cache = kmem_cache_create(slab_name,
  					       sizeof(struct ubi_ainf_peb),
  					       0, 0, NULL);
  	if (!ai->aeb_slab_cache) {
  		kfree(ai);
  		ai = NULL;
  	}
  
  	return ai;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1342
1343
1344
  }
  
  /**
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1345
1346
   * ubi_attach - attach an MTD device.
   * @ubi: UBI device descriptor
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1347
   * @force_scan: if set to non-zero attach by scanning
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1348
1349
1350
1351
   *
   * This function returns zero in case of success and a negative error code in
   * case of failure.
   */
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1352
  int ubi_attach(struct ubi_device *ubi, int force_scan)
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1353
1354
1355
  {
  	int err;
  	struct ubi_attach_info *ai;
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
  	ai = alloc_ai("ubi_aeb_slab_cache");
  	if (!ai)
  		return -ENOMEM;
  
  #ifdef CONFIG_MTD_UBI_FASTMAP
  	/* On small flash devices we disable fastmap in any case. */
  	if ((int)mtd_div_by_eb(ubi->mtd->size, ubi->mtd) <= UBI_FM_MAX_START) {
  		ubi->fm_disabled = 1;
  		force_scan = 1;
  	}
  
  	if (force_scan)
  		err = scan_all(ubi, ai, 0);
  	else {
  		err = scan_fast(ubi, ai);
  		if (err > 0) {
  			if (err != UBI_NO_FASTMAP) {
  				destroy_ai(ai);
  				ai = alloc_ai("ubi_aeb_slab_cache2");
  				if (!ai)
  					return -ENOMEM;
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1377

4b3e0a25a   Richard Weinberger   UBI: Call scan_al...
1378
1379
1380
1381
  				err = scan_all(ubi, ai, 0);
  			} else {
  				err = scan_all(ubi, ai, UBI_FM_MAX_START);
  			}
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1382
1383
1384
1385
1386
1387
1388
  		}
  	}
  #else
  	err = scan_all(ubi, ai, 0);
  #endif
  	if (err)
  		goto out_ai;
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1389
1390
1391
1392
1393
1394
  
  	ubi->bad_peb_count = ai->bad_peb_count;
  	ubi->good_peb_count = ubi->peb_count - ubi->bad_peb_count;
  	ubi->corr_peb_count = ai->corr_peb_count;
  	ubi->max_ec = ai->max_ec;
  	ubi->mean_ec = ai->mean_ec;
719bb8401   Artem Bityutskiy   UBI: print less
1395
  	dbg_gen("max. sequence number:       %llu", ai->max_sqnum);
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
  
  	err = ubi_read_volume_table(ubi, ai);
  	if (err)
  		goto out_ai;
  
  	err = ubi_wl_init(ubi, ai);
  	if (err)
  		goto out_vtbl;
  
  	err = ubi_eba_init(ubi, ai);
  	if (err)
  		goto out_wl;
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1408
  #ifdef CONFIG_MTD_UBI_FASTMAP
64575574f   Ezequiel Garcia   UBI: introduce he...
1409
  	if (ubi->fm && ubi_dbg_chk_gen(ubi)) {
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1410
1411
1412
  		struct ubi_attach_info *scan_ai;
  
  		scan_ai = alloc_ai("ubi_ckh_aeb_slab_cache");
4d525145a   Julia Lawall   UBI: fix error re...
1413
1414
  		if (!scan_ai) {
  			err = -ENOMEM;
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1415
  			goto out_wl;
4d525145a   Julia Lawall   UBI: fix error re...
1416
  		}
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
  
  		err = scan_all(ubi, scan_ai, 0);
  		if (err) {
  			destroy_ai(scan_ai);
  			goto out_wl;
  		}
  
  		err = self_check_eba(ubi, ai, scan_ai);
  		destroy_ai(scan_ai);
  
  		if (err)
  			goto out_wl;
  	}
  #endif
  
  	destroy_ai(ai);
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1433
1434
1435
1436
1437
1438
1439
1440
  	return 0;
  
  out_wl:
  	ubi_wl_close(ubi);
  out_vtbl:
  	ubi_free_internal_volumes(ubi);
  	vfree(ubi->vtbl);
  out_ai:
dac6e2087   Richard Weinberger   UBI: Add fastmap ...
1441
  	destroy_ai(ai);
47e1ec70b   Artem Bityutskiy   UBI: move and ren...
1442
1443
1444
1445
  	return err;
  }
  
  /**
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1446
   * self_check_ai - check the attaching information.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1447
   * @ubi: UBI device description object
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1448
   * @ai: attaching information
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1449
   *
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1450
   * This function returns zero if the attaching information is all right, and a
adbf05e3e   Artem Bityutskiy   UBI: simplify deb...
1451
   * negative error code if not or if an error occurred.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1452
   */
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1453
  static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1454
1455
1456
  {
  	int pnum, err, vols_found = 0;
  	struct rb_node *rb1, *rb2;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1457
  	struct ubi_ainf_volume *av;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1458
  	struct ubi_ainf_peb *aeb, *last_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1459
  	uint8_t *buf;
64575574f   Ezequiel Garcia   UBI: introduce he...
1460
  	if (!ubi_dbg_chk_gen(ubi))
92d124f53   Artem Bityutskiy   UBI: make self-ch...
1461
  		return 0;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1462
  	/*
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1463
  	 * At first, check that attaching information is OK.
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1464
  	 */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1465
  	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1466
1467
1468
1469
1470
  		int leb_count = 0;
  
  		cond_resched();
  
  		vols_found += 1;
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1471
  		if (ai->is_empty) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1472
  			ubi_err("bad is_empty flag");
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1473
  			goto bad_av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1474
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1475
1476
1477
  		if (av->vol_id < 0 || av->highest_lnum < 0 ||
  		    av->leb_count < 0 || av->vol_type < 0 || av->used_ebs < 0 ||
  		    av->data_pad < 0 || av->last_data_size < 0) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1478
  			ubi_err("negative values");
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1479
  			goto bad_av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1480
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1481
1482
  		if (av->vol_id >= UBI_MAX_VOLUMES &&
  		    av->vol_id < UBI_INTERNAL_VOL_START) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1483
  			ubi_err("bad vol_id");
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1484
  			goto bad_av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1485
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1486
  		if (av->vol_id > ai->highest_vol_id) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1487
  			ubi_err("highest_vol_id is %d, but vol_id %d is there",
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1488
  				ai->highest_vol_id, av->vol_id);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1489
1490
  			goto out;
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1491
1492
  		if (av->vol_type != UBI_DYNAMIC_VOLUME &&
  		    av->vol_type != UBI_STATIC_VOLUME) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1493
  			ubi_err("bad vol_type");
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1494
  			goto bad_av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1495
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1496
  		if (av->data_pad > ubi->leb_size / 2) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1497
  			ubi_err("bad data_pad");
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1498
  			goto bad_av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1499
  		}
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1500
  		last_aeb = NULL;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1501
  		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1502
  			cond_resched();
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1503
  			last_aeb = aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1504
  			leb_count += 1;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1505
  			if (aeb->pnum < 0 || aeb->ec < 0) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1506
  				ubi_err("negative values");
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1507
  				goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1508
  			}
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1509
1510
1511
  			if (aeb->ec < ai->min_ec) {
  				ubi_err("bad ai->min_ec (%d), %d found",
  					ai->min_ec, aeb->ec);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1512
  				goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1513
  			}
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1514
1515
1516
  			if (aeb->ec > ai->max_ec) {
  				ubi_err("bad ai->max_ec (%d), %d found",
  					ai->max_ec, aeb->ec);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1517
  				goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1518
  			}
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1519
  			if (aeb->pnum >= ubi->peb_count) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1520
  				ubi_err("too high PEB number %d, total PEBs %d",
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1521
1522
  					aeb->pnum, ubi->peb_count);
  				goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1523
  			}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1524
1525
  			if (av->vol_type == UBI_STATIC_VOLUME) {
  				if (aeb->lnum >= av->used_ebs) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1526
  					ubi_err("bad lnum or used_ebs");
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1527
  					goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1528
1529
  				}
  			} else {
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1530
  				if (av->used_ebs != 0) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1531
  					ubi_err("non-zero used_ebs");
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1532
  					goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1533
1534
  				}
  			}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1535
  			if (aeb->lnum > av->highest_lnum) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1536
  				ubi_err("incorrect highest_lnum or lnum");
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1537
  				goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1538
1539
  			}
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1540
  		if (av->leb_count != leb_count) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1541
1542
  			ubi_err("bad leb_count, %d objects in the tree",
  				leb_count);
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1543
  			goto bad_av;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1544
  		}
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1545
  		if (!last_aeb)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1546
  			continue;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1547
  		aeb = last_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1548

517af48c0   Artem Bityutskiy   UBI: rename sv to av
1549
  		if (aeb->lnum != av->highest_lnum) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1550
  			ubi_err("bad highest_lnum");
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1551
  			goto bad_aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1552
1553
  		}
  	}
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1554
1555
1556
  	if (vols_found != ai->vols_found) {
  		ubi_err("bad ai->vols_found %d, should be %d",
  			ai->vols_found, vols_found);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1557
1558
  		goto out;
  	}
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1559
  	/* Check that attaching information is correct */
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1560
  	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1561
  		last_aeb = NULL;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1562
  		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1563
1564
1565
  			int vol_type;
  
  			cond_resched();
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1566
  			last_aeb = aeb;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1567

2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1568
  			err = ubi_io_read_vid_hdr(ubi, aeb->pnum, vidh, 1);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1569
1570
1571
1572
1573
1574
1575
1576
1577
  			if (err && err != UBI_IO_BITFLIPS) {
  				ubi_err("VID header is not OK (%d)", err);
  				if (err > 0)
  					err = -EIO;
  				return err;
  			}
  
  			vol_type = vidh->vol_type == UBI_VID_DYNAMIC ?
  				   UBI_DYNAMIC_VOLUME : UBI_STATIC_VOLUME;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1578
  			if (av->vol_type != vol_type) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1579
1580
1581
  				ubi_err("bad vol_type");
  				goto bad_vid_hdr;
  			}
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1582
1583
  			if (aeb->sqnum != be64_to_cpu(vidh->sqnum)) {
  				ubi_err("bad sqnum %llu", aeb->sqnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1584
1585
  				goto bad_vid_hdr;
  			}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1586
1587
  			if (av->vol_id != be32_to_cpu(vidh->vol_id)) {
  				ubi_err("bad vol_id %d", av->vol_id);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1588
1589
  				goto bad_vid_hdr;
  			}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1590
  			if (av->compat != vidh->compat) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1591
1592
1593
  				ubi_err("bad compat %d", vidh->compat);
  				goto bad_vid_hdr;
  			}
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1594
1595
  			if (aeb->lnum != be32_to_cpu(vidh->lnum)) {
  				ubi_err("bad lnum %d", aeb->lnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1596
1597
  				goto bad_vid_hdr;
  			}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1598
1599
  			if (av->used_ebs != be32_to_cpu(vidh->used_ebs)) {
  				ubi_err("bad used_ebs %d", av->used_ebs);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1600
1601
  				goto bad_vid_hdr;
  			}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1602
1603
  			if (av->data_pad != be32_to_cpu(vidh->data_pad)) {
  				ubi_err("bad data_pad %d", av->data_pad);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1604
1605
  				goto bad_vid_hdr;
  			}
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1606
  		}
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1607
  		if (!last_aeb)
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1608
  			continue;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1609
1610
  		if (av->highest_lnum != be32_to_cpu(vidh->lnum)) {
  			ubi_err("bad highest_lnum %d", av->highest_lnum);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1611
1612
  			goto bad_vid_hdr;
  		}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1613
1614
  		if (av->last_data_size != be32_to_cpu(vidh->data_size)) {
  			ubi_err("bad last_data_size %d", av->last_data_size);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1615
1616
1617
1618
1619
1620
1621
1622
  			goto bad_vid_hdr;
  		}
  	}
  
  	/*
  	 * Make sure that all the physical eraseblocks are in one of the lists
  	 * or trees.
  	 */
d9b0744d6   Mariusz Kozlowski   [UBI] drivers/mtd...
1623
  	buf = kzalloc(ubi->peb_count, GFP_KERNEL);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1624
1625
  	if (!buf)
  		return -ENOMEM;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1626
1627
  	for (pnum = 0; pnum < ubi->peb_count; pnum++) {
  		err = ubi_io_is_bad(ubi, pnum);
341e1a0cf   Artem Bityutskiy   UBI: fix memory l...
1628
1629
  		if (err < 0) {
  			kfree(buf);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1630
  			return err;
9c9ec1477   Artem Bityutskiy   UBI: fix checkpat...
1631
  		} else if (err)
d9b0744d6   Mariusz Kozlowski   [UBI] drivers/mtd...
1632
  			buf[pnum] = 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1633
  	}
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1634
1635
  	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb)
  		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb)
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1636
  			buf[aeb->pnum] = 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1637

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1638
  	list_for_each_entry(aeb, &ai->free, u.list)
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1639
  		buf[aeb->pnum] = 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1640

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1641
  	list_for_each_entry(aeb, &ai->corr, u.list)
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1642
  		buf[aeb->pnum] = 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1643

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1644
  	list_for_each_entry(aeb, &ai->erase, u.list)
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1645
  		buf[aeb->pnum] = 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1646

a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1647
  	list_for_each_entry(aeb, &ai->alien, u.list)
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1648
  		buf[aeb->pnum] = 1;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1649
1650
1651
  
  	err = 0;
  	for (pnum = 0; pnum < ubi->peb_count; pnum++)
d9b0744d6   Mariusz Kozlowski   [UBI] drivers/mtd...
1652
  		if (!buf[pnum]) {
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1653
1654
1655
1656
1657
1658
1659
1660
  			ubi_err("PEB %d is not referred", pnum);
  			err = 1;
  		}
  
  	kfree(buf);
  	if (err)
  		goto out;
  	return 0;
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1661
  bad_aeb:
a4e6042f1   Artem Bityutskiy   UBI: rename si to ai
1662
  	ubi_err("bad attaching information about LEB %d", aeb->lnum);
2c5ec5ce6   Artem Bityutskiy   UBI: rename seb t...
1663
  	ubi_dump_aeb(aeb, 0);
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1664
  	ubi_dump_av(av);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1665
  	goto out;
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1666
1667
1668
  bad_av:
  	ubi_err("bad attaching information about volume %d", av->vol_id);
  	ubi_dump_av(av);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1669
1670
1671
  	goto out;
  
  bad_vid_hdr:
517af48c0   Artem Bityutskiy   UBI: rename sv to av
1672
1673
  	ubi_err("bad attaching information about volume %d", av->vol_id);
  	ubi_dump_av(av);
a904e3f1d   Artem Bityutskiy   UBI: always dump ...
1674
  	ubi_dump_vid_hdr(vidh);
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1675
1676
  
  out:
25886a368   Artem Bityutskiy   UBI: always dump ...
1677
  	dump_stack();
adbf05e3e   Artem Bityutskiy   UBI: simplify deb...
1678
  	return -EINVAL;
801c135ce   Artem B. Bityutskiy   UBI: Unsorted Blo...
1679
  }