attach.c 43.6 KB
Newer Older
A
Artem B. Bityutskiy 已提交
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 (Битюцкий Артём)
 */

/*
22
 * UBI attaching sub-system.
A
Artem B. Bityutskiy 已提交
23
 *
24 25
 * This sub-system is responsible for attaching MTD devices and it also
 * implements flash media scanning.
A
Artem B. Bityutskiy 已提交
26
 *
A
Artem Bityutskiy 已提交
27
 * The attaching information is represented by a &struct ubi_attach_info'
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.
A
Artem B. Bityutskiy 已提交
31
 *
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.
A
Artem B. Bityutskiy 已提交
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.
41
 *
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.
 *
50
 * UBI tries to distinguish between 2 types of corruptions.
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
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).
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.
62 63
 *
 * 2. Unexpected corruptions which are not caused by power cuts. During
64
 * attaching, such PEBs are put to the @corr list and UBI preserves them.
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.
68 69
 *
 * However, it is difficult to reliably distinguish between these types of
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
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
79
 *     NAND), it is probably a PEB which was being erased when power cut
80 81 82
 *     happened, so this is corruption type 1. However, this is just a guess,
 *     which might be wrong.
 *   o Otherwise this it corruption type 2.
A
Artem B. Bityutskiy 已提交
83 84 85
 */

#include <linux/err.h>
86
#include <linux/slab.h>
A
Artem B. Bityutskiy 已提交
87
#include <linux/crc32.h>
A
Artem Bityutskiy 已提交
88
#include <linux/math64.h>
89
#include <linux/random.h>
A
Artem B. Bityutskiy 已提交
90 91
#include "ubi.h"

A
Artem Bityutskiy 已提交
92
static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai);
A
Artem B. Bityutskiy 已提交
93 94 95 96 97

/* Temporary variables used during scanning */
static struct ubi_ec_hdr *ech;
static struct ubi_vid_hdr *vidh;

98
/**
99
 * add_to_list - add physical eraseblock to a list.
A
Artem Bityutskiy 已提交
100
 * @ai: attaching information
101 102
 * @pnum: physical eraseblock number to add
 * @ec: erase counter of the physical eraseblock
103
 * @to_head: if not zero, add to the head of the list
104 105
 * @list: the list to add to
 *
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.
108 109 110 111 112
 * 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
113
 * failure.
114
 */
A
Artem Bityutskiy 已提交
115
static int add_to_list(struct ubi_attach_info *ai, int pnum, int ec,
116
		       int to_head, struct list_head *list)
A
Artem B. Bityutskiy 已提交
117
{
A
Artem Bityutskiy 已提交
118
	struct ubi_ainf_peb *aeb;
A
Artem B. Bityutskiy 已提交
119

A
Artem Bityutskiy 已提交
120
	if (list == &ai->free) {
A
Artem B. Bityutskiy 已提交
121
		dbg_bld("add to free: PEB %d, EC %d", pnum, ec);
A
Artem Bityutskiy 已提交
122
	} else if (list == &ai->erase) {
A
Artem B. Bityutskiy 已提交
123
		dbg_bld("add to erase: PEB %d, EC %d", pnum, ec);
A
Artem Bityutskiy 已提交
124
	} else if (list == &ai->alien) {
A
Artem B. Bityutskiy 已提交
125
		dbg_bld("add to alien: PEB %d, EC %d", pnum, ec);
A
Artem Bityutskiy 已提交
126
		ai->alien_peb_count += 1;
127
	} else
A
Artem B. Bityutskiy 已提交
128 129
		BUG();

A
Artem Bityutskiy 已提交
130
	aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL);
A
Artem Bityutskiy 已提交
131
	if (!aeb)
A
Artem B. Bityutskiy 已提交
132 133
		return -ENOMEM;

A
Artem Bityutskiy 已提交
134 135
	aeb->pnum = pnum;
	aeb->ec = ec;
136
	if (to_head)
A
Artem Bityutskiy 已提交
137
		list_add(&aeb->u.list, list);
138
	else
A
Artem Bityutskiy 已提交
139
		list_add_tail(&aeb->u.list, list);
A
Artem B. Bityutskiy 已提交
140 141 142
	return 0;
}

143 144
/**
 * add_corrupted - add a corrupted physical eraseblock.
A
Artem Bityutskiy 已提交
145
 * @ai: attaching information
146 147 148
 * @pnum: physical eraseblock number to add
 * @ec: erase counter of the physical eraseblock
 *
149 150 151 152
 * 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.
153
 */
A
Artem Bityutskiy 已提交
154
static int add_corrupted(struct ubi_attach_info *ai, int pnum, int ec)
155
{
A
Artem Bityutskiy 已提交
156
	struct ubi_ainf_peb *aeb;
157 158 159

	dbg_bld("add to corrupted: PEB %d, EC %d", pnum, ec);

A
Artem Bityutskiy 已提交
160
	aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL);
A
Artem Bityutskiy 已提交
161
	if (!aeb)
162 163
		return -ENOMEM;

A
Artem Bityutskiy 已提交
164
	ai->corr_peb_count += 1;
A
Artem Bityutskiy 已提交
165 166
	aeb->pnum = pnum;
	aeb->ec = ec;
A
Artem Bityutskiy 已提交
167
	list_add(&aeb->u.list, &ai->corr);
168 169 170
	return 0;
}

A
Artem B. Bityutskiy 已提交
171
/**
172
 * validate_vid_hdr - check volume identifier header.
A
Artem B. Bityutskiy 已提交
173
 * @vid_hdr: the volume identifier header to check
A
Artem Bityutskiy 已提交
174
 * @av: information about the volume this logical eraseblock belongs to
A
Artem B. Bityutskiy 已提交
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.
A
Artem Bityutskiy 已提交
181
 * Most of the checks are done in the I/O sub-system. Here we check that the
A
Artem B. Bityutskiy 已提交
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,
A
Artem Bityutskiy 已提交
186
			    const struct ubi_ainf_volume *av, int pnum)
A
Artem B. Bityutskiy 已提交
187 188
{
	int vol_type = vid_hdr->vol_type;
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);
A
Artem B. Bityutskiy 已提交
192

A
Artem Bityutskiy 已提交
193 194
	if (av->leb_count != 0) {
		int av_vol_type;
A
Artem B. Bityutskiy 已提交
195 196 197 198 199 200 201

		/*
		 * 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.
		 */

A
Artem Bityutskiy 已提交
202
		if (vol_id != av->vol_id) {
A
Artem Bityutskiy 已提交
203
			ubi_err("inconsistent vol_id");
A
Artem B. Bityutskiy 已提交
204 205 206
			goto bad;
		}

A
Artem Bityutskiy 已提交
207 208
		if (av->vol_type == UBI_STATIC_VOLUME)
			av_vol_type = UBI_VID_STATIC;
A
Artem B. Bityutskiy 已提交
209
		else
A
Artem Bityutskiy 已提交
210
			av_vol_type = UBI_VID_DYNAMIC;
A
Artem B. Bityutskiy 已提交
211

A
Artem Bityutskiy 已提交
212
		if (vol_type != av_vol_type) {
A
Artem Bityutskiy 已提交
213
			ubi_err("inconsistent vol_type");
A
Artem B. Bityutskiy 已提交
214 215 216
			goto bad;
		}

A
Artem Bityutskiy 已提交
217
		if (used_ebs != av->used_ebs) {
A
Artem Bityutskiy 已提交
218
			ubi_err("inconsistent used_ebs");
A
Artem B. Bityutskiy 已提交
219 220 221
			goto bad;
		}

A
Artem Bityutskiy 已提交
222
		if (data_pad != av->data_pad) {
A
Artem Bityutskiy 已提交
223
			ubi_err("inconsistent data_pad");
A
Artem B. Bityutskiy 已提交
224 225 226 227 228 229 230 231
			goto bad;
		}
	}

	return 0;

bad:
	ubi_err("inconsistent VID header at PEB %d", pnum);
232
	ubi_dump_vid_hdr(vid_hdr);
A
Artem Bityutskiy 已提交
233
	ubi_dump_av(av);
A
Artem B. Bityutskiy 已提交
234 235 236 237
	return -EINVAL;
}

/**
A
Artem Bityutskiy 已提交
238 239
 * add_volume - add volume to the attaching information.
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
240 241 242 243 244
 * @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
A
Artem Bityutskiy 已提交
245 246
 * present in the attaching information, this function does nothing. Otherwise
 * it adds corresponding volume to the attaching information. Returns a pointer
247 248
 * to the allocated "av" object in case of success and a negative error code in
 * case of failure.
A
Artem B. Bityutskiy 已提交
249
 */
A
Artem Bityutskiy 已提交
250
static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai,
251
					  int vol_id, int pnum,
A
Artem B. Bityutskiy 已提交
252 253
					  const struct ubi_vid_hdr *vid_hdr)
{
A
Artem Bityutskiy 已提交
254
	struct ubi_ainf_volume *av;
A
Artem Bityutskiy 已提交
255
	struct rb_node **p = &ai->volumes.rb_node, *parent = NULL;
A
Artem B. Bityutskiy 已提交
256

257
	ubi_assert(vol_id == be32_to_cpu(vid_hdr->vol_id));
A
Artem B. Bityutskiy 已提交
258 259 260 261

	/* Walk the volume RB-tree to look if this volume is already present */
	while (*p) {
		parent = *p;
A
Artem Bityutskiy 已提交
262
		av = rb_entry(parent, struct ubi_ainf_volume, rb);
A
Artem B. Bityutskiy 已提交
263

A
Artem Bityutskiy 已提交
264 265
		if (vol_id == av->vol_id)
			return av;
A
Artem B. Bityutskiy 已提交
266

A
Artem Bityutskiy 已提交
267
		if (vol_id > av->vol_id)
A
Artem B. Bityutskiy 已提交
268 269 270 271 272 273
			p = &(*p)->rb_left;
		else
			p = &(*p)->rb_right;
	}

	/* The volume is absent - add it */
A
Artem Bityutskiy 已提交
274 275
	av = kmalloc(sizeof(struct ubi_ainf_volume), GFP_KERNEL);
	if (!av)
A
Artem B. Bityutskiy 已提交
276 277
		return ERR_PTR(-ENOMEM);

A
Artem Bityutskiy 已提交
278 279 280 281 282 283 284
	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
A
Artem B. Bityutskiy 已提交
285
							    : UBI_STATIC_VOLUME;
A
Artem Bityutskiy 已提交
286 287
	if (vol_id > ai->highest_vol_id)
		ai->highest_vol_id = vol_id;
A
Artem B. Bityutskiy 已提交
288

A
Artem Bityutskiy 已提交
289 290
	rb_link_node(&av->rb, parent, p);
	rb_insert_color(&av->rb, &ai->volumes);
A
Artem Bityutskiy 已提交
291
	ai->vols_found += 1;
A
Artem B. Bityutskiy 已提交
292
	dbg_bld("added volume %d", vol_id);
A
Artem Bityutskiy 已提交
293
	return av;
A
Artem B. Bityutskiy 已提交
294 295 296 297 298
}

/**
 * compare_lebs - find out which logical eraseblock is newer.
 * @ubi: UBI device description object
A
Artem Bityutskiy 已提交
299
 * @aeb: first logical eraseblock to compare
A
Artem B. Bityutskiy 已提交
300 301 302 303 304 305 306 307
 * @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:
A
Artem Bityutskiy 已提交
308
 *     o bit 0 is cleared: the first PEB (described by @aeb) is newer than the
A
Artem B. Bityutskiy 已提交
309 310 311 312 313 314 315
 *       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.
 */
A
Artem Bityutskiy 已提交
316
static int compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
317
			int pnum, const struct ubi_vid_hdr *vid_hdr)
A
Artem B. Bityutskiy 已提交
318 319 320 321
{
	void *buf;
	int len, err, second_is_newer, bitflips = 0, corrupted = 0;
	uint32_t data_crc, crc;
A
Artem Bityutskiy 已提交
322
	struct ubi_vid_hdr *vh = NULL;
323
	unsigned long long sqnum2 = be64_to_cpu(vid_hdr->sqnum);
A
Artem B. Bityutskiy 已提交
324

A
Artem Bityutskiy 已提交
325
	if (sqnum2 == aeb->sqnum) {
A
Artem B. Bityutskiy 已提交
326
		/*
327 328 329 330
		 * 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
331 332
		 * support these images anymore. Well, those images still work,
		 * but only if no unclean reboots happened.
A
Artem B. Bityutskiy 已提交
333
		 */
334 335 336
		ubi_err("unsupported on-flash UBI format\n");
		return -EINVAL;
	}
A
Artem Bityutskiy 已提交
337

338
	/* Obviously the LEB with lower sequence counter is older */
A
Artem Bityutskiy 已提交
339
	second_is_newer = (sqnum2 > aeb->sqnum);
A
Artem B. Bityutskiy 已提交
340 341 342 343 344 345 346

	/*
	 * 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.
	 *
347
	 * Note: this may be optimized so that we wouldn't read twice.
A
Artem B. Bityutskiy 已提交
348 349 350 351 352 353 354 355 356 357
	 */

	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 {
A
Artem Bityutskiy 已提交
358
		if (!aeb->copy_flag) {
359 360 361 362 363
			/* It is not a copy, so it is newer */
			dbg_bld("first PEB %d is newer, copy_flag is unset",
				pnum);
			return bitflips << 1;
		}
A
Artem B. Bityutskiy 已提交
364

365
		vh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
A
Artem Bityutskiy 已提交
366
		if (!vh)
A
Artem B. Bityutskiy 已提交
367 368
			return -ENOMEM;

A
Artem Bityutskiy 已提交
369
		pnum = aeb->pnum;
A
Artem Bityutskiy 已提交
370
		err = ubi_io_read_vid_hdr(ubi, pnum, vh, 0);
A
Artem B. Bityutskiy 已提交
371 372 373 374
		if (err) {
			if (err == UBI_IO_BITFLIPS)
				bitflips = 1;
			else {
A
Artem Bityutskiy 已提交
375
				ubi_err("VID of PEB %d header is bad, but it "
376
					"was OK earlier, err %d", pnum, err);
A
Artem B. Bityutskiy 已提交
377 378 379 380 381 382 383
				if (err > 0)
					err = -EIO;

				goto out_free_vidh;
			}
		}

A
Artem Bityutskiy 已提交
384
		vid_hdr = vh;
A
Artem B. Bityutskiy 已提交
385 386 387 388
	}

	/* Read the data of the copy and check the CRC */

389
	len = be32_to_cpu(vid_hdr->data_size);
390
	buf = vmalloc(len);
A
Artem B. Bityutskiy 已提交
391 392 393 394 395 396
	if (!buf) {
		err = -ENOMEM;
		goto out_free_vidh;
	}

	err = ubi_io_read_data(ubi, buf, pnum, 0, len);
397
	if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err))
A
Artem B. Bityutskiy 已提交
398 399
		goto out_free_buf;

400
	data_crc = be32_to_cpu(vid_hdr->data_crc);
A
Artem B. Bityutskiy 已提交
401 402 403 404 405 406 407 408 409 410 411 412
	crc = crc32(UBI_CRC32_INIT, buf, len);
	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;
	}

413
	vfree(buf);
A
Artem Bityutskiy 已提交
414
	ubi_free_vid_hdr(ubi, vh);
A
Artem B. Bityutskiy 已提交
415 416 417 418 419 420 421 422 423

	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);

out_free_buf:
424
	vfree(buf);
A
Artem B. Bityutskiy 已提交
425
out_free_vidh:
A
Artem Bityutskiy 已提交
426
	ubi_free_vid_hdr(ubi, vh);
A
Artem B. Bityutskiy 已提交
427 428 429 430
	return err;
}

/**
431
 * ubi_add_to_av - add used physical eraseblock to the attaching information.
A
Artem B. Bityutskiy 已提交
432
 * @ubi: UBI device description object
A
Artem Bityutskiy 已提交
433
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
434 435 436 437 438
 * @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
 *
A
Artem Bityutskiy 已提交
439 440 441 442 443 444
 * 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.
A
Artem B. Bityutskiy 已提交
445
 */
A
Artem Bityutskiy 已提交
446 447
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)
A
Artem B. Bityutskiy 已提交
448 449 450
{
	int err, vol_id, lnum;
	unsigned long long sqnum;
A
Artem Bityutskiy 已提交
451
	struct ubi_ainf_volume *av;
A
Artem Bityutskiy 已提交
452
	struct ubi_ainf_peb *aeb;
A
Artem B. Bityutskiy 已提交
453 454
	struct rb_node **p, *parent = NULL;

455 456 457
	vol_id = be32_to_cpu(vid_hdr->vol_id);
	lnum = be32_to_cpu(vid_hdr->lnum);
	sqnum = be64_to_cpu(vid_hdr->sqnum);
A
Artem B. Bityutskiy 已提交
458

459 460
	dbg_bld("PEB %d, LEB %d:%d, EC %d, sqnum %llu, bitflips %d",
		pnum, vol_id, lnum, ec, sqnum, bitflips);
A
Artem B. Bityutskiy 已提交
461

A
Artem Bityutskiy 已提交
462 463 464
	av = add_volume(ai, vol_id, pnum, vid_hdr);
	if (IS_ERR(av))
		return PTR_ERR(av);
A
Artem B. Bityutskiy 已提交
465

A
Artem Bityutskiy 已提交
466 467
	if (ai->max_sqnum < sqnum)
		ai->max_sqnum = sqnum;
B
Brijesh Singh 已提交
468

A
Artem B. Bityutskiy 已提交
469 470 471 472
	/*
	 * 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.
	 */
A
Artem Bityutskiy 已提交
473
	p = &av->root.rb_node;
A
Artem B. Bityutskiy 已提交
474 475 476 477
	while (*p) {
		int cmp_res;

		parent = *p;
A
Artem Bityutskiy 已提交
478 479 480
		aeb = rb_entry(parent, struct ubi_ainf_peb, u.rb);
		if (lnum != aeb->lnum) {
			if (lnum < aeb->lnum)
A
Artem B. Bityutskiy 已提交
481 482 483 484 485 486 487 488 489 490 491
				p = &(*p)->rb_left;
			else
				p = &(*p)->rb_right;
			continue;
		}

		/*
		 * There is already a physical eraseblock describing the same
		 * logical eraseblock present.
		 */

A
Artem Bityutskiy 已提交
492 493
		dbg_bld("this LEB already exists: PEB %d, sqnum %llu, EC %d",
			aeb->pnum, aeb->sqnum, aeb->ec);
A
Artem B. Bityutskiy 已提交
494 495 496 497 498

		/*
		 * Make sure that the logical eraseblocks have different
		 * sequence numbers. Otherwise the image is bad.
		 *
499 500 501 502 503 504 505 506
		 * 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
		 * 'compare_lebs()'. In other words, we attach old clean
		 * images, but refuse attaching old images with duplicated
		 * logical eraseblocks because there was an unclean reboot.
A
Artem B. Bityutskiy 已提交
507
		 */
A
Artem Bityutskiy 已提交
508
		if (aeb->sqnum == sqnum && sqnum != 0) {
A
Artem B. Bityutskiy 已提交
509 510
			ubi_err("two LEBs with same sequence number %llu",
				sqnum);
A
Artem Bityutskiy 已提交
511
			ubi_dump_aeb(aeb, 0);
512
			ubi_dump_vid_hdr(vid_hdr);
A
Artem B. Bityutskiy 已提交
513 514 515 516 517 518 519
			return -EINVAL;
		}

		/*
		 * Now we have to drop the older one and preserve the newer
		 * one.
		 */
A
Artem Bityutskiy 已提交
520
		cmp_res = compare_lebs(ubi, aeb, pnum, vid_hdr);
A
Artem B. Bityutskiy 已提交
521 522 523 524 525
		if (cmp_res < 0)
			return cmp_res;

		if (cmp_res & 1) {
			/*
S
Shinya Kuribayashi 已提交
526
			 * This logical eraseblock is newer than the one
A
Artem B. Bityutskiy 已提交
527 528
			 * found earlier.
			 */
A
Artem Bityutskiy 已提交
529
			err = validate_vid_hdr(vid_hdr, av, pnum);
A
Artem B. Bityutskiy 已提交
530 531 532
			if (err)
				return err;

A
Artem Bityutskiy 已提交
533 534
			err = add_to_list(ai, aeb->pnum, aeb->ec, cmp_res & 4,
					  &ai->erase);
A
Artem B. Bityutskiy 已提交
535 536 537
			if (err)
				return err;

A
Artem Bityutskiy 已提交
538 539 540 541 542
			aeb->ec = ec;
			aeb->pnum = pnum;
			aeb->scrub = ((cmp_res & 2) || bitflips);
			aeb->copy_flag = vid_hdr->copy_flag;
			aeb->sqnum = sqnum;
A
Artem B. Bityutskiy 已提交
543

A
Artem Bityutskiy 已提交
544 545
			if (av->highest_lnum == lnum)
				av->last_data_size =
546
					be32_to_cpu(vid_hdr->data_size);
A
Artem B. Bityutskiy 已提交
547 548 549 550

			return 0;
		} else {
			/*
551
			 * This logical eraseblock is older than the one found
A
Artem B. Bityutskiy 已提交
552 553
			 * previously.
			 */
A
Artem Bityutskiy 已提交
554 555
			return add_to_list(ai, pnum, ec, cmp_res & 4,
					   &ai->erase);
A
Artem B. Bityutskiy 已提交
556 557 558 559 560
		}
	}

	/*
	 * We've met this logical eraseblock for the first time, add it to the
A
Artem Bityutskiy 已提交
561
	 * attaching information.
A
Artem B. Bityutskiy 已提交
562 563
	 */

A
Artem Bityutskiy 已提交
564
	err = validate_vid_hdr(vid_hdr, av, pnum);
A
Artem B. Bityutskiy 已提交
565 566 567
	if (err)
		return err;

A
Artem Bityutskiy 已提交
568
	aeb = kmem_cache_alloc(ai->aeb_slab_cache, GFP_KERNEL);
A
Artem Bityutskiy 已提交
569
	if (!aeb)
A
Artem B. Bityutskiy 已提交
570 571
		return -ENOMEM;

A
Artem Bityutskiy 已提交
572 573 574 575 576 577
	aeb->ec = ec;
	aeb->pnum = pnum;
	aeb->lnum = lnum;
	aeb->scrub = bitflips;
	aeb->copy_flag = vid_hdr->copy_flag;
	aeb->sqnum = sqnum;
A
Artem B. Bityutskiy 已提交
578

A
Artem Bityutskiy 已提交
579 580 581
	if (av->highest_lnum <= lnum) {
		av->highest_lnum = lnum;
		av->last_data_size = be32_to_cpu(vid_hdr->data_size);
A
Artem B. Bityutskiy 已提交
582 583
	}

A
Artem Bityutskiy 已提交
584
	av->leb_count += 1;
A
Artem Bityutskiy 已提交
585
	rb_link_node(&aeb->u.rb, parent, p);
A
Artem Bityutskiy 已提交
586
	rb_insert_color(&aeb->u.rb, &av->root);
A
Artem B. Bityutskiy 已提交
587 588 589 590
	return 0;
}

/**
A
Artem Bityutskiy 已提交
591
 * ubi_find_av - find volume in the attaching information.
A
Artem Bityutskiy 已提交
592
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
593 594 595
 * @vol_id: the requested volume ID
 *
 * This function returns a pointer to the volume description or %NULL if there
A
Artem Bityutskiy 已提交
596
 * are no data about this volume in the attaching information.
A
Artem B. Bityutskiy 已提交
597
 */
A
Artem Bityutskiy 已提交
598 599
struct ubi_ainf_volume *ubi_find_av(const struct ubi_attach_info *ai,
				    int vol_id)
A
Artem B. Bityutskiy 已提交
600
{
A
Artem Bityutskiy 已提交
601
	struct ubi_ainf_volume *av;
A
Artem Bityutskiy 已提交
602
	struct rb_node *p = ai->volumes.rb_node;
A
Artem B. Bityutskiy 已提交
603 604

	while (p) {
A
Artem Bityutskiy 已提交
605
		av = rb_entry(p, struct ubi_ainf_volume, rb);
A
Artem B. Bityutskiy 已提交
606

A
Artem Bityutskiy 已提交
607 608
		if (vol_id == av->vol_id)
			return av;
A
Artem B. Bityutskiy 已提交
609

A
Artem Bityutskiy 已提交
610
		if (vol_id > av->vol_id)
A
Artem B. Bityutskiy 已提交
611 612 613 614 615 616 617 618 619
			p = p->rb_left;
		else
			p = p->rb_right;
	}

	return NULL;
}

/**
620
 * ubi_remove_av - delete attaching information about a volume.
A
Artem Bityutskiy 已提交
621
 * @ai: attaching information
A
Artem Bityutskiy 已提交
622
 * @av: the volume attaching information to delete
A
Artem B. Bityutskiy 已提交
623
 */
624
void ubi_remove_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av)
A
Artem B. Bityutskiy 已提交
625 626
{
	struct rb_node *rb;
A
Artem Bityutskiy 已提交
627
	struct ubi_ainf_peb *aeb;
A
Artem B. Bityutskiy 已提交
628

A
Artem Bityutskiy 已提交
629
	dbg_bld("remove attaching information about volume %d", av->vol_id);
A
Artem B. Bityutskiy 已提交
630

A
Artem Bityutskiy 已提交
631
	while ((rb = rb_first(&av->root))) {
A
Artem Bityutskiy 已提交
632
		aeb = rb_entry(rb, struct ubi_ainf_peb, u.rb);
A
Artem Bityutskiy 已提交
633
		rb_erase(&aeb->u.rb, &av->root);
A
Artem Bityutskiy 已提交
634
		list_add_tail(&aeb->u.list, &ai->erase);
A
Artem B. Bityutskiy 已提交
635 636
	}

A
Artem Bityutskiy 已提交
637 638
	rb_erase(&av->rb, &ai->volumes);
	kfree(av);
A
Artem Bityutskiy 已提交
639
	ai->vols_found -= 1;
A
Artem B. Bityutskiy 已提交
640 641 642
}

/**
643
 * early_erase_peb - erase a physical eraseblock.
A
Artem B. Bityutskiy 已提交
644
 * @ubi: UBI device description object
A
Artem Bityutskiy 已提交
645
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
646
 * @pnum: physical eraseblock number to erase;
647
 * @ec: erase counter value to write (%UBI_UNKNOWN if it is unknown)
A
Artem B. Bityutskiy 已提交
648 649 650
 *
 * This function erases physical eraseblock 'pnum', and writes the erase
 * counter header to it. This function should only be used on UBI device
A
Artem Bityutskiy 已提交
651 652 653
 * 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.
A
Artem B. Bityutskiy 已提交
654
 */
655 656
static int early_erase_peb(struct ubi_device *ubi,
			   const struct ubi_attach_info *ai, int pnum, int ec)
A
Artem B. Bityutskiy 已提交
657 658 659 660 661 662 663 664 665 666 667 668 669
{
	int err;
	struct ubi_ec_hdr *ec_hdr;

	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;
	}

670 671 672 673
	ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
	if (!ec_hdr)
		return -ENOMEM;

674
	ec_hdr->ec = cpu_to_be64(ec);
A
Artem B. Bityutskiy 已提交
675 676 677 678 679 680 681 682 683 684 685 686 687

	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;
}

/**
688
 * ubi_early_get_peb - get a free physical eraseblock.
A
Artem B. Bityutskiy 已提交
689
 * @ubi: UBI device description object
A
Artem Bityutskiy 已提交
690
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
691 692
 *
 * This function returns a free physical eraseblock. It is supposed to be
A
Artem Bityutskiy 已提交
693 694 695 696
 * 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.
A
Artem B. Bityutskiy 已提交
697
 *
698 699
 * 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.
A
Artem B. Bityutskiy 已提交
700
 */
701 702
struct ubi_ainf_peb *ubi_early_get_peb(struct ubi_device *ubi,
				       struct ubi_attach_info *ai)
A
Artem B. Bityutskiy 已提交
703
{
A
Artem Bityutskiy 已提交
704
	int err = 0;
A
Artem Bityutskiy 已提交
705
	struct ubi_ainf_peb *aeb, *tmp_aeb;
A
Artem B. Bityutskiy 已提交
706

A
Artem Bityutskiy 已提交
707 708
	if (!list_empty(&ai->free)) {
		aeb = list_entry(ai->free.next, struct ubi_ainf_peb, u.list);
A
Artem Bityutskiy 已提交
709 710 711
		list_del(&aeb->u.list);
		dbg_bld("return free PEB %d, EC %d", aeb->pnum, aeb->ec);
		return aeb;
A
Artem B. Bityutskiy 已提交
712 713
	}

A
Artem Bityutskiy 已提交
714 715 716 717 718 719
	/*
	 * 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.
	 */
A
Artem Bityutskiy 已提交
720
	list_for_each_entry_safe(aeb, tmp_aeb, &ai->erase, u.list) {
721
		if (aeb->ec == UBI_UNKNOWN)
A
Artem Bityutskiy 已提交
722
			aeb->ec = ai->mean_ec;
A
Artem B. Bityutskiy 已提交
723

724
		err = early_erase_peb(ubi, ai, aeb->pnum, aeb->ec+1);
A
Artem Bityutskiy 已提交
725 726
		if (err)
			continue;
A
Artem B. Bityutskiy 已提交
727

A
Artem Bityutskiy 已提交
728 729 730 731
		aeb->ec += 1;
		list_del(&aeb->u.list);
		dbg_bld("return PEB %d, EC %d", aeb->pnum, aeb->ec);
		return aeb;
A
Artem B. Bityutskiy 已提交
732 733
	}

A
Artem Bityutskiy 已提交
734
	ubi_err("no free eraseblocks");
A
Artem B. Bityutskiy 已提交
735 736 737
	return ERR_PTR(-ENOSPC);
}

738
/**
739
 * check_corruption - check the data area of PEB.
740 741 742 743 744 745
 * @ubi: UBI device description object
 * @vid_hrd: the (corrupted) VID header of this PEB
 * @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
746
 * 0xFF bytes in the data area, the VID header is most probably corrupted
747
 * because of a power cut (%0 is returned in this case). Otherwise, it was
748 749
 * probably corrupted for some other reasons (%1 is returned in this case). A
 * negative error code is returned if a read error occurred.
750 751 752 753 754
 *
 * 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.
 */
755 756
static int check_corruption(struct ubi_device *ubi, struct ubi_vid_hdr *vid_hdr,
			    int pnum)
757 758 759 760
{
	int err;

	mutex_lock(&ubi->buf_mutex);
761
	memset(ubi->peb_buf, 0x00, ubi->leb_size);
762

763
	err = ubi_io_read(ubi, ubi->peb_buf, pnum, ubi->leb_start,
764
			  ubi->leb_size);
765
	if (err == UBI_IO_BITFLIPS || mtd_is_eccerr(err)) {
766 767 768 769 770 771 772
		/*
		 * 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.
		 */
773 774
		err = 0;
		goto out_unlock;
775 776 777
	}

	if (err)
778
		goto out_unlock;
779

780
	if (ubi_check_pattern(ubi->peb_buf, 0xFF, ubi->leb_size))
781
		goto out_unlock;
782 783 784 785

	ubi_err("PEB %d contains corrupted VID header, and the data does not "
		"contain all 0xFF, this may be a non-UBI PEB or a severe VID "
		"header corruption which requires manual inspection", pnum);
786
	ubi_dump_vid_hdr(vid_hdr);
787 788 789
	dbg_msg("hexdump of PEB %d offset %d, length %d",
		pnum, ubi->leb_start, ubi->leb_size);
	ubi_dbg_print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1,
790
			       ubi->peb_buf, ubi->leb_size, 1);
791 792 793
	err = 1;

out_unlock:
794
	mutex_unlock(&ubi->buf_mutex);
795
	return err;
796 797
}

A
Artem B. Bityutskiy 已提交
798
/**
799
 * scan_peb - scan and process UBI headers of a PEB.
A
Artem B. Bityutskiy 已提交
800
 * @ubi: UBI device description object
A
Artem Bityutskiy 已提交
801
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
802 803
 * @pnum: the physical eraseblock number
 *
804 805 806 807
 * 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.
A
Artem B. Bityutskiy 已提交
808
 */
809 810
static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
		    int pnum)
A
Artem B. Bityutskiy 已提交
811
{
A
Artem Bityutskiy 已提交
812
	long long uninitialized_var(ec);
A
Artem Bityutskiy 已提交
813
	int err, bitflips = 0, vol_id, ec_err = 0;
A
Artem B. Bityutskiy 已提交
814 815 816 817 818 819 820 821

	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) {
A
Artem Bityutskiy 已提交
822
		ai->bad_peb_count += 1;
A
Artem B. Bityutskiy 已提交
823 824 825 826 827 828
		return 0;
	}

	err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
	if (err < 0)
		return err;
829 830 831 832
	switch (err) {
	case 0:
		break;
	case UBI_IO_BITFLIPS:
A
Artem B. Bityutskiy 已提交
833
		bitflips = 1;
834 835
		break;
	case UBI_IO_FF:
A
Artem Bityutskiy 已提交
836
		ai->empty_peb_count += 1;
837
		return add_to_list(ai, pnum, UBI_UNKNOWN, 0,
A
Artem Bityutskiy 已提交
838
				   &ai->erase);
839
	case UBI_IO_FF_BITFLIPS:
A
Artem Bityutskiy 已提交
840
		ai->empty_peb_count += 1;
841
		return add_to_list(ai, pnum, UBI_UNKNOWN, 1,
A
Artem Bityutskiy 已提交
842
				   &ai->erase);
843 844
	case UBI_IO_BAD_HDR_EBADMSG:
	case UBI_IO_BAD_HDR:
A
Artem B. Bityutskiy 已提交
845 846 847 848 849
		/*
		 * 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.
		 */
A
Artem Bityutskiy 已提交
850
		ec_err = err;
851
		ec = UBI_UNKNOWN;
A
Artem B. Bityutskiy 已提交
852
		bitflips = 1;
853 854 855 856
		break;
	default:
		ubi_err("'ubi_io_read_ec_hdr()' returned unknown code %d", err);
		return -EINVAL;
A
Artem B. Bityutskiy 已提交
857 858
	}

A
Artem Bityutskiy 已提交
859
	if (!ec_err) {
860 861
		int image_seq;

A
Artem B. Bityutskiy 已提交
862 863 864 865 866 867 868
		/* 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;
		}

869
		ec = be64_to_cpu(ech->ec);
A
Artem B. Bityutskiy 已提交
870 871 872 873 874 875 876 877 878 879
		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);
880
			ubi_dump_ec_hdr(ech);
A
Artem B. Bityutskiy 已提交
881 882
			return -EINVAL;
		}
883

884 885 886 887 888 889 890 891 892 893 894
		/*
		 * 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.
		 */
895
		image_seq = be32_to_cpu(ech->image_seq);
A
Artem Bityutskiy 已提交
896
		if (!ubi->image_seq && image_seq)
897
			ubi->image_seq = image_seq;
A
Artem Bityutskiy 已提交
898 899
		if (ubi->image_seq && image_seq &&
		    ubi->image_seq != image_seq) {
900 901
			ubi_err("bad image sequence number %d in PEB %d, "
				"expected %d", image_seq, pnum, ubi->image_seq);
902
			ubi_dump_ec_hdr(ech);
903 904
			return -EINVAL;
		}
A
Artem B. Bityutskiy 已提交
905 906 907 908 909 910 911
	}

	/* 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;
912 913 914 915
	switch (err) {
	case 0:
		break;
	case UBI_IO_BITFLIPS:
A
Artem B. Bityutskiy 已提交
916
		bitflips = 1;
917 918
		break;
	case UBI_IO_BAD_HDR_EBADMSG:
919 920 921 922 923 924 925
		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.
			 */
A
Artem Bityutskiy 已提交
926
			ai->maybe_bad_peb_count += 1;
927
	case UBI_IO_BAD_HDR:
928 929 930 931 932 933
		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
934
			 * contains garbage because of a power cut during erase
935
			 * operation. So we just schedule this PEB for erasure.
936
			 *
L
Lucas De Marchi 已提交
937
			 * Besides, in case of NOR flash, we deliberately
938 939
			 * corrupt both headers because NOR flash erasure is
			 * slow and can start from the end.
940 941 942 943 944 945 946
			 */
			err = 0;
		else
			/*
			 * The EC was OK, but the VID header is corrupted. We
			 * have to check what is in the data area.
			 */
947
			err = check_corruption(ubi, vidh, pnum);
948 949 950 951

		if (err < 0)
			return err;
		else if (!err)
952
			/* This corruption is caused by a power cut */
A
Artem Bityutskiy 已提交
953
			err = add_to_list(ai, pnum, ec, 1, &ai->erase);
954 955
		else
			/* This is an unexpected corruption */
A
Artem Bityutskiy 已提交
956
			err = add_corrupted(ai, pnum, ec);
957 958 959
		if (err)
			return err;
		goto adjust_mean_ec;
960
	case UBI_IO_FF_BITFLIPS:
A
Artem Bityutskiy 已提交
961
		err = add_to_list(ai, pnum, ec, 1, &ai->erase);
A
Artem B. Bityutskiy 已提交
962 963 964
		if (err)
			return err;
		goto adjust_mean_ec;
965 966
	case UBI_IO_FF:
		if (ec_err)
A
Artem Bityutskiy 已提交
967
			err = add_to_list(ai, pnum, ec, 1, &ai->erase);
968
		else
A
Artem Bityutskiy 已提交
969
			err = add_to_list(ai, pnum, ec, 0, &ai->free);
A
Artem B. Bityutskiy 已提交
970 971 972
		if (err)
			return err;
		goto adjust_mean_ec;
973 974 975 976
	default:
		ubi_err("'ubi_io_read_vid_hdr()' returned unknown code %d",
			err);
		return -EINVAL;
A
Artem B. Bityutskiy 已提交
977 978
	}

979
	vol_id = be32_to_cpu(vidh->vol_id);
980
	if (vol_id > UBI_MAX_VOLUMES && vol_id != UBI_LAYOUT_VOLUME_ID) {
981
		int lnum = be32_to_cpu(vidh->lnum);
A
Artem B. Bityutskiy 已提交
982 983 984 985 986

		/* Unsupported internal volume */
		switch (vidh->compat) {
		case UBI_COMPAT_DELETE:
			ubi_msg("\"delete\" compatible internal volume %d:%d"
987
				" found, will remove it", vol_id, lnum);
A
Artem Bityutskiy 已提交
988
			err = add_to_list(ai, pnum, ec, 1, &ai->erase);
A
Artem B. Bityutskiy 已提交
989 990
			if (err)
				return err;
991
			return 0;
A
Artem B. Bityutskiy 已提交
992 993 994 995 996 997 998 999 1000 1001 1002

		case UBI_COMPAT_RO:
			ubi_msg("read-only compatible internal volume %d:%d"
				" found, switch to read-only mode",
				vol_id, lnum);
			ubi->ro_mode = 1;
			break;

		case UBI_COMPAT_PRESERVE:
			ubi_msg("\"preserve\" compatible internal volume %d:%d"
				" found", vol_id, lnum);
A
Artem Bityutskiy 已提交
1003
			err = add_to_list(ai, pnum, ec, 0, &ai->alien);
A
Artem B. Bityutskiy 已提交
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
			if (err)
				return err;
			return 0;

		case UBI_COMPAT_REJECT:
			ubi_err("incompatible internal volume %d:%d found",
				vol_id, lnum);
			return -EINVAL;
		}
	}

A
Artem Bityutskiy 已提交
1015
	if (ec_err)
1016 1017
		ubi_warn("valid VID header but corrupted EC header at PEB %d",
			 pnum);
A
Artem Bityutskiy 已提交
1018
	err = ubi_add_to_av(ubi, ai, pnum, ec, vidh, bitflips);
A
Artem B. Bityutskiy 已提交
1019 1020 1021 1022
	if (err)
		return err;

adjust_mean_ec:
A
Artem Bityutskiy 已提交
1023
	if (!ec_err) {
A
Artem Bityutskiy 已提交
1024 1025 1026 1027 1028 1029
		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;
A
Artem B. Bityutskiy 已提交
1030 1031 1032 1033 1034
	}

	return 0;
}

1035
/**
1036
 * late_analysis - analyze the overall situation with PEB.
1037
 * @ubi: UBI device description object
A
Artem Bityutskiy 已提交
1038
 * @ai: attaching information
1039
 *
1040 1041 1042 1043 1044
 * 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.
1045
 */
1046
static int late_analysis(struct ubi_device *ubi, struct ubi_attach_info *ai)
1047
{
A
Artem Bityutskiy 已提交
1048
	struct ubi_ainf_peb *aeb;
1049
	int max_corr, peb_count;
1050

A
Artem Bityutskiy 已提交
1051
	peb_count = ubi->peb_count - ai->bad_peb_count - ai->alien_peb_count;
1052
	max_corr = peb_count / 20 ?: 8;
1053 1054

	/*
1055
	 * Few corrupted PEBs is not a problem and may be just a result of
1056 1057 1058
	 * unclean reboots. However, many of them may indicate some problems
	 * with the flash HW or driver.
	 */
A
Artem Bityutskiy 已提交
1059
	if (ai->corr_peb_count) {
1060
		ubi_err("%d PEBs are corrupted and preserved",
A
Artem Bityutskiy 已提交
1061
			ai->corr_peb_count);
1062
		printk(KERN_ERR "Corrupted PEBs are:");
A
Artem Bityutskiy 已提交
1063
		list_for_each_entry(aeb, &ai->corr, u.list)
A
Artem Bityutskiy 已提交
1064
			printk(KERN_CONT " %d", aeb->pnum);
1065 1066 1067 1068 1069 1070
		printk(KERN_CONT "\n");

		/*
		 * If too many PEBs are corrupted, we refuse attaching,
		 * otherwise, only print a warning.
		 */
A
Artem Bityutskiy 已提交
1071
		if (ai->corr_peb_count >= max_corr) {
1072
			ubi_err("too many corrupted PEBs, refusing");
1073 1074 1075 1076
			return -EINVAL;
		}
	}

A
Artem Bityutskiy 已提交
1077
	if (ai->empty_peb_count + ai->maybe_bad_peb_count == peb_count) {
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
		/*
		 * 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.
		 */
A
Artem Bityutskiy 已提交
1093 1094
		if (ai->maybe_bad_peb_count <= 2) {
			ai->is_empty = 1;
1095
			ubi_msg("empty MTD device detected");
1096 1097
			get_random_bytes(&ubi->image_seq,
					 sizeof(ubi->image_seq));
1098
		} else {
1099 1100
			ubi_err("MTD device is not UBI-formatted and possibly "
				"contains non-UBI data - refusing it");
1101 1102
			return -EINVAL;
		}
1103

1104 1105 1106 1107 1108
	}

	return 0;
}

A
Artem B. Bityutskiy 已提交
1109
/**
1110
 * scan_all - scan entire MTD device.
A
Artem B. Bityutskiy 已提交
1111 1112 1113
 * @ubi: UBI device description object
 *
 * This function does full scanning of an MTD device and returns complete
1114 1115
 * information about it in form of a "struct ubi_attach_info" object. In case
 * of failure, an error code is returned.
A
Artem B. Bityutskiy 已提交
1116
 */
1117
static struct ubi_attach_info *scan_all(struct ubi_device *ubi)
A
Artem B. Bityutskiy 已提交
1118 1119 1120
{
	int err, pnum;
	struct rb_node *rb1, *rb2;
A
Artem Bityutskiy 已提交
1121
	struct ubi_ainf_volume *av;
A
Artem Bityutskiy 已提交
1122
	struct ubi_ainf_peb *aeb;
A
Artem Bityutskiy 已提交
1123
	struct ubi_attach_info *ai;
A
Artem B. Bityutskiy 已提交
1124

A
Artem Bityutskiy 已提交
1125 1126
	ai = kzalloc(sizeof(struct ubi_attach_info), GFP_KERNEL);
	if (!ai)
A
Artem B. Bityutskiy 已提交
1127 1128
		return ERR_PTR(-ENOMEM);

A
Artem Bityutskiy 已提交
1129 1130 1131 1132 1133
	INIT_LIST_HEAD(&ai->corr);
	INIT_LIST_HEAD(&ai->free);
	INIT_LIST_HEAD(&ai->erase);
	INIT_LIST_HEAD(&ai->alien);
	ai->volumes = RB_ROOT;
A
Artem B. Bityutskiy 已提交
1134 1135

	err = -ENOMEM;
A
Artem Bityutskiy 已提交
1136 1137 1138 1139
	ai->aeb_slab_cache = kmem_cache_create("ubi_aeb_slab_cache",
					       sizeof(struct ubi_ainf_peb),
					       0, 0, NULL);
	if (!ai->aeb_slab_cache)
A
Artem Bityutskiy 已提交
1140
		goto out_ai;
1141

A
Artem B. Bityutskiy 已提交
1142 1143
	ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
	if (!ech)
A
Artem Bityutskiy 已提交
1144
		goto out_ai;
A
Artem B. Bityutskiy 已提交
1145

1146
	vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
A
Artem B. Bityutskiy 已提交
1147 1148 1149 1150 1151 1152
	if (!vidh)
		goto out_ech;

	for (pnum = 0; pnum < ubi->peb_count; pnum++) {
		cond_resched();

1153
		dbg_gen("process PEB %d", pnum);
1154
		err = scan_peb(ubi, ai, pnum);
A
Artem B. Bityutskiy 已提交
1155 1156 1157 1158 1159 1160
		if (err < 0)
			goto out_vidh;
	}

	dbg_msg("scanning is finished");

A
Artem Bityutskiy 已提交
1161
	/* Calculate mean erase counter */
A
Artem Bityutskiy 已提交
1162 1163
	if (ai->ec_count)
		ai->mean_ec = div_u64(ai->ec_sum, ai->ec_count);
A
Artem B. Bityutskiy 已提交
1164

1165
	err = late_analysis(ubi, ai);
1166 1167
	if (err)
		goto out_vidh;
1168

A
Artem B. Bityutskiy 已提交
1169 1170 1171 1172
	/*
	 * In case of unknown erase counter we use the mean erase counter
	 * value.
	 */
A
Artem Bityutskiy 已提交
1173 1174
	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb)
1175
			if (aeb->ec == UBI_UNKNOWN)
A
Artem Bityutskiy 已提交
1176
				aeb->ec = ai->mean_ec;
A
Artem B. Bityutskiy 已提交
1177 1178
	}

A
Artem Bityutskiy 已提交
1179
	list_for_each_entry(aeb, &ai->free, u.list) {
1180
		if (aeb->ec == UBI_UNKNOWN)
A
Artem Bityutskiy 已提交
1181
			aeb->ec = ai->mean_ec;
A
Artem B. Bityutskiy 已提交
1182 1183
	}

A
Artem Bityutskiy 已提交
1184
	list_for_each_entry(aeb, &ai->corr, u.list)
1185
		if (aeb->ec == UBI_UNKNOWN)
A
Artem Bityutskiy 已提交
1186
			aeb->ec = ai->mean_ec;
A
Artem B. Bityutskiy 已提交
1187

A
Artem Bityutskiy 已提交
1188
	list_for_each_entry(aeb, &ai->erase, u.list)
1189
		if (aeb->ec == UBI_UNKNOWN)
A
Artem Bityutskiy 已提交
1190
			aeb->ec = ai->mean_ec;
A
Artem B. Bityutskiy 已提交
1191

A
Artem Bityutskiy 已提交
1192
	err = self_check_ai(ubi, ai);
1193
	if (err)
A
Artem B. Bityutskiy 已提交
1194 1195 1196 1197 1198
		goto out_vidh;

	ubi_free_vid_hdr(ubi, vidh);
	kfree(ech);

A
Artem Bityutskiy 已提交
1199
	return ai;
A
Artem B. Bityutskiy 已提交
1200 1201 1202 1203 1204

out_vidh:
	ubi_free_vid_hdr(ubi, vidh);
out_ech:
	kfree(ech);
A
Artem Bityutskiy 已提交
1205
out_ai:
1206
	ubi_destroy_ai(ai);
A
Artem B. Bityutskiy 已提交
1207 1208 1209
	return ERR_PTR(err);
}

1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257
/**
 * ubi_attach - attach an MTD device.
 * @ubi: UBI device descriptor
 *
 * This function returns zero in case of success and a negative error code in
 * case of failure.
 */
int ubi_attach(struct ubi_device *ubi)
{
	int err;
	struct ubi_attach_info *ai;

	ai = scan_all(ubi);
	if (IS_ERR(ai))
		return PTR_ERR(ai);

	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;
	ubi_msg("max. sequence number:       %llu", ai->max_sqnum);

	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;

	ubi_destroy_ai(ai);
	return 0;

out_wl:
	ubi_wl_close(ubi);
out_vtbl:
	ubi_free_internal_volumes(ubi);
	vfree(ubi->vtbl);
out_ai:
	ubi_destroy_ai(ai);
	return err;
}

A
Artem B. Bityutskiy 已提交
1258
/**
1259 1260
 * destroy_av - free volume attaching information.
 * @av: volume attaching information
A
Artem Bityutskiy 已提交
1261
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
1262
 *
1263
 * This function destroys the volume attaching information.
A
Artem B. Bityutskiy 已提交
1264
 */
A
Artem Bityutskiy 已提交
1265
static void destroy_av(struct ubi_attach_info *ai, struct ubi_ainf_volume *av)
A
Artem B. Bityutskiy 已提交
1266
{
A
Artem Bityutskiy 已提交
1267
	struct ubi_ainf_peb *aeb;
A
Artem Bityutskiy 已提交
1268
	struct rb_node *this = av->root.rb_node;
A
Artem B. Bityutskiy 已提交
1269 1270 1271 1272 1273 1274 1275

	while (this) {
		if (this->rb_left)
			this = this->rb_left;
		else if (this->rb_right)
			this = this->rb_right;
		else {
A
Artem Bityutskiy 已提交
1276
			aeb = rb_entry(this, struct ubi_ainf_peb, u.rb);
A
Artem B. Bityutskiy 已提交
1277 1278
			this = rb_parent(this);
			if (this) {
A
Artem Bityutskiy 已提交
1279
				if (this->rb_left == &aeb->u.rb)
A
Artem B. Bityutskiy 已提交
1280 1281 1282 1283 1284
					this->rb_left = NULL;
				else
					this->rb_right = NULL;
			}

A
Artem Bityutskiy 已提交
1285
			kmem_cache_free(ai->aeb_slab_cache, aeb);
A
Artem B. Bityutskiy 已提交
1286 1287
		}
	}
A
Artem Bityutskiy 已提交
1288
	kfree(av);
A
Artem B. Bityutskiy 已提交
1289 1290 1291
}

/**
1292
 * ubi_destroy_ai - destroy attaching information.
A
Artem Bityutskiy 已提交
1293
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
1294
 */
1295
void ubi_destroy_ai(struct ubi_attach_info *ai)
A
Artem B. Bityutskiy 已提交
1296
{
A
Artem Bityutskiy 已提交
1297
	struct ubi_ainf_peb *aeb, *aeb_tmp;
A
Artem Bityutskiy 已提交
1298
	struct ubi_ainf_volume *av;
A
Artem B. Bityutskiy 已提交
1299 1300
	struct rb_node *rb;

A
Artem Bityutskiy 已提交
1301
	list_for_each_entry_safe(aeb, aeb_tmp, &ai->alien, u.list) {
A
Artem Bityutskiy 已提交
1302
		list_del(&aeb->u.list);
A
Artem Bityutskiy 已提交
1303
		kmem_cache_free(ai->aeb_slab_cache, aeb);
A
Artem B. Bityutskiy 已提交
1304
	}
A
Artem Bityutskiy 已提交
1305
	list_for_each_entry_safe(aeb, aeb_tmp, &ai->erase, u.list) {
A
Artem Bityutskiy 已提交
1306
		list_del(&aeb->u.list);
A
Artem Bityutskiy 已提交
1307
		kmem_cache_free(ai->aeb_slab_cache, aeb);
A
Artem B. Bityutskiy 已提交
1308
	}
A
Artem Bityutskiy 已提交
1309
	list_for_each_entry_safe(aeb, aeb_tmp, &ai->corr, u.list) {
A
Artem Bityutskiy 已提交
1310
		list_del(&aeb->u.list);
A
Artem Bityutskiy 已提交
1311
		kmem_cache_free(ai->aeb_slab_cache, aeb);
A
Artem B. Bityutskiy 已提交
1312
	}
A
Artem Bityutskiy 已提交
1313
	list_for_each_entry_safe(aeb, aeb_tmp, &ai->free, u.list) {
A
Artem Bityutskiy 已提交
1314
		list_del(&aeb->u.list);
A
Artem Bityutskiy 已提交
1315
		kmem_cache_free(ai->aeb_slab_cache, aeb);
A
Artem B. Bityutskiy 已提交
1316 1317 1318
	}

	/* Destroy the volume RB-tree */
A
Artem Bityutskiy 已提交
1319
	rb = ai->volumes.rb_node;
A
Artem B. Bityutskiy 已提交
1320 1321 1322 1323 1324 1325
	while (rb) {
		if (rb->rb_left)
			rb = rb->rb_left;
		else if (rb->rb_right)
			rb = rb->rb_right;
		else {
A
Artem Bityutskiy 已提交
1326
			av = rb_entry(rb, struct ubi_ainf_volume, rb);
A
Artem B. Bityutskiy 已提交
1327 1328 1329

			rb = rb_parent(rb);
			if (rb) {
A
Artem Bityutskiy 已提交
1330
				if (rb->rb_left == &av->rb)
A
Artem B. Bityutskiy 已提交
1331 1332 1333 1334 1335
					rb->rb_left = NULL;
				else
					rb->rb_right = NULL;
			}

A
Artem Bityutskiy 已提交
1336
			destroy_av(ai, av);
A
Artem B. Bityutskiy 已提交
1337 1338 1339
		}
	}

A
Artem Bityutskiy 已提交
1340 1341
	if (ai->aeb_slab_cache)
		kmem_cache_destroy(ai->aeb_slab_cache);
1342

A
Artem Bityutskiy 已提交
1343
	kfree(ai);
A
Artem B. Bityutskiy 已提交
1344 1345 1346
}

/**
A
Artem Bityutskiy 已提交
1347
 * self_check_ai - check the attaching information.
A
Artem B. Bityutskiy 已提交
1348
 * @ubi: UBI device description object
A
Artem Bityutskiy 已提交
1349
 * @ai: attaching information
A
Artem B. Bityutskiy 已提交
1350
 *
A
Artem Bityutskiy 已提交
1351
 * This function returns zero if the attaching information is all right, and a
1352
 * negative error code if not or if an error occurred.
A
Artem B. Bityutskiy 已提交
1353
 */
A
Artem Bityutskiy 已提交
1354
static int self_check_ai(struct ubi_device *ubi, struct ubi_attach_info *ai)
A
Artem B. Bityutskiy 已提交
1355 1356 1357
{
	int pnum, err, vols_found = 0;
	struct rb_node *rb1, *rb2;
A
Artem Bityutskiy 已提交
1358
	struct ubi_ainf_volume *av;
A
Artem Bityutskiy 已提交
1359
	struct ubi_ainf_peb *aeb, *last_aeb;
A
Artem B. Bityutskiy 已提交
1360 1361
	uint8_t *buf;

1362
	if (!ubi->dbg->chk_gen)
A
Artem Bityutskiy 已提交
1363 1364
		return 0;

A
Artem B. Bityutskiy 已提交
1365
	/*
A
Artem Bityutskiy 已提交
1366
	 * At first, check that attaching information is OK.
A
Artem B. Bityutskiy 已提交
1367
	 */
A
Artem Bityutskiy 已提交
1368
	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
A
Artem B. Bityutskiy 已提交
1369 1370 1371 1372 1373 1374
		int leb_count = 0;

		cond_resched();

		vols_found += 1;

A
Artem Bityutskiy 已提交
1375
		if (ai->is_empty) {
A
Artem B. Bityutskiy 已提交
1376
			ubi_err("bad is_empty flag");
A
Artem Bityutskiy 已提交
1377
			goto bad_av;
A
Artem B. Bityutskiy 已提交
1378 1379
		}

A
Artem Bityutskiy 已提交
1380 1381 1382
		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) {
A
Artem B. Bityutskiy 已提交
1383
			ubi_err("negative values");
A
Artem Bityutskiy 已提交
1384
			goto bad_av;
A
Artem B. Bityutskiy 已提交
1385 1386
		}

A
Artem Bityutskiy 已提交
1387 1388
		if (av->vol_id >= UBI_MAX_VOLUMES &&
		    av->vol_id < UBI_INTERNAL_VOL_START) {
A
Artem B. Bityutskiy 已提交
1389
			ubi_err("bad vol_id");
A
Artem Bityutskiy 已提交
1390
			goto bad_av;
A
Artem B. Bityutskiy 已提交
1391 1392
		}

A
Artem Bityutskiy 已提交
1393
		if (av->vol_id > ai->highest_vol_id) {
A
Artem B. Bityutskiy 已提交
1394
			ubi_err("highest_vol_id is %d, but vol_id %d is there",
A
Artem Bityutskiy 已提交
1395
				ai->highest_vol_id, av->vol_id);
A
Artem B. Bityutskiy 已提交
1396 1397 1398
			goto out;
		}

A
Artem Bityutskiy 已提交
1399 1400
		if (av->vol_type != UBI_DYNAMIC_VOLUME &&
		    av->vol_type != UBI_STATIC_VOLUME) {
A
Artem B. Bityutskiy 已提交
1401
			ubi_err("bad vol_type");
A
Artem Bityutskiy 已提交
1402
			goto bad_av;
A
Artem B. Bityutskiy 已提交
1403 1404
		}

A
Artem Bityutskiy 已提交
1405
		if (av->data_pad > ubi->leb_size / 2) {
A
Artem B. Bityutskiy 已提交
1406
			ubi_err("bad data_pad");
A
Artem Bityutskiy 已提交
1407
			goto bad_av;
A
Artem B. Bityutskiy 已提交
1408 1409
		}

A
Artem Bityutskiy 已提交
1410
		last_aeb = NULL;
A
Artem Bityutskiy 已提交
1411
		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) {
A
Artem B. Bityutskiy 已提交
1412 1413
			cond_resched();

A
Artem Bityutskiy 已提交
1414
			last_aeb = aeb;
A
Artem B. Bityutskiy 已提交
1415 1416
			leb_count += 1;

A
Artem Bityutskiy 已提交
1417
			if (aeb->pnum < 0 || aeb->ec < 0) {
A
Artem B. Bityutskiy 已提交
1418
				ubi_err("negative values");
A
Artem Bityutskiy 已提交
1419
				goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1420 1421
			}

A
Artem Bityutskiy 已提交
1422 1423 1424
			if (aeb->ec < ai->min_ec) {
				ubi_err("bad ai->min_ec (%d), %d found",
					ai->min_ec, aeb->ec);
A
Artem Bityutskiy 已提交
1425
				goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1426 1427
			}

A
Artem Bityutskiy 已提交
1428 1429 1430
			if (aeb->ec > ai->max_ec) {
				ubi_err("bad ai->max_ec (%d), %d found",
					ai->max_ec, aeb->ec);
A
Artem Bityutskiy 已提交
1431
				goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1432 1433
			}

A
Artem Bityutskiy 已提交
1434
			if (aeb->pnum >= ubi->peb_count) {
A
Artem B. Bityutskiy 已提交
1435
				ubi_err("too high PEB number %d, total PEBs %d",
A
Artem Bityutskiy 已提交
1436 1437
					aeb->pnum, ubi->peb_count);
				goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1438 1439
			}

A
Artem Bityutskiy 已提交
1440 1441
			if (av->vol_type == UBI_STATIC_VOLUME) {
				if (aeb->lnum >= av->used_ebs) {
A
Artem B. Bityutskiy 已提交
1442
					ubi_err("bad lnum or used_ebs");
A
Artem Bityutskiy 已提交
1443
					goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1444 1445
				}
			} else {
A
Artem Bityutskiy 已提交
1446
				if (av->used_ebs != 0) {
A
Artem B. Bityutskiy 已提交
1447
					ubi_err("non-zero used_ebs");
A
Artem Bityutskiy 已提交
1448
					goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1449 1450 1451
				}
			}

A
Artem Bityutskiy 已提交
1452
			if (aeb->lnum > av->highest_lnum) {
A
Artem B. Bityutskiy 已提交
1453
				ubi_err("incorrect highest_lnum or lnum");
A
Artem Bityutskiy 已提交
1454
				goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1455 1456 1457
			}
		}

A
Artem Bityutskiy 已提交
1458
		if (av->leb_count != leb_count) {
A
Artem B. Bityutskiy 已提交
1459 1460
			ubi_err("bad leb_count, %d objects in the tree",
				leb_count);
A
Artem Bityutskiy 已提交
1461
			goto bad_av;
A
Artem B. Bityutskiy 已提交
1462 1463
		}

A
Artem Bityutskiy 已提交
1464
		if (!last_aeb)
A
Artem B. Bityutskiy 已提交
1465 1466
			continue;

A
Artem Bityutskiy 已提交
1467
		aeb = last_aeb;
A
Artem B. Bityutskiy 已提交
1468

A
Artem Bityutskiy 已提交
1469
		if (aeb->lnum != av->highest_lnum) {
A
Artem B. Bityutskiy 已提交
1470
			ubi_err("bad highest_lnum");
A
Artem Bityutskiy 已提交
1471
			goto bad_aeb;
A
Artem B. Bityutskiy 已提交
1472 1473 1474
		}
	}

A
Artem Bityutskiy 已提交
1475 1476 1477
	if (vols_found != ai->vols_found) {
		ubi_err("bad ai->vols_found %d, should be %d",
			ai->vols_found, vols_found);
A
Artem B. Bityutskiy 已提交
1478 1479 1480
		goto out;
	}

A
Artem Bityutskiy 已提交
1481
	/* Check that attaching information is correct */
A
Artem Bityutskiy 已提交
1482
	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb) {
A
Artem Bityutskiy 已提交
1483
		last_aeb = NULL;
A
Artem Bityutskiy 已提交
1484
		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb) {
A
Artem B. Bityutskiy 已提交
1485 1486 1487 1488
			int vol_type;

			cond_resched();

A
Artem Bityutskiy 已提交
1489
			last_aeb = aeb;
A
Artem B. Bityutskiy 已提交
1490

A
Artem Bityutskiy 已提交
1491
			err = ubi_io_read_vid_hdr(ubi, aeb->pnum, vidh, 1);
A
Artem B. Bityutskiy 已提交
1492 1493 1494 1495 1496 1497 1498 1499 1500
			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;
A
Artem Bityutskiy 已提交
1501
			if (av->vol_type != vol_type) {
A
Artem B. Bityutskiy 已提交
1502 1503 1504 1505
				ubi_err("bad vol_type");
				goto bad_vid_hdr;
			}

A
Artem Bityutskiy 已提交
1506 1507
			if (aeb->sqnum != be64_to_cpu(vidh->sqnum)) {
				ubi_err("bad sqnum %llu", aeb->sqnum);
A
Artem B. Bityutskiy 已提交
1508 1509 1510
				goto bad_vid_hdr;
			}

A
Artem Bityutskiy 已提交
1511 1512
			if (av->vol_id != be32_to_cpu(vidh->vol_id)) {
				ubi_err("bad vol_id %d", av->vol_id);
A
Artem B. Bityutskiy 已提交
1513 1514 1515
				goto bad_vid_hdr;
			}

A
Artem Bityutskiy 已提交
1516
			if (av->compat != vidh->compat) {
A
Artem B. Bityutskiy 已提交
1517 1518 1519 1520
				ubi_err("bad compat %d", vidh->compat);
				goto bad_vid_hdr;
			}

A
Artem Bityutskiy 已提交
1521 1522
			if (aeb->lnum != be32_to_cpu(vidh->lnum)) {
				ubi_err("bad lnum %d", aeb->lnum);
A
Artem B. Bityutskiy 已提交
1523 1524 1525
				goto bad_vid_hdr;
			}

A
Artem Bityutskiy 已提交
1526 1527
			if (av->used_ebs != be32_to_cpu(vidh->used_ebs)) {
				ubi_err("bad used_ebs %d", av->used_ebs);
A
Artem B. Bityutskiy 已提交
1528 1529 1530
				goto bad_vid_hdr;
			}

A
Artem Bityutskiy 已提交
1531 1532
			if (av->data_pad != be32_to_cpu(vidh->data_pad)) {
				ubi_err("bad data_pad %d", av->data_pad);
A
Artem B. Bityutskiy 已提交
1533 1534 1535 1536
				goto bad_vid_hdr;
			}
		}

A
Artem Bityutskiy 已提交
1537
		if (!last_aeb)
A
Artem B. Bityutskiy 已提交
1538 1539
			continue;

A
Artem Bityutskiy 已提交
1540 1541
		if (av->highest_lnum != be32_to_cpu(vidh->lnum)) {
			ubi_err("bad highest_lnum %d", av->highest_lnum);
A
Artem B. Bityutskiy 已提交
1542 1543 1544
			goto bad_vid_hdr;
		}

A
Artem Bityutskiy 已提交
1545 1546
		if (av->last_data_size != be32_to_cpu(vidh->data_size)) {
			ubi_err("bad last_data_size %d", av->last_data_size);
A
Artem B. Bityutskiy 已提交
1547 1548 1549 1550 1551 1552 1553 1554
			goto bad_vid_hdr;
		}
	}

	/*
	 * Make sure that all the physical eraseblocks are in one of the lists
	 * or trees.
	 */
1555
	buf = kzalloc(ubi->peb_count, GFP_KERNEL);
A
Artem B. Bityutskiy 已提交
1556 1557 1558 1559 1560
	if (!buf)
		return -ENOMEM;

	for (pnum = 0; pnum < ubi->peb_count; pnum++) {
		err = ubi_io_is_bad(ubi, pnum);
1561 1562
		if (err < 0) {
			kfree(buf);
A
Artem B. Bityutskiy 已提交
1563
			return err;
1564
		} else if (err)
1565
			buf[pnum] = 1;
A
Artem B. Bityutskiy 已提交
1566 1567
	}

A
Artem Bityutskiy 已提交
1568 1569
	ubi_rb_for_each_entry(rb1, av, &ai->volumes, rb)
		ubi_rb_for_each_entry(rb2, aeb, &av->root, u.rb)
A
Artem Bityutskiy 已提交
1570
			buf[aeb->pnum] = 1;
A
Artem B. Bityutskiy 已提交
1571

A
Artem Bityutskiy 已提交
1572
	list_for_each_entry(aeb, &ai->free, u.list)
A
Artem Bityutskiy 已提交
1573
		buf[aeb->pnum] = 1;
A
Artem B. Bityutskiy 已提交
1574

A
Artem Bityutskiy 已提交
1575
	list_for_each_entry(aeb, &ai->corr, u.list)
A
Artem Bityutskiy 已提交
1576
		buf[aeb->pnum] = 1;
A
Artem B. Bityutskiy 已提交
1577

A
Artem Bityutskiy 已提交
1578
	list_for_each_entry(aeb, &ai->erase, u.list)
A
Artem Bityutskiy 已提交
1579
		buf[aeb->pnum] = 1;
A
Artem B. Bityutskiy 已提交
1580

A
Artem Bityutskiy 已提交
1581
	list_for_each_entry(aeb, &ai->alien, u.list)
A
Artem Bityutskiy 已提交
1582
		buf[aeb->pnum] = 1;
A
Artem B. Bityutskiy 已提交
1583 1584 1585

	err = 0;
	for (pnum = 0; pnum < ubi->peb_count; pnum++)
1586
		if (!buf[pnum]) {
A
Artem B. Bityutskiy 已提交
1587 1588 1589 1590 1591 1592 1593 1594 1595
			ubi_err("PEB %d is not referred", pnum);
			err = 1;
		}

	kfree(buf);
	if (err)
		goto out;
	return 0;

A
Artem Bityutskiy 已提交
1596
bad_aeb:
A
Artem Bityutskiy 已提交
1597
	ubi_err("bad attaching information about LEB %d", aeb->lnum);
A
Artem Bityutskiy 已提交
1598
	ubi_dump_aeb(aeb, 0);
A
Artem Bityutskiy 已提交
1599
	ubi_dump_av(av);
A
Artem B. Bityutskiy 已提交
1600 1601
	goto out;

A
Artem Bityutskiy 已提交
1602 1603 1604
bad_av:
	ubi_err("bad attaching information about volume %d", av->vol_id);
	ubi_dump_av(av);
A
Artem B. Bityutskiy 已提交
1605 1606 1607
	goto out;

bad_vid_hdr:
A
Artem Bityutskiy 已提交
1608 1609
	ubi_err("bad attaching information about volume %d", av->vol_id);
	ubi_dump_av(av);
1610
	ubi_dump_vid_hdr(vidh);
A
Artem B. Bityutskiy 已提交
1611 1612

out:
1613
	dump_stack();
1614
	return -EINVAL;
A
Artem B. Bityutskiy 已提交
1615
}