162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) International Business Machines Corp., 2006
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Artem Bityutskiy (Битюцкий Артём)
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci * The UBI Eraseblock Association (EBA) sub-system.
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * This sub-system is responsible for I/O to/from logical eraseblock.
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * Although in this implementation the EBA table is fully kept and managed in
1462306a36Sopenharmony_ci * RAM, which assumes poor scalability, it might be (partially) maintained on
1562306a36Sopenharmony_ci * flash in future implementations.
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * The EBA sub-system implements per-logical eraseblock locking. Before
1862306a36Sopenharmony_ci * accessing a logical eraseblock it is locked for reading or writing. The
1962306a36Sopenharmony_ci * per-logical eraseblock locking is implemented by means of the lock tree. The
2062306a36Sopenharmony_ci * lock tree is an RB-tree which refers all the currently locked logical
2162306a36Sopenharmony_ci * eraseblocks. The lock tree elements are &struct ubi_ltree_entry objects.
2262306a36Sopenharmony_ci * They are indexed by (@vol_id, @lnum) pairs.
2362306a36Sopenharmony_ci *
2462306a36Sopenharmony_ci * EBA also maintains the global sequence counter which is incremented each
2562306a36Sopenharmony_ci * time a logical eraseblock is mapped to a physical eraseblock and it is
2662306a36Sopenharmony_ci * stored in the volume identifier header. This means that each VID header has
2762306a36Sopenharmony_ci * a unique sequence number. The sequence number is only increased an we assume
2862306a36Sopenharmony_ci * 64 bits is enough to never overflow.
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#include <linux/slab.h>
3262306a36Sopenharmony_ci#include <linux/crc32.h>
3362306a36Sopenharmony_ci#include <linux/err.h>
3462306a36Sopenharmony_ci#include "ubi.h"
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* Number of physical eraseblocks reserved for atomic LEB change operation */
3762306a36Sopenharmony_ci#define EBA_RESERVED_PEBS 1
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/**
4062306a36Sopenharmony_ci * struct ubi_eba_entry - structure encoding a single LEB -> PEB association
4162306a36Sopenharmony_ci * @pnum: the physical eraseblock number attached to the LEB
4262306a36Sopenharmony_ci *
4362306a36Sopenharmony_ci * This structure is encoding a LEB -> PEB association. Note that the LEB
4462306a36Sopenharmony_ci * number is not stored here, because it is the index used to access the
4562306a36Sopenharmony_ci * entries table.
4662306a36Sopenharmony_ci */
4762306a36Sopenharmony_cistruct ubi_eba_entry {
4862306a36Sopenharmony_ci	int pnum;
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/**
5262306a36Sopenharmony_ci * struct ubi_eba_table - LEB -> PEB association information
5362306a36Sopenharmony_ci * @entries: the LEB to PEB mapping (one entry per LEB).
5462306a36Sopenharmony_ci *
5562306a36Sopenharmony_ci * This structure is private to the EBA logic and should be kept here.
5662306a36Sopenharmony_ci * It is encoding the LEB to PEB association table, and is subject to
5762306a36Sopenharmony_ci * changes.
5862306a36Sopenharmony_ci */
5962306a36Sopenharmony_cistruct ubi_eba_table {
6062306a36Sopenharmony_ci	struct ubi_eba_entry *entries;
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/**
6462306a36Sopenharmony_ci * ubi_next_sqnum - get next sequence number.
6562306a36Sopenharmony_ci * @ubi: UBI device description object
6662306a36Sopenharmony_ci *
6762306a36Sopenharmony_ci * This function returns next sequence number to use, which is just the current
6862306a36Sopenharmony_ci * global sequence counter value. It also increases the global sequence
6962306a36Sopenharmony_ci * counter.
7062306a36Sopenharmony_ci */
7162306a36Sopenharmony_ciunsigned long long ubi_next_sqnum(struct ubi_device *ubi)
7262306a36Sopenharmony_ci{
7362306a36Sopenharmony_ci	unsigned long long sqnum;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	spin_lock(&ubi->ltree_lock);
7662306a36Sopenharmony_ci	sqnum = ubi->global_sqnum++;
7762306a36Sopenharmony_ci	spin_unlock(&ubi->ltree_lock);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	return sqnum;
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci/**
8362306a36Sopenharmony_ci * ubi_get_compat - get compatibility flags of a volume.
8462306a36Sopenharmony_ci * @ubi: UBI device description object
8562306a36Sopenharmony_ci * @vol_id: volume ID
8662306a36Sopenharmony_ci *
8762306a36Sopenharmony_ci * This function returns compatibility flags for an internal volume. User
8862306a36Sopenharmony_ci * volumes have no compatibility flags, so %0 is returned.
8962306a36Sopenharmony_ci */
9062306a36Sopenharmony_cistatic int ubi_get_compat(const struct ubi_device *ubi, int vol_id)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	if (vol_id == UBI_LAYOUT_VOLUME_ID)
9362306a36Sopenharmony_ci		return UBI_LAYOUT_VOLUME_COMPAT;
9462306a36Sopenharmony_ci	return 0;
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/**
9862306a36Sopenharmony_ci * ubi_eba_get_ldesc - get information about a LEB
9962306a36Sopenharmony_ci * @vol: volume description object
10062306a36Sopenharmony_ci * @lnum: logical eraseblock number
10162306a36Sopenharmony_ci * @ldesc: the LEB descriptor to fill
10262306a36Sopenharmony_ci *
10362306a36Sopenharmony_ci * Used to query information about a specific LEB.
10462306a36Sopenharmony_ci * It is currently only returning the physical position of the LEB, but will be
10562306a36Sopenharmony_ci * extended to provide more information.
10662306a36Sopenharmony_ci */
10762306a36Sopenharmony_civoid ubi_eba_get_ldesc(struct ubi_volume *vol, int lnum,
10862306a36Sopenharmony_ci		       struct ubi_eba_leb_desc *ldesc)
10962306a36Sopenharmony_ci{
11062306a36Sopenharmony_ci	ldesc->lnum = lnum;
11162306a36Sopenharmony_ci	ldesc->pnum = vol->eba_tbl->entries[lnum].pnum;
11262306a36Sopenharmony_ci}
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci/**
11562306a36Sopenharmony_ci * ubi_eba_create_table - allocate a new EBA table and initialize it with all
11662306a36Sopenharmony_ci *			  LEBs unmapped
11762306a36Sopenharmony_ci * @vol: volume containing the EBA table to copy
11862306a36Sopenharmony_ci * @nentries: number of entries in the table
11962306a36Sopenharmony_ci *
12062306a36Sopenharmony_ci * Allocate a new EBA table and initialize it with all LEBs unmapped.
12162306a36Sopenharmony_ci * Returns a valid pointer if it succeed, an ERR_PTR() otherwise.
12262306a36Sopenharmony_ci */
12362306a36Sopenharmony_cistruct ubi_eba_table *ubi_eba_create_table(struct ubi_volume *vol,
12462306a36Sopenharmony_ci					   int nentries)
12562306a36Sopenharmony_ci{
12662306a36Sopenharmony_ci	struct ubi_eba_table *tbl;
12762306a36Sopenharmony_ci	int err = -ENOMEM;
12862306a36Sopenharmony_ci	int i;
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	tbl = kzalloc(sizeof(*tbl), GFP_KERNEL);
13162306a36Sopenharmony_ci	if (!tbl)
13262306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	tbl->entries = kmalloc_array(nentries, sizeof(*tbl->entries),
13562306a36Sopenharmony_ci				     GFP_KERNEL);
13662306a36Sopenharmony_ci	if (!tbl->entries)
13762306a36Sopenharmony_ci		goto err;
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	for (i = 0; i < nentries; i++)
14062306a36Sopenharmony_ci		tbl->entries[i].pnum = UBI_LEB_UNMAPPED;
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	return tbl;
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cierr:
14562306a36Sopenharmony_ci	kfree(tbl);
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	return ERR_PTR(err);
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci/**
15162306a36Sopenharmony_ci * ubi_eba_destroy_table - destroy an EBA table
15262306a36Sopenharmony_ci * @tbl: the table to destroy
15362306a36Sopenharmony_ci *
15462306a36Sopenharmony_ci * Destroy an EBA table.
15562306a36Sopenharmony_ci */
15662306a36Sopenharmony_civoid ubi_eba_destroy_table(struct ubi_eba_table *tbl)
15762306a36Sopenharmony_ci{
15862306a36Sopenharmony_ci	if (!tbl)
15962306a36Sopenharmony_ci		return;
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	kfree(tbl->entries);
16262306a36Sopenharmony_ci	kfree(tbl);
16362306a36Sopenharmony_ci}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci/**
16662306a36Sopenharmony_ci * ubi_eba_copy_table - copy the EBA table attached to vol into another table
16762306a36Sopenharmony_ci * @vol: volume containing the EBA table to copy
16862306a36Sopenharmony_ci * @dst: destination
16962306a36Sopenharmony_ci * @nentries: number of entries to copy
17062306a36Sopenharmony_ci *
17162306a36Sopenharmony_ci * Copy the EBA table stored in vol into the one pointed by dst.
17262306a36Sopenharmony_ci */
17362306a36Sopenharmony_civoid ubi_eba_copy_table(struct ubi_volume *vol, struct ubi_eba_table *dst,
17462306a36Sopenharmony_ci			int nentries)
17562306a36Sopenharmony_ci{
17662306a36Sopenharmony_ci	struct ubi_eba_table *src;
17762306a36Sopenharmony_ci	int i;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	ubi_assert(dst && vol && vol->eba_tbl);
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	src = vol->eba_tbl;
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	for (i = 0; i < nentries; i++)
18462306a36Sopenharmony_ci		dst->entries[i].pnum = src->entries[i].pnum;
18562306a36Sopenharmony_ci}
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/**
18862306a36Sopenharmony_ci * ubi_eba_replace_table - assign a new EBA table to a volume
18962306a36Sopenharmony_ci * @vol: volume containing the EBA table to copy
19062306a36Sopenharmony_ci * @tbl: new EBA table
19162306a36Sopenharmony_ci *
19262306a36Sopenharmony_ci * Assign a new EBA table to the volume and release the old one.
19362306a36Sopenharmony_ci */
19462306a36Sopenharmony_civoid ubi_eba_replace_table(struct ubi_volume *vol, struct ubi_eba_table *tbl)
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	ubi_eba_destroy_table(vol->eba_tbl);
19762306a36Sopenharmony_ci	vol->eba_tbl = tbl;
19862306a36Sopenharmony_ci}
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci/**
20162306a36Sopenharmony_ci * ltree_lookup - look up the lock tree.
20262306a36Sopenharmony_ci * @ubi: UBI device description object
20362306a36Sopenharmony_ci * @vol_id: volume ID
20462306a36Sopenharmony_ci * @lnum: logical eraseblock number
20562306a36Sopenharmony_ci *
20662306a36Sopenharmony_ci * This function returns a pointer to the corresponding &struct ubi_ltree_entry
20762306a36Sopenharmony_ci * object if the logical eraseblock is locked and %NULL if it is not.
20862306a36Sopenharmony_ci * @ubi->ltree_lock has to be locked.
20962306a36Sopenharmony_ci */
21062306a36Sopenharmony_cistatic struct ubi_ltree_entry *ltree_lookup(struct ubi_device *ubi, int vol_id,
21162306a36Sopenharmony_ci					    int lnum)
21262306a36Sopenharmony_ci{
21362306a36Sopenharmony_ci	struct rb_node *p;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	p = ubi->ltree.rb_node;
21662306a36Sopenharmony_ci	while (p) {
21762306a36Sopenharmony_ci		struct ubi_ltree_entry *le;
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci		le = rb_entry(p, struct ubi_ltree_entry, rb);
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci		if (vol_id < le->vol_id)
22262306a36Sopenharmony_ci			p = p->rb_left;
22362306a36Sopenharmony_ci		else if (vol_id > le->vol_id)
22462306a36Sopenharmony_ci			p = p->rb_right;
22562306a36Sopenharmony_ci		else {
22662306a36Sopenharmony_ci			if (lnum < le->lnum)
22762306a36Sopenharmony_ci				p = p->rb_left;
22862306a36Sopenharmony_ci			else if (lnum > le->lnum)
22962306a36Sopenharmony_ci				p = p->rb_right;
23062306a36Sopenharmony_ci			else
23162306a36Sopenharmony_ci				return le;
23262306a36Sopenharmony_ci		}
23362306a36Sopenharmony_ci	}
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	return NULL;
23662306a36Sopenharmony_ci}
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci/**
23962306a36Sopenharmony_ci * ltree_add_entry - add new entry to the lock tree.
24062306a36Sopenharmony_ci * @ubi: UBI device description object
24162306a36Sopenharmony_ci * @vol_id: volume ID
24262306a36Sopenharmony_ci * @lnum: logical eraseblock number
24362306a36Sopenharmony_ci *
24462306a36Sopenharmony_ci * This function adds new entry for logical eraseblock (@vol_id, @lnum) to the
24562306a36Sopenharmony_ci * lock tree. If such entry is already there, its usage counter is increased.
24662306a36Sopenharmony_ci * Returns pointer to the lock tree entry or %-ENOMEM if memory allocation
24762306a36Sopenharmony_ci * failed.
24862306a36Sopenharmony_ci */
24962306a36Sopenharmony_cistatic struct ubi_ltree_entry *ltree_add_entry(struct ubi_device *ubi,
25062306a36Sopenharmony_ci					       int vol_id, int lnum)
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	struct ubi_ltree_entry *le, *le1, *le_free;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	le = kmalloc(sizeof(struct ubi_ltree_entry), GFP_NOFS);
25562306a36Sopenharmony_ci	if (!le)
25662306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	le->users = 0;
25962306a36Sopenharmony_ci	init_rwsem(&le->mutex);
26062306a36Sopenharmony_ci	le->vol_id = vol_id;
26162306a36Sopenharmony_ci	le->lnum = lnum;
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	spin_lock(&ubi->ltree_lock);
26462306a36Sopenharmony_ci	le1 = ltree_lookup(ubi, vol_id, lnum);
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	if (le1) {
26762306a36Sopenharmony_ci		/*
26862306a36Sopenharmony_ci		 * This logical eraseblock is already locked. The newly
26962306a36Sopenharmony_ci		 * allocated lock entry is not needed.
27062306a36Sopenharmony_ci		 */
27162306a36Sopenharmony_ci		le_free = le;
27262306a36Sopenharmony_ci		le = le1;
27362306a36Sopenharmony_ci	} else {
27462306a36Sopenharmony_ci		struct rb_node **p, *parent = NULL;
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci		/*
27762306a36Sopenharmony_ci		 * No lock entry, add the newly allocated one to the
27862306a36Sopenharmony_ci		 * @ubi->ltree RB-tree.
27962306a36Sopenharmony_ci		 */
28062306a36Sopenharmony_ci		le_free = NULL;
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci		p = &ubi->ltree.rb_node;
28362306a36Sopenharmony_ci		while (*p) {
28462306a36Sopenharmony_ci			parent = *p;
28562306a36Sopenharmony_ci			le1 = rb_entry(parent, struct ubi_ltree_entry, rb);
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci			if (vol_id < le1->vol_id)
28862306a36Sopenharmony_ci				p = &(*p)->rb_left;
28962306a36Sopenharmony_ci			else if (vol_id > le1->vol_id)
29062306a36Sopenharmony_ci				p = &(*p)->rb_right;
29162306a36Sopenharmony_ci			else {
29262306a36Sopenharmony_ci				ubi_assert(lnum != le1->lnum);
29362306a36Sopenharmony_ci				if (lnum < le1->lnum)
29462306a36Sopenharmony_ci					p = &(*p)->rb_left;
29562306a36Sopenharmony_ci				else
29662306a36Sopenharmony_ci					p = &(*p)->rb_right;
29762306a36Sopenharmony_ci			}
29862306a36Sopenharmony_ci		}
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci		rb_link_node(&le->rb, parent, p);
30162306a36Sopenharmony_ci		rb_insert_color(&le->rb, &ubi->ltree);
30262306a36Sopenharmony_ci	}
30362306a36Sopenharmony_ci	le->users += 1;
30462306a36Sopenharmony_ci	spin_unlock(&ubi->ltree_lock);
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	kfree(le_free);
30762306a36Sopenharmony_ci	return le;
30862306a36Sopenharmony_ci}
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci/**
31162306a36Sopenharmony_ci * leb_read_lock - lock logical eraseblock for reading.
31262306a36Sopenharmony_ci * @ubi: UBI device description object
31362306a36Sopenharmony_ci * @vol_id: volume ID
31462306a36Sopenharmony_ci * @lnum: logical eraseblock number
31562306a36Sopenharmony_ci *
31662306a36Sopenharmony_ci * This function locks a logical eraseblock for reading. Returns zero in case
31762306a36Sopenharmony_ci * of success and a negative error code in case of failure.
31862306a36Sopenharmony_ci */
31962306a36Sopenharmony_cistatic int leb_read_lock(struct ubi_device *ubi, int vol_id, int lnum)
32062306a36Sopenharmony_ci{
32162306a36Sopenharmony_ci	struct ubi_ltree_entry *le;
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci	le = ltree_add_entry(ubi, vol_id, lnum);
32462306a36Sopenharmony_ci	if (IS_ERR(le))
32562306a36Sopenharmony_ci		return PTR_ERR(le);
32662306a36Sopenharmony_ci	down_read(&le->mutex);
32762306a36Sopenharmony_ci	return 0;
32862306a36Sopenharmony_ci}
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci/**
33162306a36Sopenharmony_ci * leb_read_unlock - unlock logical eraseblock.
33262306a36Sopenharmony_ci * @ubi: UBI device description object
33362306a36Sopenharmony_ci * @vol_id: volume ID
33462306a36Sopenharmony_ci * @lnum: logical eraseblock number
33562306a36Sopenharmony_ci */
33662306a36Sopenharmony_cistatic void leb_read_unlock(struct ubi_device *ubi, int vol_id, int lnum)
33762306a36Sopenharmony_ci{
33862306a36Sopenharmony_ci	struct ubi_ltree_entry *le;
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	spin_lock(&ubi->ltree_lock);
34162306a36Sopenharmony_ci	le = ltree_lookup(ubi, vol_id, lnum);
34262306a36Sopenharmony_ci	le->users -= 1;
34362306a36Sopenharmony_ci	ubi_assert(le->users >= 0);
34462306a36Sopenharmony_ci	up_read(&le->mutex);
34562306a36Sopenharmony_ci	if (le->users == 0) {
34662306a36Sopenharmony_ci		rb_erase(&le->rb, &ubi->ltree);
34762306a36Sopenharmony_ci		kfree(le);
34862306a36Sopenharmony_ci	}
34962306a36Sopenharmony_ci	spin_unlock(&ubi->ltree_lock);
35062306a36Sopenharmony_ci}
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci/**
35362306a36Sopenharmony_ci * leb_write_lock - lock logical eraseblock for writing.
35462306a36Sopenharmony_ci * @ubi: UBI device description object
35562306a36Sopenharmony_ci * @vol_id: volume ID
35662306a36Sopenharmony_ci * @lnum: logical eraseblock number
35762306a36Sopenharmony_ci *
35862306a36Sopenharmony_ci * This function locks a logical eraseblock for writing. Returns zero in case
35962306a36Sopenharmony_ci * of success and a negative error code in case of failure.
36062306a36Sopenharmony_ci */
36162306a36Sopenharmony_cistatic int leb_write_lock(struct ubi_device *ubi, int vol_id, int lnum)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	struct ubi_ltree_entry *le;
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	le = ltree_add_entry(ubi, vol_id, lnum);
36662306a36Sopenharmony_ci	if (IS_ERR(le))
36762306a36Sopenharmony_ci		return PTR_ERR(le);
36862306a36Sopenharmony_ci	down_write(&le->mutex);
36962306a36Sopenharmony_ci	return 0;
37062306a36Sopenharmony_ci}
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci/**
37362306a36Sopenharmony_ci * leb_write_trylock - try to lock logical eraseblock for writing.
37462306a36Sopenharmony_ci * @ubi: UBI device description object
37562306a36Sopenharmony_ci * @vol_id: volume ID
37662306a36Sopenharmony_ci * @lnum: logical eraseblock number
37762306a36Sopenharmony_ci *
37862306a36Sopenharmony_ci * This function locks a logical eraseblock for writing if there is no
37962306a36Sopenharmony_ci * contention and does nothing if there is contention. Returns %0 in case of
38062306a36Sopenharmony_ci * success, %1 in case of contention, and a negative error code in case of
38162306a36Sopenharmony_ci * failure.
38262306a36Sopenharmony_ci */
38362306a36Sopenharmony_cistatic int leb_write_trylock(struct ubi_device *ubi, int vol_id, int lnum)
38462306a36Sopenharmony_ci{
38562306a36Sopenharmony_ci	struct ubi_ltree_entry *le;
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	le = ltree_add_entry(ubi, vol_id, lnum);
38862306a36Sopenharmony_ci	if (IS_ERR(le))
38962306a36Sopenharmony_ci		return PTR_ERR(le);
39062306a36Sopenharmony_ci	if (down_write_trylock(&le->mutex))
39162306a36Sopenharmony_ci		return 0;
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci	/* Contention, cancel */
39462306a36Sopenharmony_ci	spin_lock(&ubi->ltree_lock);
39562306a36Sopenharmony_ci	le->users -= 1;
39662306a36Sopenharmony_ci	ubi_assert(le->users >= 0);
39762306a36Sopenharmony_ci	if (le->users == 0) {
39862306a36Sopenharmony_ci		rb_erase(&le->rb, &ubi->ltree);
39962306a36Sopenharmony_ci		kfree(le);
40062306a36Sopenharmony_ci	}
40162306a36Sopenharmony_ci	spin_unlock(&ubi->ltree_lock);
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	return 1;
40462306a36Sopenharmony_ci}
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci/**
40762306a36Sopenharmony_ci * leb_write_unlock - unlock logical eraseblock.
40862306a36Sopenharmony_ci * @ubi: UBI device description object
40962306a36Sopenharmony_ci * @vol_id: volume ID
41062306a36Sopenharmony_ci * @lnum: logical eraseblock number
41162306a36Sopenharmony_ci */
41262306a36Sopenharmony_cistatic void leb_write_unlock(struct ubi_device *ubi, int vol_id, int lnum)
41362306a36Sopenharmony_ci{
41462306a36Sopenharmony_ci	struct ubi_ltree_entry *le;
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci	spin_lock(&ubi->ltree_lock);
41762306a36Sopenharmony_ci	le = ltree_lookup(ubi, vol_id, lnum);
41862306a36Sopenharmony_ci	le->users -= 1;
41962306a36Sopenharmony_ci	ubi_assert(le->users >= 0);
42062306a36Sopenharmony_ci	up_write(&le->mutex);
42162306a36Sopenharmony_ci	if (le->users == 0) {
42262306a36Sopenharmony_ci		rb_erase(&le->rb, &ubi->ltree);
42362306a36Sopenharmony_ci		kfree(le);
42462306a36Sopenharmony_ci	}
42562306a36Sopenharmony_ci	spin_unlock(&ubi->ltree_lock);
42662306a36Sopenharmony_ci}
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci/**
42962306a36Sopenharmony_ci * ubi_eba_is_mapped - check if a LEB is mapped.
43062306a36Sopenharmony_ci * @vol: volume description object
43162306a36Sopenharmony_ci * @lnum: logical eraseblock number
43262306a36Sopenharmony_ci *
43362306a36Sopenharmony_ci * This function returns true if the LEB is mapped, false otherwise.
43462306a36Sopenharmony_ci */
43562306a36Sopenharmony_cibool ubi_eba_is_mapped(struct ubi_volume *vol, int lnum)
43662306a36Sopenharmony_ci{
43762306a36Sopenharmony_ci	return vol->eba_tbl->entries[lnum].pnum >= 0;
43862306a36Sopenharmony_ci}
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci/**
44162306a36Sopenharmony_ci * ubi_eba_unmap_leb - un-map logical eraseblock.
44262306a36Sopenharmony_ci * @ubi: UBI device description object
44362306a36Sopenharmony_ci * @vol: volume description object
44462306a36Sopenharmony_ci * @lnum: logical eraseblock number
44562306a36Sopenharmony_ci *
44662306a36Sopenharmony_ci * This function un-maps logical eraseblock @lnum and schedules corresponding
44762306a36Sopenharmony_ci * physical eraseblock for erasure. Returns zero in case of success and a
44862306a36Sopenharmony_ci * negative error code in case of failure.
44962306a36Sopenharmony_ci */
45062306a36Sopenharmony_ciint ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol,
45162306a36Sopenharmony_ci		      int lnum)
45262306a36Sopenharmony_ci{
45362306a36Sopenharmony_ci	int err, pnum, vol_id = vol->vol_id;
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci	if (ubi->ro_mode)
45662306a36Sopenharmony_ci		return -EROFS;
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci	err = leb_write_lock(ubi, vol_id, lnum);
45962306a36Sopenharmony_ci	if (err)
46062306a36Sopenharmony_ci		return err;
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci	pnum = vol->eba_tbl->entries[lnum].pnum;
46362306a36Sopenharmony_ci	if (pnum < 0)
46462306a36Sopenharmony_ci		/* This logical eraseblock is already unmapped */
46562306a36Sopenharmony_ci		goto out_unlock;
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	dbg_eba("erase LEB %d:%d, PEB %d", vol_id, lnum, pnum);
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	down_read(&ubi->fm_eba_sem);
47062306a36Sopenharmony_ci	vol->eba_tbl->entries[lnum].pnum = UBI_LEB_UNMAPPED;
47162306a36Sopenharmony_ci	up_read(&ubi->fm_eba_sem);
47262306a36Sopenharmony_ci	err = ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 0);
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ciout_unlock:
47562306a36Sopenharmony_ci	leb_write_unlock(ubi, vol_id, lnum);
47662306a36Sopenharmony_ci	return err;
47762306a36Sopenharmony_ci}
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci#ifdef CONFIG_MTD_UBI_FASTMAP
48062306a36Sopenharmony_ci/**
48162306a36Sopenharmony_ci * check_mapping - check and fixup a mapping
48262306a36Sopenharmony_ci * @ubi: UBI device description object
48362306a36Sopenharmony_ci * @vol: volume description object
48462306a36Sopenharmony_ci * @lnum: logical eraseblock number
48562306a36Sopenharmony_ci * @pnum: physical eraseblock number
48662306a36Sopenharmony_ci *
48762306a36Sopenharmony_ci * Checks whether a given mapping is valid. Fastmap cannot track LEB unmap
48862306a36Sopenharmony_ci * operations, if such an operation is interrupted the mapping still looks
48962306a36Sopenharmony_ci * good, but upon first read an ECC is reported to the upper layer.
49062306a36Sopenharmony_ci * Normaly during the full-scan at attach time this is fixed, for Fastmap
49162306a36Sopenharmony_ci * we have to deal with it while reading.
49262306a36Sopenharmony_ci * If the PEB behind a LEB shows this symthom we change the mapping to
49362306a36Sopenharmony_ci * %UBI_LEB_UNMAPPED and schedule the PEB for erasure.
49462306a36Sopenharmony_ci *
49562306a36Sopenharmony_ci * Returns 0 on success, negative error code in case of failure.
49662306a36Sopenharmony_ci */
49762306a36Sopenharmony_cistatic int check_mapping(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
49862306a36Sopenharmony_ci			 int *pnum)
49962306a36Sopenharmony_ci{
50062306a36Sopenharmony_ci	int err;
50162306a36Sopenharmony_ci	struct ubi_vid_io_buf *vidb;
50262306a36Sopenharmony_ci	struct ubi_vid_hdr *vid_hdr;
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci	if (!ubi->fast_attach)
50562306a36Sopenharmony_ci		return 0;
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci	if (!vol->checkmap || test_bit(lnum, vol->checkmap))
50862306a36Sopenharmony_ci		return 0;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	vidb = ubi_alloc_vid_buf(ubi, GFP_NOFS);
51162306a36Sopenharmony_ci	if (!vidb)
51262306a36Sopenharmony_ci		return -ENOMEM;
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_ci	err = ubi_io_read_vid_hdr(ubi, *pnum, vidb, 0);
51562306a36Sopenharmony_ci	if (err > 0 && err != UBI_IO_BITFLIPS) {
51662306a36Sopenharmony_ci		int torture = 0;
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci		switch (err) {
51962306a36Sopenharmony_ci			case UBI_IO_FF:
52062306a36Sopenharmony_ci			case UBI_IO_FF_BITFLIPS:
52162306a36Sopenharmony_ci			case UBI_IO_BAD_HDR:
52262306a36Sopenharmony_ci			case UBI_IO_BAD_HDR_EBADMSG:
52362306a36Sopenharmony_ci				break;
52462306a36Sopenharmony_ci			default:
52562306a36Sopenharmony_ci				ubi_assert(0);
52662306a36Sopenharmony_ci		}
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci		if (err == UBI_IO_BAD_HDR_EBADMSG || err == UBI_IO_FF_BITFLIPS)
52962306a36Sopenharmony_ci			torture = 1;
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci		down_read(&ubi->fm_eba_sem);
53262306a36Sopenharmony_ci		vol->eba_tbl->entries[lnum].pnum = UBI_LEB_UNMAPPED;
53362306a36Sopenharmony_ci		up_read(&ubi->fm_eba_sem);
53462306a36Sopenharmony_ci		ubi_wl_put_peb(ubi, vol->vol_id, lnum, *pnum, torture);
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci		*pnum = UBI_LEB_UNMAPPED;
53762306a36Sopenharmony_ci	} else if (err < 0) {
53862306a36Sopenharmony_ci		ubi_err(ubi, "unable to read VID header back from PEB %i: %i",
53962306a36Sopenharmony_ci			*pnum, err);
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci		goto out_free;
54262306a36Sopenharmony_ci	} else {
54362306a36Sopenharmony_ci		int found_vol_id, found_lnum;
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci		ubi_assert(err == 0 || err == UBI_IO_BITFLIPS);
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci		vid_hdr = ubi_get_vid_hdr(vidb);
54862306a36Sopenharmony_ci		found_vol_id = be32_to_cpu(vid_hdr->vol_id);
54962306a36Sopenharmony_ci		found_lnum = be32_to_cpu(vid_hdr->lnum);
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci		if (found_lnum != lnum || found_vol_id != vol->vol_id) {
55262306a36Sopenharmony_ci			ubi_err(ubi, "EBA mismatch! PEB %i is LEB %i:%i instead of LEB %i:%i",
55362306a36Sopenharmony_ci				*pnum, found_vol_id, found_lnum, vol->vol_id, lnum);
55462306a36Sopenharmony_ci			ubi_ro_mode(ubi);
55562306a36Sopenharmony_ci			err = -EINVAL;
55662306a36Sopenharmony_ci			goto out_free;
55762306a36Sopenharmony_ci		}
55862306a36Sopenharmony_ci	}
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci	set_bit(lnum, vol->checkmap);
56162306a36Sopenharmony_ci	err = 0;
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ciout_free:
56462306a36Sopenharmony_ci	ubi_free_vid_buf(vidb);
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci	return err;
56762306a36Sopenharmony_ci}
56862306a36Sopenharmony_ci#else
56962306a36Sopenharmony_cistatic int check_mapping(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
57062306a36Sopenharmony_ci		  int *pnum)
57162306a36Sopenharmony_ci{
57262306a36Sopenharmony_ci	return 0;
57362306a36Sopenharmony_ci}
57462306a36Sopenharmony_ci#endif
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci/**
57762306a36Sopenharmony_ci * ubi_eba_read_leb - read data.
57862306a36Sopenharmony_ci * @ubi: UBI device description object
57962306a36Sopenharmony_ci * @vol: volume description object
58062306a36Sopenharmony_ci * @lnum: logical eraseblock number
58162306a36Sopenharmony_ci * @buf: buffer to store the read data
58262306a36Sopenharmony_ci * @offset: offset from where to read
58362306a36Sopenharmony_ci * @len: how many bytes to read
58462306a36Sopenharmony_ci * @check: data CRC check flag
58562306a36Sopenharmony_ci *
58662306a36Sopenharmony_ci * If the logical eraseblock @lnum is unmapped, @buf is filled with 0xFF
58762306a36Sopenharmony_ci * bytes. The @check flag only makes sense for static volumes and forces
58862306a36Sopenharmony_ci * eraseblock data CRC checking.
58962306a36Sopenharmony_ci *
59062306a36Sopenharmony_ci * In case of success this function returns zero. In case of a static volume,
59162306a36Sopenharmony_ci * if data CRC mismatches - %-EBADMSG is returned. %-EBADMSG may also be
59262306a36Sopenharmony_ci * returned for any volume type if an ECC error was detected by the MTD device
59362306a36Sopenharmony_ci * driver. Other negative error cored may be returned in case of other errors.
59462306a36Sopenharmony_ci */
59562306a36Sopenharmony_ciint ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
59662306a36Sopenharmony_ci		     void *buf, int offset, int len, int check)
59762306a36Sopenharmony_ci{
59862306a36Sopenharmony_ci	int err, pnum, scrub = 0, vol_id = vol->vol_id;
59962306a36Sopenharmony_ci	struct ubi_vid_io_buf *vidb;
60062306a36Sopenharmony_ci	struct ubi_vid_hdr *vid_hdr;
60162306a36Sopenharmony_ci	uint32_t crc;
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci	err = leb_read_lock(ubi, vol_id, lnum);
60462306a36Sopenharmony_ci	if (err)
60562306a36Sopenharmony_ci		return err;
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci	pnum = vol->eba_tbl->entries[lnum].pnum;
60862306a36Sopenharmony_ci	if (pnum >= 0) {
60962306a36Sopenharmony_ci		err = check_mapping(ubi, vol, lnum, &pnum);
61062306a36Sopenharmony_ci		if (err < 0)
61162306a36Sopenharmony_ci			goto out_unlock;
61262306a36Sopenharmony_ci	}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci	if (pnum == UBI_LEB_UNMAPPED) {
61562306a36Sopenharmony_ci		/*
61662306a36Sopenharmony_ci		 * The logical eraseblock is not mapped, fill the whole buffer
61762306a36Sopenharmony_ci		 * with 0xFF bytes. The exception is static volumes for which
61862306a36Sopenharmony_ci		 * it is an error to read unmapped logical eraseblocks.
61962306a36Sopenharmony_ci		 */
62062306a36Sopenharmony_ci		dbg_eba("read %d bytes from offset %d of LEB %d:%d (unmapped)",
62162306a36Sopenharmony_ci			len, offset, vol_id, lnum);
62262306a36Sopenharmony_ci		leb_read_unlock(ubi, vol_id, lnum);
62362306a36Sopenharmony_ci		ubi_assert(vol->vol_type != UBI_STATIC_VOLUME);
62462306a36Sopenharmony_ci		memset(buf, 0xFF, len);
62562306a36Sopenharmony_ci		return 0;
62662306a36Sopenharmony_ci	}
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci	dbg_eba("read %d bytes from offset %d of LEB %d:%d, PEB %d",
62962306a36Sopenharmony_ci		len, offset, vol_id, lnum, pnum);
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci	if (vol->vol_type == UBI_DYNAMIC_VOLUME)
63262306a36Sopenharmony_ci		check = 0;
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ciretry:
63562306a36Sopenharmony_ci	if (check) {
63662306a36Sopenharmony_ci		vidb = ubi_alloc_vid_buf(ubi, GFP_NOFS);
63762306a36Sopenharmony_ci		if (!vidb) {
63862306a36Sopenharmony_ci			err = -ENOMEM;
63962306a36Sopenharmony_ci			goto out_unlock;
64062306a36Sopenharmony_ci		}
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci		vid_hdr = ubi_get_vid_hdr(vidb);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci		err = ubi_io_read_vid_hdr(ubi, pnum, vidb, 1);
64562306a36Sopenharmony_ci		if (err && err != UBI_IO_BITFLIPS) {
64662306a36Sopenharmony_ci			if (err > 0) {
64762306a36Sopenharmony_ci				/*
64862306a36Sopenharmony_ci				 * The header is either absent or corrupted.
64962306a36Sopenharmony_ci				 * The former case means there is a bug -
65062306a36Sopenharmony_ci				 * switch to read-only mode just in case.
65162306a36Sopenharmony_ci				 * The latter case means a real corruption - we
65262306a36Sopenharmony_ci				 * may try to recover data. FIXME: but this is
65362306a36Sopenharmony_ci				 * not implemented.
65462306a36Sopenharmony_ci				 */
65562306a36Sopenharmony_ci				if (err == UBI_IO_BAD_HDR_EBADMSG ||
65662306a36Sopenharmony_ci				    err == UBI_IO_BAD_HDR) {
65762306a36Sopenharmony_ci					ubi_warn(ubi, "corrupted VID header at PEB %d, LEB %d:%d",
65862306a36Sopenharmony_ci						 pnum, vol_id, lnum);
65962306a36Sopenharmony_ci					err = -EBADMSG;
66062306a36Sopenharmony_ci				} else {
66162306a36Sopenharmony_ci					/*
66262306a36Sopenharmony_ci					 * Ending up here in the non-Fastmap case
66362306a36Sopenharmony_ci					 * is a clear bug as the VID header had to
66462306a36Sopenharmony_ci					 * be present at scan time to have it referenced.
66562306a36Sopenharmony_ci					 * With fastmap the story is more complicated.
66662306a36Sopenharmony_ci					 * Fastmap has the mapping info without the need
66762306a36Sopenharmony_ci					 * of a full scan. So the LEB could have been
66862306a36Sopenharmony_ci					 * unmapped, Fastmap cannot know this and keeps
66962306a36Sopenharmony_ci					 * the LEB referenced.
67062306a36Sopenharmony_ci					 * This is valid and works as the layer above UBI
67162306a36Sopenharmony_ci					 * has to do bookkeeping about used/referenced
67262306a36Sopenharmony_ci					 * LEBs in any case.
67362306a36Sopenharmony_ci					 */
67462306a36Sopenharmony_ci					if (ubi->fast_attach) {
67562306a36Sopenharmony_ci						err = -EBADMSG;
67662306a36Sopenharmony_ci					} else {
67762306a36Sopenharmony_ci						err = -EINVAL;
67862306a36Sopenharmony_ci						ubi_ro_mode(ubi);
67962306a36Sopenharmony_ci					}
68062306a36Sopenharmony_ci				}
68162306a36Sopenharmony_ci			}
68262306a36Sopenharmony_ci			goto out_free;
68362306a36Sopenharmony_ci		} else if (err == UBI_IO_BITFLIPS)
68462306a36Sopenharmony_ci			scrub = 1;
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci		ubi_assert(lnum < be32_to_cpu(vid_hdr->used_ebs));
68762306a36Sopenharmony_ci		ubi_assert(len == be32_to_cpu(vid_hdr->data_size));
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci		crc = be32_to_cpu(vid_hdr->data_crc);
69062306a36Sopenharmony_ci		ubi_free_vid_buf(vidb);
69162306a36Sopenharmony_ci	}
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci	err = ubi_io_read_data(ubi, buf, pnum, offset, len);
69462306a36Sopenharmony_ci	if (err) {
69562306a36Sopenharmony_ci		if (err == UBI_IO_BITFLIPS)
69662306a36Sopenharmony_ci			scrub = 1;
69762306a36Sopenharmony_ci		else if (mtd_is_eccerr(err)) {
69862306a36Sopenharmony_ci			if (vol->vol_type == UBI_DYNAMIC_VOLUME)
69962306a36Sopenharmony_ci				goto out_unlock;
70062306a36Sopenharmony_ci			scrub = 1;
70162306a36Sopenharmony_ci			if (!check) {
70262306a36Sopenharmony_ci				ubi_msg(ubi, "force data checking");
70362306a36Sopenharmony_ci				check = 1;
70462306a36Sopenharmony_ci				goto retry;
70562306a36Sopenharmony_ci			}
70662306a36Sopenharmony_ci		} else
70762306a36Sopenharmony_ci			goto out_unlock;
70862306a36Sopenharmony_ci	}
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_ci	if (check) {
71162306a36Sopenharmony_ci		uint32_t crc1 = crc32(UBI_CRC32_INIT, buf, len);
71262306a36Sopenharmony_ci		if (crc1 != crc) {
71362306a36Sopenharmony_ci			ubi_warn(ubi, "CRC error: calculated %#08x, must be %#08x",
71462306a36Sopenharmony_ci				 crc1, crc);
71562306a36Sopenharmony_ci			err = -EBADMSG;
71662306a36Sopenharmony_ci			goto out_unlock;
71762306a36Sopenharmony_ci		}
71862306a36Sopenharmony_ci	}
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_ci	if (scrub)
72162306a36Sopenharmony_ci		err = ubi_wl_scrub_peb(ubi, pnum);
72262306a36Sopenharmony_ci
72362306a36Sopenharmony_ci	leb_read_unlock(ubi, vol_id, lnum);
72462306a36Sopenharmony_ci	return err;
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ciout_free:
72762306a36Sopenharmony_ci	ubi_free_vid_buf(vidb);
72862306a36Sopenharmony_ciout_unlock:
72962306a36Sopenharmony_ci	leb_read_unlock(ubi, vol_id, lnum);
73062306a36Sopenharmony_ci	return err;
73162306a36Sopenharmony_ci}
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci/**
73462306a36Sopenharmony_ci * ubi_eba_read_leb_sg - read data into a scatter gather list.
73562306a36Sopenharmony_ci * @ubi: UBI device description object
73662306a36Sopenharmony_ci * @vol: volume description object
73762306a36Sopenharmony_ci * @lnum: logical eraseblock number
73862306a36Sopenharmony_ci * @sgl: UBI scatter gather list to store the read data
73962306a36Sopenharmony_ci * @offset: offset from where to read
74062306a36Sopenharmony_ci * @len: how many bytes to read
74162306a36Sopenharmony_ci * @check: data CRC check flag
74262306a36Sopenharmony_ci *
74362306a36Sopenharmony_ci * This function works exactly like ubi_eba_read_leb(). But instead of
74462306a36Sopenharmony_ci * storing the read data into a buffer it writes to an UBI scatter gather
74562306a36Sopenharmony_ci * list.
74662306a36Sopenharmony_ci */
74762306a36Sopenharmony_ciint ubi_eba_read_leb_sg(struct ubi_device *ubi, struct ubi_volume *vol,
74862306a36Sopenharmony_ci			struct ubi_sgl *sgl, int lnum, int offset, int len,
74962306a36Sopenharmony_ci			int check)
75062306a36Sopenharmony_ci{
75162306a36Sopenharmony_ci	int to_read;
75262306a36Sopenharmony_ci	int ret;
75362306a36Sopenharmony_ci	struct scatterlist *sg;
75462306a36Sopenharmony_ci
75562306a36Sopenharmony_ci	for (;;) {
75662306a36Sopenharmony_ci		ubi_assert(sgl->list_pos < UBI_MAX_SG_COUNT);
75762306a36Sopenharmony_ci		sg = &sgl->sg[sgl->list_pos];
75862306a36Sopenharmony_ci		if (len < sg->length - sgl->page_pos)
75962306a36Sopenharmony_ci			to_read = len;
76062306a36Sopenharmony_ci		else
76162306a36Sopenharmony_ci			to_read = sg->length - sgl->page_pos;
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci		ret = ubi_eba_read_leb(ubi, vol, lnum,
76462306a36Sopenharmony_ci				       sg_virt(sg) + sgl->page_pos, offset,
76562306a36Sopenharmony_ci				       to_read, check);
76662306a36Sopenharmony_ci		if (ret < 0)
76762306a36Sopenharmony_ci			return ret;
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_ci		offset += to_read;
77062306a36Sopenharmony_ci		len -= to_read;
77162306a36Sopenharmony_ci		if (!len) {
77262306a36Sopenharmony_ci			sgl->page_pos += to_read;
77362306a36Sopenharmony_ci			if (sgl->page_pos == sg->length) {
77462306a36Sopenharmony_ci				sgl->list_pos++;
77562306a36Sopenharmony_ci				sgl->page_pos = 0;
77662306a36Sopenharmony_ci			}
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci			break;
77962306a36Sopenharmony_ci		}
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci		sgl->list_pos++;
78262306a36Sopenharmony_ci		sgl->page_pos = 0;
78362306a36Sopenharmony_ci	}
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_ci	return ret;
78662306a36Sopenharmony_ci}
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci/**
78962306a36Sopenharmony_ci * try_recover_peb - try to recover from write failure.
79062306a36Sopenharmony_ci * @vol: volume description object
79162306a36Sopenharmony_ci * @pnum: the physical eraseblock to recover
79262306a36Sopenharmony_ci * @lnum: logical eraseblock number
79362306a36Sopenharmony_ci * @buf: data which was not written because of the write failure
79462306a36Sopenharmony_ci * @offset: offset of the failed write
79562306a36Sopenharmony_ci * @len: how many bytes should have been written
79662306a36Sopenharmony_ci * @vidb: VID buffer
79762306a36Sopenharmony_ci * @retry: whether the caller should retry in case of failure
79862306a36Sopenharmony_ci *
79962306a36Sopenharmony_ci * This function is called in case of a write failure and moves all good data
80062306a36Sopenharmony_ci * from the potentially bad physical eraseblock to a good physical eraseblock.
80162306a36Sopenharmony_ci * This function also writes the data which was not written due to the failure.
80262306a36Sopenharmony_ci * Returns 0 in case of success, and a negative error code in case of failure.
80362306a36Sopenharmony_ci * In case of failure, the %retry parameter is set to false if this is a fatal
80462306a36Sopenharmony_ci * error (retrying won't help), and true otherwise.
80562306a36Sopenharmony_ci */
80662306a36Sopenharmony_cistatic int try_recover_peb(struct ubi_volume *vol, int pnum, int lnum,
80762306a36Sopenharmony_ci			   const void *buf, int offset, int len,
80862306a36Sopenharmony_ci			   struct ubi_vid_io_buf *vidb, bool *retry)
80962306a36Sopenharmony_ci{
81062306a36Sopenharmony_ci	struct ubi_device *ubi = vol->ubi;
81162306a36Sopenharmony_ci	struct ubi_vid_hdr *vid_hdr;
81262306a36Sopenharmony_ci	int new_pnum, err, vol_id = vol->vol_id, data_size;
81362306a36Sopenharmony_ci	uint32_t crc;
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci	*retry = false;
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_ci	new_pnum = ubi_wl_get_peb(ubi);
81862306a36Sopenharmony_ci	if (new_pnum < 0) {
81962306a36Sopenharmony_ci		err = new_pnum;
82062306a36Sopenharmony_ci		goto out_put;
82162306a36Sopenharmony_ci	}
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	ubi_msg(ubi, "recover PEB %d, move data to PEB %d",
82462306a36Sopenharmony_ci		pnum, new_pnum);
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci	err = ubi_io_read_vid_hdr(ubi, pnum, vidb, 1);
82762306a36Sopenharmony_ci	if (err && err != UBI_IO_BITFLIPS) {
82862306a36Sopenharmony_ci		if (err > 0)
82962306a36Sopenharmony_ci			err = -EIO;
83062306a36Sopenharmony_ci		goto out_put;
83162306a36Sopenharmony_ci	}
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci	vid_hdr = ubi_get_vid_hdr(vidb);
83462306a36Sopenharmony_ci	ubi_assert(vid_hdr->vol_type == UBI_VID_DYNAMIC);
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci	mutex_lock(&ubi->buf_mutex);
83762306a36Sopenharmony_ci	memset(ubi->peb_buf + offset, 0xFF, len);
83862306a36Sopenharmony_ci
83962306a36Sopenharmony_ci	/* Read everything before the area where the write failure happened */
84062306a36Sopenharmony_ci	if (offset > 0) {
84162306a36Sopenharmony_ci		err = ubi_io_read_data(ubi, ubi->peb_buf, pnum, 0, offset);
84262306a36Sopenharmony_ci		if (err && err != UBI_IO_BITFLIPS)
84362306a36Sopenharmony_ci			goto out_unlock;
84462306a36Sopenharmony_ci	}
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci	*retry = true;
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ci	memcpy(ubi->peb_buf + offset, buf, len);
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci	data_size = offset + len;
85162306a36Sopenharmony_ci	crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, data_size);
85262306a36Sopenharmony_ci	vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
85362306a36Sopenharmony_ci	vid_hdr->copy_flag = 1;
85462306a36Sopenharmony_ci	vid_hdr->data_size = cpu_to_be32(data_size);
85562306a36Sopenharmony_ci	vid_hdr->data_crc = cpu_to_be32(crc);
85662306a36Sopenharmony_ci	err = ubi_io_write_vid_hdr(ubi, new_pnum, vidb);
85762306a36Sopenharmony_ci	if (err)
85862306a36Sopenharmony_ci		goto out_unlock;
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	err = ubi_io_write_data(ubi, ubi->peb_buf, new_pnum, 0, data_size);
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_ciout_unlock:
86362306a36Sopenharmony_ci	mutex_unlock(&ubi->buf_mutex);
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_ci	if (!err)
86662306a36Sopenharmony_ci		vol->eba_tbl->entries[lnum].pnum = new_pnum;
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_ciout_put:
86962306a36Sopenharmony_ci	up_read(&ubi->fm_eba_sem);
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_ci	if (!err) {
87262306a36Sopenharmony_ci		ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 1);
87362306a36Sopenharmony_ci		ubi_msg(ubi, "data was successfully recovered");
87462306a36Sopenharmony_ci	} else if (new_pnum >= 0) {
87562306a36Sopenharmony_ci		/*
87662306a36Sopenharmony_ci		 * Bad luck? This physical eraseblock is bad too? Crud. Let's
87762306a36Sopenharmony_ci		 * try to get another one.
87862306a36Sopenharmony_ci		 */
87962306a36Sopenharmony_ci		ubi_wl_put_peb(ubi, vol_id, lnum, new_pnum, 1);
88062306a36Sopenharmony_ci		ubi_warn(ubi, "failed to write to PEB %d", new_pnum);
88162306a36Sopenharmony_ci	}
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	return err;
88462306a36Sopenharmony_ci}
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_ci/**
88762306a36Sopenharmony_ci * recover_peb - recover from write failure.
88862306a36Sopenharmony_ci * @ubi: UBI device description object
88962306a36Sopenharmony_ci * @pnum: the physical eraseblock to recover
89062306a36Sopenharmony_ci * @vol_id: volume ID
89162306a36Sopenharmony_ci * @lnum: logical eraseblock number
89262306a36Sopenharmony_ci * @buf: data which was not written because of the write failure
89362306a36Sopenharmony_ci * @offset: offset of the failed write
89462306a36Sopenharmony_ci * @len: how many bytes should have been written
89562306a36Sopenharmony_ci *
89662306a36Sopenharmony_ci * This function is called in case of a write failure and moves all good data
89762306a36Sopenharmony_ci * from the potentially bad physical eraseblock to a good physical eraseblock.
89862306a36Sopenharmony_ci * This function also writes the data which was not written due to the failure.
89962306a36Sopenharmony_ci * Returns 0 in case of success, and a negative error code in case of failure.
90062306a36Sopenharmony_ci * This function tries %UBI_IO_RETRIES before giving up.
90162306a36Sopenharmony_ci */
90262306a36Sopenharmony_cistatic int recover_peb(struct ubi_device *ubi, int pnum, int vol_id, int lnum,
90362306a36Sopenharmony_ci		       const void *buf, int offset, int len)
90462306a36Sopenharmony_ci{
90562306a36Sopenharmony_ci	int err, idx = vol_id2idx(ubi, vol_id), tries;
90662306a36Sopenharmony_ci	struct ubi_volume *vol = ubi->volumes[idx];
90762306a36Sopenharmony_ci	struct ubi_vid_io_buf *vidb;
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci	vidb = ubi_alloc_vid_buf(ubi, GFP_NOFS);
91062306a36Sopenharmony_ci	if (!vidb)
91162306a36Sopenharmony_ci		return -ENOMEM;
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_ci	for (tries = 0; tries <= UBI_IO_RETRIES; tries++) {
91462306a36Sopenharmony_ci		bool retry;
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci		err = try_recover_peb(vol, pnum, lnum, buf, offset, len, vidb,
91762306a36Sopenharmony_ci				      &retry);
91862306a36Sopenharmony_ci		if (!err || !retry)
91962306a36Sopenharmony_ci			break;
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_ci		ubi_msg(ubi, "try again");
92262306a36Sopenharmony_ci	}
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_ci	ubi_free_vid_buf(vidb);
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci	return err;
92762306a36Sopenharmony_ci}
92862306a36Sopenharmony_ci
92962306a36Sopenharmony_ci/**
93062306a36Sopenharmony_ci * try_write_vid_and_data - try to write VID header and data to a new PEB.
93162306a36Sopenharmony_ci * @vol: volume description object
93262306a36Sopenharmony_ci * @lnum: logical eraseblock number
93362306a36Sopenharmony_ci * @vidb: the VID buffer to write
93462306a36Sopenharmony_ci * @buf: buffer containing the data
93562306a36Sopenharmony_ci * @offset: where to start writing data
93662306a36Sopenharmony_ci * @len: how many bytes should be written
93762306a36Sopenharmony_ci *
93862306a36Sopenharmony_ci * This function tries to write VID header and data belonging to logical
93962306a36Sopenharmony_ci * eraseblock @lnum of volume @vol to a new physical eraseblock. Returns zero
94062306a36Sopenharmony_ci * in case of success and a negative error code in case of failure.
94162306a36Sopenharmony_ci * In case of error, it is possible that something was still written to the
94262306a36Sopenharmony_ci * flash media, but may be some garbage.
94362306a36Sopenharmony_ci */
94462306a36Sopenharmony_cistatic int try_write_vid_and_data(struct ubi_volume *vol, int lnum,
94562306a36Sopenharmony_ci				  struct ubi_vid_io_buf *vidb, const void *buf,
94662306a36Sopenharmony_ci				  int offset, int len)
94762306a36Sopenharmony_ci{
94862306a36Sopenharmony_ci	struct ubi_device *ubi = vol->ubi;
94962306a36Sopenharmony_ci	int pnum, opnum, err, err2, vol_id = vol->vol_id;
95062306a36Sopenharmony_ci
95162306a36Sopenharmony_ci	pnum = ubi_wl_get_peb(ubi);
95262306a36Sopenharmony_ci	if (pnum < 0) {
95362306a36Sopenharmony_ci		err = pnum;
95462306a36Sopenharmony_ci		goto out_put;
95562306a36Sopenharmony_ci	}
95662306a36Sopenharmony_ci
95762306a36Sopenharmony_ci	opnum = vol->eba_tbl->entries[lnum].pnum;
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_ci	dbg_eba("write VID hdr and %d bytes at offset %d of LEB %d:%d, PEB %d",
96062306a36Sopenharmony_ci		len, offset, vol_id, lnum, pnum);
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_ci	err = ubi_io_write_vid_hdr(ubi, pnum, vidb);
96362306a36Sopenharmony_ci	if (err) {
96462306a36Sopenharmony_ci		ubi_warn(ubi, "failed to write VID header to LEB %d:%d, PEB %d",
96562306a36Sopenharmony_ci			 vol_id, lnum, pnum);
96662306a36Sopenharmony_ci		goto out_put;
96762306a36Sopenharmony_ci	}
96862306a36Sopenharmony_ci
96962306a36Sopenharmony_ci	if (len) {
97062306a36Sopenharmony_ci		err = ubi_io_write_data(ubi, buf, pnum, offset, len);
97162306a36Sopenharmony_ci		if (err) {
97262306a36Sopenharmony_ci			ubi_warn(ubi,
97362306a36Sopenharmony_ci				 "failed to write %d bytes at offset %d of LEB %d:%d, PEB %d",
97462306a36Sopenharmony_ci				 len, offset, vol_id, lnum, pnum);
97562306a36Sopenharmony_ci			goto out_put;
97662306a36Sopenharmony_ci		}
97762306a36Sopenharmony_ci	}
97862306a36Sopenharmony_ci
97962306a36Sopenharmony_ci	vol->eba_tbl->entries[lnum].pnum = pnum;
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ciout_put:
98262306a36Sopenharmony_ci	up_read(&ubi->fm_eba_sem);
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_ci	if (err && pnum >= 0) {
98562306a36Sopenharmony_ci		err2 = ubi_wl_put_peb(ubi, vol_id, lnum, pnum, 1);
98662306a36Sopenharmony_ci		if (err2) {
98762306a36Sopenharmony_ci			ubi_warn(ubi, "failed to return physical eraseblock %d, error %d",
98862306a36Sopenharmony_ci				 pnum, err2);
98962306a36Sopenharmony_ci		}
99062306a36Sopenharmony_ci	} else if (!err && opnum >= 0) {
99162306a36Sopenharmony_ci		err2 = ubi_wl_put_peb(ubi, vol_id, lnum, opnum, 0);
99262306a36Sopenharmony_ci		if (err2) {
99362306a36Sopenharmony_ci			ubi_warn(ubi, "failed to return physical eraseblock %d, error %d",
99462306a36Sopenharmony_ci				 opnum, err2);
99562306a36Sopenharmony_ci		}
99662306a36Sopenharmony_ci	}
99762306a36Sopenharmony_ci
99862306a36Sopenharmony_ci	return err;
99962306a36Sopenharmony_ci}
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ci/**
100262306a36Sopenharmony_ci * ubi_eba_write_leb - write data to dynamic volume.
100362306a36Sopenharmony_ci * @ubi: UBI device description object
100462306a36Sopenharmony_ci * @vol: volume description object
100562306a36Sopenharmony_ci * @lnum: logical eraseblock number
100662306a36Sopenharmony_ci * @buf: the data to write
100762306a36Sopenharmony_ci * @offset: offset within the logical eraseblock where to write
100862306a36Sopenharmony_ci * @len: how many bytes to write
100962306a36Sopenharmony_ci *
101062306a36Sopenharmony_ci * This function writes data to logical eraseblock @lnum of a dynamic volume
101162306a36Sopenharmony_ci * @vol. Returns zero in case of success and a negative error code in case
101262306a36Sopenharmony_ci * of failure. In case of error, it is possible that something was still
101362306a36Sopenharmony_ci * written to the flash media, but may be some garbage.
101462306a36Sopenharmony_ci * This function retries %UBI_IO_RETRIES times before giving up.
101562306a36Sopenharmony_ci */
101662306a36Sopenharmony_ciint ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
101762306a36Sopenharmony_ci		      const void *buf, int offset, int len)
101862306a36Sopenharmony_ci{
101962306a36Sopenharmony_ci	int err, pnum, tries, vol_id = vol->vol_id;
102062306a36Sopenharmony_ci	struct ubi_vid_io_buf *vidb;
102162306a36Sopenharmony_ci	struct ubi_vid_hdr *vid_hdr;
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_ci	if (ubi->ro_mode)
102462306a36Sopenharmony_ci		return -EROFS;
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	err = leb_write_lock(ubi, vol_id, lnum);
102762306a36Sopenharmony_ci	if (err)
102862306a36Sopenharmony_ci		return err;
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	pnum = vol->eba_tbl->entries[lnum].pnum;
103162306a36Sopenharmony_ci	if (pnum >= 0) {
103262306a36Sopenharmony_ci		err = check_mapping(ubi, vol, lnum, &pnum);
103362306a36Sopenharmony_ci		if (err < 0)
103462306a36Sopenharmony_ci			goto out;
103562306a36Sopenharmony_ci	}
103662306a36Sopenharmony_ci
103762306a36Sopenharmony_ci	if (pnum >= 0) {
103862306a36Sopenharmony_ci		dbg_eba("write %d bytes at offset %d of LEB %d:%d, PEB %d",
103962306a36Sopenharmony_ci			len, offset, vol_id, lnum, pnum);
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_ci		err = ubi_io_write_data(ubi, buf, pnum, offset, len);
104262306a36Sopenharmony_ci		if (err) {
104362306a36Sopenharmony_ci			ubi_warn(ubi, "failed to write data to PEB %d", pnum);
104462306a36Sopenharmony_ci			if (err == -EIO && ubi->bad_allowed)
104562306a36Sopenharmony_ci				err = recover_peb(ubi, pnum, vol_id, lnum, buf,
104662306a36Sopenharmony_ci						  offset, len);
104762306a36Sopenharmony_ci		}
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_ci		goto out;
105062306a36Sopenharmony_ci	}
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci	/*
105362306a36Sopenharmony_ci	 * The logical eraseblock is not mapped. We have to get a free physical
105462306a36Sopenharmony_ci	 * eraseblock and write the volume identifier header there first.
105562306a36Sopenharmony_ci	 */
105662306a36Sopenharmony_ci	vidb = ubi_alloc_vid_buf(ubi, GFP_NOFS);
105762306a36Sopenharmony_ci	if (!vidb) {
105862306a36Sopenharmony_ci		leb_write_unlock(ubi, vol_id, lnum);
105962306a36Sopenharmony_ci		return -ENOMEM;
106062306a36Sopenharmony_ci	}
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci	vid_hdr = ubi_get_vid_hdr(vidb);
106362306a36Sopenharmony_ci
106462306a36Sopenharmony_ci	vid_hdr->vol_type = UBI_VID_DYNAMIC;
106562306a36Sopenharmony_ci	vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
106662306a36Sopenharmony_ci	vid_hdr->vol_id = cpu_to_be32(vol_id);
106762306a36Sopenharmony_ci	vid_hdr->lnum = cpu_to_be32(lnum);
106862306a36Sopenharmony_ci	vid_hdr->compat = ubi_get_compat(ubi, vol_id);
106962306a36Sopenharmony_ci	vid_hdr->data_pad = cpu_to_be32(vol->data_pad);
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci	for (tries = 0; tries <= UBI_IO_RETRIES; tries++) {
107262306a36Sopenharmony_ci		err = try_write_vid_and_data(vol, lnum, vidb, buf, offset, len);
107362306a36Sopenharmony_ci		if (err != -EIO || !ubi->bad_allowed)
107462306a36Sopenharmony_ci			break;
107562306a36Sopenharmony_ci
107662306a36Sopenharmony_ci		/*
107762306a36Sopenharmony_ci		 * Fortunately, this is the first write operation to this
107862306a36Sopenharmony_ci		 * physical eraseblock, so just put it and request a new one.
107962306a36Sopenharmony_ci		 * We assume that if this physical eraseblock went bad, the
108062306a36Sopenharmony_ci		 * erase code will handle that.
108162306a36Sopenharmony_ci		 */
108262306a36Sopenharmony_ci		vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
108362306a36Sopenharmony_ci		ubi_msg(ubi, "try another PEB");
108462306a36Sopenharmony_ci	}
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_ci	ubi_free_vid_buf(vidb);
108762306a36Sopenharmony_ci
108862306a36Sopenharmony_ciout:
108962306a36Sopenharmony_ci	if (err)
109062306a36Sopenharmony_ci		ubi_ro_mode(ubi);
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci	leb_write_unlock(ubi, vol_id, lnum);
109362306a36Sopenharmony_ci
109462306a36Sopenharmony_ci	return err;
109562306a36Sopenharmony_ci}
109662306a36Sopenharmony_ci
109762306a36Sopenharmony_ci/**
109862306a36Sopenharmony_ci * ubi_eba_write_leb_st - write data to static volume.
109962306a36Sopenharmony_ci * @ubi: UBI device description object
110062306a36Sopenharmony_ci * @vol: volume description object
110162306a36Sopenharmony_ci * @lnum: logical eraseblock number
110262306a36Sopenharmony_ci * @buf: data to write
110362306a36Sopenharmony_ci * @len: how many bytes to write
110462306a36Sopenharmony_ci * @used_ebs: how many logical eraseblocks will this volume contain
110562306a36Sopenharmony_ci *
110662306a36Sopenharmony_ci * This function writes data to logical eraseblock @lnum of static volume
110762306a36Sopenharmony_ci * @vol. The @used_ebs argument should contain total number of logical
110862306a36Sopenharmony_ci * eraseblock in this static volume.
110962306a36Sopenharmony_ci *
111062306a36Sopenharmony_ci * When writing to the last logical eraseblock, the @len argument doesn't have
111162306a36Sopenharmony_ci * to be aligned to the minimal I/O unit size. Instead, it has to be equivalent
111262306a36Sopenharmony_ci * to the real data size, although the @buf buffer has to contain the
111362306a36Sopenharmony_ci * alignment. In all other cases, @len has to be aligned.
111462306a36Sopenharmony_ci *
111562306a36Sopenharmony_ci * It is prohibited to write more than once to logical eraseblocks of static
111662306a36Sopenharmony_ci * volumes. This function returns zero in case of success and a negative error
111762306a36Sopenharmony_ci * code in case of failure.
111862306a36Sopenharmony_ci */
111962306a36Sopenharmony_ciint ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol,
112062306a36Sopenharmony_ci			 int lnum, const void *buf, int len, int used_ebs)
112162306a36Sopenharmony_ci{
112262306a36Sopenharmony_ci	int err, tries, data_size = len, vol_id = vol->vol_id;
112362306a36Sopenharmony_ci	struct ubi_vid_io_buf *vidb;
112462306a36Sopenharmony_ci	struct ubi_vid_hdr *vid_hdr;
112562306a36Sopenharmony_ci	uint32_t crc;
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci	if (ubi->ro_mode)
112862306a36Sopenharmony_ci		return -EROFS;
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ci	if (lnum == used_ebs - 1)
113162306a36Sopenharmony_ci		/* If this is the last LEB @len may be unaligned */
113262306a36Sopenharmony_ci		len = ALIGN(data_size, ubi->min_io_size);
113362306a36Sopenharmony_ci	else
113462306a36Sopenharmony_ci		ubi_assert(!(len & (ubi->min_io_size - 1)));
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_ci	vidb = ubi_alloc_vid_buf(ubi, GFP_NOFS);
113762306a36Sopenharmony_ci	if (!vidb)
113862306a36Sopenharmony_ci		return -ENOMEM;
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_ci	vid_hdr = ubi_get_vid_hdr(vidb);
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_ci	err = leb_write_lock(ubi, vol_id, lnum);
114362306a36Sopenharmony_ci	if (err)
114462306a36Sopenharmony_ci		goto out;
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
114762306a36Sopenharmony_ci	vid_hdr->vol_id = cpu_to_be32(vol_id);
114862306a36Sopenharmony_ci	vid_hdr->lnum = cpu_to_be32(lnum);
114962306a36Sopenharmony_ci	vid_hdr->compat = ubi_get_compat(ubi, vol_id);
115062306a36Sopenharmony_ci	vid_hdr->data_pad = cpu_to_be32(vol->data_pad);
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_ci	crc = crc32(UBI_CRC32_INIT, buf, data_size);
115362306a36Sopenharmony_ci	vid_hdr->vol_type = UBI_VID_STATIC;
115462306a36Sopenharmony_ci	vid_hdr->data_size = cpu_to_be32(data_size);
115562306a36Sopenharmony_ci	vid_hdr->used_ebs = cpu_to_be32(used_ebs);
115662306a36Sopenharmony_ci	vid_hdr->data_crc = cpu_to_be32(crc);
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci	ubi_assert(vol->eba_tbl->entries[lnum].pnum < 0);
115962306a36Sopenharmony_ci
116062306a36Sopenharmony_ci	for (tries = 0; tries <= UBI_IO_RETRIES; tries++) {
116162306a36Sopenharmony_ci		err = try_write_vid_and_data(vol, lnum, vidb, buf, 0, len);
116262306a36Sopenharmony_ci		if (err != -EIO || !ubi->bad_allowed)
116362306a36Sopenharmony_ci			break;
116462306a36Sopenharmony_ci
116562306a36Sopenharmony_ci		vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
116662306a36Sopenharmony_ci		ubi_msg(ubi, "try another PEB");
116762306a36Sopenharmony_ci	}
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_ci	if (err)
117062306a36Sopenharmony_ci		ubi_ro_mode(ubi);
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci	leb_write_unlock(ubi, vol_id, lnum);
117362306a36Sopenharmony_ci
117462306a36Sopenharmony_ciout:
117562306a36Sopenharmony_ci	ubi_free_vid_buf(vidb);
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ci	return err;
117862306a36Sopenharmony_ci}
117962306a36Sopenharmony_ci
118062306a36Sopenharmony_ci/*
118162306a36Sopenharmony_ci * ubi_eba_atomic_leb_change - change logical eraseblock atomically.
118262306a36Sopenharmony_ci * @ubi: UBI device description object
118362306a36Sopenharmony_ci * @vol: volume description object
118462306a36Sopenharmony_ci * @lnum: logical eraseblock number
118562306a36Sopenharmony_ci * @buf: data to write
118662306a36Sopenharmony_ci * @len: how many bytes to write
118762306a36Sopenharmony_ci *
118862306a36Sopenharmony_ci * This function changes the contents of a logical eraseblock atomically. @buf
118962306a36Sopenharmony_ci * has to contain new logical eraseblock data, and @len - the length of the
119062306a36Sopenharmony_ci * data, which has to be aligned. This function guarantees that in case of an
119162306a36Sopenharmony_ci * unclean reboot the old contents is preserved. Returns zero in case of
119262306a36Sopenharmony_ci * success and a negative error code in case of failure.
119362306a36Sopenharmony_ci *
119462306a36Sopenharmony_ci * UBI reserves one LEB for the "atomic LEB change" operation, so only one
119562306a36Sopenharmony_ci * LEB change may be done at a time. This is ensured by @ubi->alc_mutex.
119662306a36Sopenharmony_ci */
119762306a36Sopenharmony_ciint ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
119862306a36Sopenharmony_ci			      int lnum, const void *buf, int len)
119962306a36Sopenharmony_ci{
120062306a36Sopenharmony_ci	int err, tries, vol_id = vol->vol_id;
120162306a36Sopenharmony_ci	struct ubi_vid_io_buf *vidb;
120262306a36Sopenharmony_ci	struct ubi_vid_hdr *vid_hdr;
120362306a36Sopenharmony_ci	uint32_t crc;
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci	if (ubi->ro_mode)
120662306a36Sopenharmony_ci		return -EROFS;
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_ci	if (len == 0) {
120962306a36Sopenharmony_ci		/*
121062306a36Sopenharmony_ci		 * Special case when data length is zero. In this case the LEB
121162306a36Sopenharmony_ci		 * has to be unmapped and mapped somewhere else.
121262306a36Sopenharmony_ci		 */
121362306a36Sopenharmony_ci		err = ubi_eba_unmap_leb(ubi, vol, lnum);
121462306a36Sopenharmony_ci		if (err)
121562306a36Sopenharmony_ci			return err;
121662306a36Sopenharmony_ci		return ubi_eba_write_leb(ubi, vol, lnum, NULL, 0, 0);
121762306a36Sopenharmony_ci	}
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_ci	vidb = ubi_alloc_vid_buf(ubi, GFP_NOFS);
122062306a36Sopenharmony_ci	if (!vidb)
122162306a36Sopenharmony_ci		return -ENOMEM;
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_ci	vid_hdr = ubi_get_vid_hdr(vidb);
122462306a36Sopenharmony_ci
122562306a36Sopenharmony_ci	mutex_lock(&ubi->alc_mutex);
122662306a36Sopenharmony_ci	err = leb_write_lock(ubi, vol_id, lnum);
122762306a36Sopenharmony_ci	if (err)
122862306a36Sopenharmony_ci		goto out_mutex;
122962306a36Sopenharmony_ci
123062306a36Sopenharmony_ci	vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
123162306a36Sopenharmony_ci	vid_hdr->vol_id = cpu_to_be32(vol_id);
123262306a36Sopenharmony_ci	vid_hdr->lnum = cpu_to_be32(lnum);
123362306a36Sopenharmony_ci	vid_hdr->compat = ubi_get_compat(ubi, vol_id);
123462306a36Sopenharmony_ci	vid_hdr->data_pad = cpu_to_be32(vol->data_pad);
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_ci	crc = crc32(UBI_CRC32_INIT, buf, len);
123762306a36Sopenharmony_ci	vid_hdr->vol_type = UBI_VID_DYNAMIC;
123862306a36Sopenharmony_ci	vid_hdr->data_size = cpu_to_be32(len);
123962306a36Sopenharmony_ci	vid_hdr->copy_flag = 1;
124062306a36Sopenharmony_ci	vid_hdr->data_crc = cpu_to_be32(crc);
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci	dbg_eba("change LEB %d:%d", vol_id, lnum);
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_ci	for (tries = 0; tries <= UBI_IO_RETRIES; tries++) {
124562306a36Sopenharmony_ci		err = try_write_vid_and_data(vol, lnum, vidb, buf, 0, len);
124662306a36Sopenharmony_ci		if (err != -EIO || !ubi->bad_allowed)
124762306a36Sopenharmony_ci			break;
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci		vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
125062306a36Sopenharmony_ci		ubi_msg(ubi, "try another PEB");
125162306a36Sopenharmony_ci	}
125262306a36Sopenharmony_ci
125362306a36Sopenharmony_ci	/*
125462306a36Sopenharmony_ci	 * This flash device does not admit of bad eraseblocks or
125562306a36Sopenharmony_ci	 * something nasty and unexpected happened. Switch to read-only
125662306a36Sopenharmony_ci	 * mode just in case.
125762306a36Sopenharmony_ci	 */
125862306a36Sopenharmony_ci	if (err)
125962306a36Sopenharmony_ci		ubi_ro_mode(ubi);
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_ci	leb_write_unlock(ubi, vol_id, lnum);
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ciout_mutex:
126462306a36Sopenharmony_ci	mutex_unlock(&ubi->alc_mutex);
126562306a36Sopenharmony_ci	ubi_free_vid_buf(vidb);
126662306a36Sopenharmony_ci	return err;
126762306a36Sopenharmony_ci}
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci/**
127062306a36Sopenharmony_ci * is_error_sane - check whether a read error is sane.
127162306a36Sopenharmony_ci * @err: code of the error happened during reading
127262306a36Sopenharmony_ci *
127362306a36Sopenharmony_ci * This is a helper function for 'ubi_eba_copy_leb()' which is called when we
127462306a36Sopenharmony_ci * cannot read data from the target PEB (an error @err happened). If the error
127562306a36Sopenharmony_ci * code is sane, then we treat this error as non-fatal. Otherwise the error is
127662306a36Sopenharmony_ci * fatal and UBI will be switched to R/O mode later.
127762306a36Sopenharmony_ci *
127862306a36Sopenharmony_ci * The idea is that we try not to switch to R/O mode if the read error is
127962306a36Sopenharmony_ci * something which suggests there was a real read problem. E.g., %-EIO. Or a
128062306a36Sopenharmony_ci * memory allocation failed (-%ENOMEM). Otherwise, it is safer to switch to R/O
128162306a36Sopenharmony_ci * mode, simply because we do not know what happened at the MTD level, and we
128262306a36Sopenharmony_ci * cannot handle this. E.g., the underlying driver may have become crazy, and
128362306a36Sopenharmony_ci * it is safer to switch to R/O mode to preserve the data.
128462306a36Sopenharmony_ci *
128562306a36Sopenharmony_ci * And bear in mind, this is about reading from the target PEB, i.e. the PEB
128662306a36Sopenharmony_ci * which we have just written.
128762306a36Sopenharmony_ci */
128862306a36Sopenharmony_cistatic int is_error_sane(int err)
128962306a36Sopenharmony_ci{
129062306a36Sopenharmony_ci	if (err == -EIO || err == -ENOMEM || err == UBI_IO_BAD_HDR ||
129162306a36Sopenharmony_ci	    err == UBI_IO_BAD_HDR_EBADMSG || err == -ETIMEDOUT)
129262306a36Sopenharmony_ci		return 0;
129362306a36Sopenharmony_ci	return 1;
129462306a36Sopenharmony_ci}
129562306a36Sopenharmony_ci
129662306a36Sopenharmony_ci/**
129762306a36Sopenharmony_ci * ubi_eba_copy_leb - copy logical eraseblock.
129862306a36Sopenharmony_ci * @ubi: UBI device description object
129962306a36Sopenharmony_ci * @from: physical eraseblock number from where to copy
130062306a36Sopenharmony_ci * @to: physical eraseblock number where to copy
130162306a36Sopenharmony_ci * @vidb: data structure from where the VID header is derived
130262306a36Sopenharmony_ci *
130362306a36Sopenharmony_ci * This function copies logical eraseblock from physical eraseblock @from to
130462306a36Sopenharmony_ci * physical eraseblock @to. The @vid_hdr buffer may be changed by this
130562306a36Sopenharmony_ci * function. Returns:
130662306a36Sopenharmony_ci *   o %0 in case of success;
130762306a36Sopenharmony_ci *   o %MOVE_CANCEL_RACE, %MOVE_TARGET_WR_ERR, %MOVE_TARGET_BITFLIPS, etc;
130862306a36Sopenharmony_ci *   o a negative error code in case of failure.
130962306a36Sopenharmony_ci */
131062306a36Sopenharmony_ciint ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
131162306a36Sopenharmony_ci		     struct ubi_vid_io_buf *vidb)
131262306a36Sopenharmony_ci{
131362306a36Sopenharmony_ci	int err, vol_id, lnum, data_size, aldata_size, idx;
131462306a36Sopenharmony_ci	struct ubi_vid_hdr *vid_hdr = ubi_get_vid_hdr(vidb);
131562306a36Sopenharmony_ci	struct ubi_volume *vol;
131662306a36Sopenharmony_ci	uint32_t crc;
131762306a36Sopenharmony_ci
131862306a36Sopenharmony_ci	ubi_assert(rwsem_is_locked(&ubi->fm_eba_sem));
131962306a36Sopenharmony_ci
132062306a36Sopenharmony_ci	vol_id = be32_to_cpu(vid_hdr->vol_id);
132162306a36Sopenharmony_ci	lnum = be32_to_cpu(vid_hdr->lnum);
132262306a36Sopenharmony_ci
132362306a36Sopenharmony_ci	dbg_wl("copy LEB %d:%d, PEB %d to PEB %d", vol_id, lnum, from, to);
132462306a36Sopenharmony_ci
132562306a36Sopenharmony_ci	if (vid_hdr->vol_type == UBI_VID_STATIC) {
132662306a36Sopenharmony_ci		data_size = be32_to_cpu(vid_hdr->data_size);
132762306a36Sopenharmony_ci		aldata_size = ALIGN(data_size, ubi->min_io_size);
132862306a36Sopenharmony_ci	} else
132962306a36Sopenharmony_ci		data_size = aldata_size =
133062306a36Sopenharmony_ci			    ubi->leb_size - be32_to_cpu(vid_hdr->data_pad);
133162306a36Sopenharmony_ci
133262306a36Sopenharmony_ci	idx = vol_id2idx(ubi, vol_id);
133362306a36Sopenharmony_ci	spin_lock(&ubi->volumes_lock);
133462306a36Sopenharmony_ci	/*
133562306a36Sopenharmony_ci	 * Note, we may race with volume deletion, which means that the volume
133662306a36Sopenharmony_ci	 * this logical eraseblock belongs to might be being deleted. Since the
133762306a36Sopenharmony_ci	 * volume deletion un-maps all the volume's logical eraseblocks, it will
133862306a36Sopenharmony_ci	 * be locked in 'ubi_wl_put_peb()' and wait for the WL worker to finish.
133962306a36Sopenharmony_ci	 */
134062306a36Sopenharmony_ci	vol = ubi->volumes[idx];
134162306a36Sopenharmony_ci	spin_unlock(&ubi->volumes_lock);
134262306a36Sopenharmony_ci	if (!vol) {
134362306a36Sopenharmony_ci		/* No need to do further work, cancel */
134462306a36Sopenharmony_ci		dbg_wl("volume %d is being removed, cancel", vol_id);
134562306a36Sopenharmony_ci		return MOVE_CANCEL_RACE;
134662306a36Sopenharmony_ci	}
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_ci	/*
134962306a36Sopenharmony_ci	 * We do not want anybody to write to this logical eraseblock while we
135062306a36Sopenharmony_ci	 * are moving it, so lock it.
135162306a36Sopenharmony_ci	 *
135262306a36Sopenharmony_ci	 * Note, we are using non-waiting locking here, because we cannot sleep
135362306a36Sopenharmony_ci	 * on the LEB, since it may cause deadlocks. Indeed, imagine a task is
135462306a36Sopenharmony_ci	 * unmapping the LEB which is mapped to the PEB we are going to move
135562306a36Sopenharmony_ci	 * (@from). This task locks the LEB and goes sleep in the
135662306a36Sopenharmony_ci	 * 'ubi_wl_put_peb()' function on the @ubi->move_mutex. In turn, we are
135762306a36Sopenharmony_ci	 * holding @ubi->move_mutex and go sleep on the LEB lock. So, if the
135862306a36Sopenharmony_ci	 * LEB is already locked, we just do not move it and return
135962306a36Sopenharmony_ci	 * %MOVE_RETRY. Note, we do not return %MOVE_CANCEL_RACE here because
136062306a36Sopenharmony_ci	 * we do not know the reasons of the contention - it may be just a
136162306a36Sopenharmony_ci	 * normal I/O on this LEB, so we want to re-try.
136262306a36Sopenharmony_ci	 */
136362306a36Sopenharmony_ci	err = leb_write_trylock(ubi, vol_id, lnum);
136462306a36Sopenharmony_ci	if (err) {
136562306a36Sopenharmony_ci		dbg_wl("contention on LEB %d:%d, cancel", vol_id, lnum);
136662306a36Sopenharmony_ci		return MOVE_RETRY;
136762306a36Sopenharmony_ci	}
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_ci	/*
137062306a36Sopenharmony_ci	 * The LEB might have been put meanwhile, and the task which put it is
137162306a36Sopenharmony_ci	 * probably waiting on @ubi->move_mutex. No need to continue the work,
137262306a36Sopenharmony_ci	 * cancel it.
137362306a36Sopenharmony_ci	 */
137462306a36Sopenharmony_ci	if (vol->eba_tbl->entries[lnum].pnum != from) {
137562306a36Sopenharmony_ci		dbg_wl("LEB %d:%d is no longer mapped to PEB %d, mapped to PEB %d, cancel",
137662306a36Sopenharmony_ci		       vol_id, lnum, from, vol->eba_tbl->entries[lnum].pnum);
137762306a36Sopenharmony_ci		err = MOVE_CANCEL_RACE;
137862306a36Sopenharmony_ci		goto out_unlock_leb;
137962306a36Sopenharmony_ci	}
138062306a36Sopenharmony_ci
138162306a36Sopenharmony_ci	/*
138262306a36Sopenharmony_ci	 * OK, now the LEB is locked and we can safely start moving it. Since
138362306a36Sopenharmony_ci	 * this function utilizes the @ubi->peb_buf buffer which is shared
138462306a36Sopenharmony_ci	 * with some other functions - we lock the buffer by taking the
138562306a36Sopenharmony_ci	 * @ubi->buf_mutex.
138662306a36Sopenharmony_ci	 */
138762306a36Sopenharmony_ci	mutex_lock(&ubi->buf_mutex);
138862306a36Sopenharmony_ci	dbg_wl("read %d bytes of data", aldata_size);
138962306a36Sopenharmony_ci	err = ubi_io_read_data(ubi, ubi->peb_buf, from, 0, aldata_size);
139062306a36Sopenharmony_ci	if (err && err != UBI_IO_BITFLIPS) {
139162306a36Sopenharmony_ci		ubi_warn(ubi, "error %d while reading data from PEB %d",
139262306a36Sopenharmony_ci			 err, from);
139362306a36Sopenharmony_ci		err = MOVE_SOURCE_RD_ERR;
139462306a36Sopenharmony_ci		goto out_unlock_buf;
139562306a36Sopenharmony_ci	}
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_ci	/*
139862306a36Sopenharmony_ci	 * Now we have got to calculate how much data we have to copy. In
139962306a36Sopenharmony_ci	 * case of a static volume it is fairly easy - the VID header contains
140062306a36Sopenharmony_ci	 * the data size. In case of a dynamic volume it is more difficult - we
140162306a36Sopenharmony_ci	 * have to read the contents, cut 0xFF bytes from the end and copy only
140262306a36Sopenharmony_ci	 * the first part. We must do this to avoid writing 0xFF bytes as it
140362306a36Sopenharmony_ci	 * may have some side-effects. And not only this. It is important not
140462306a36Sopenharmony_ci	 * to include those 0xFFs to CRC because later the they may be filled
140562306a36Sopenharmony_ci	 * by data.
140662306a36Sopenharmony_ci	 */
140762306a36Sopenharmony_ci	if (vid_hdr->vol_type == UBI_VID_DYNAMIC)
140862306a36Sopenharmony_ci		aldata_size = data_size =
140962306a36Sopenharmony_ci			ubi_calc_data_len(ubi, ubi->peb_buf, data_size);
141062306a36Sopenharmony_ci
141162306a36Sopenharmony_ci	cond_resched();
141262306a36Sopenharmony_ci	crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, data_size);
141362306a36Sopenharmony_ci	cond_resched();
141462306a36Sopenharmony_ci
141562306a36Sopenharmony_ci	/*
141662306a36Sopenharmony_ci	 * It may turn out to be that the whole @from physical eraseblock
141762306a36Sopenharmony_ci	 * contains only 0xFF bytes. Then we have to only write the VID header
141862306a36Sopenharmony_ci	 * and do not write any data. This also means we should not set
141962306a36Sopenharmony_ci	 * @vid_hdr->copy_flag, @vid_hdr->data_size, and @vid_hdr->data_crc.
142062306a36Sopenharmony_ci	 */
142162306a36Sopenharmony_ci	if (data_size > 0) {
142262306a36Sopenharmony_ci		vid_hdr->copy_flag = 1;
142362306a36Sopenharmony_ci		vid_hdr->data_size = cpu_to_be32(data_size);
142462306a36Sopenharmony_ci		vid_hdr->data_crc = cpu_to_be32(crc);
142562306a36Sopenharmony_ci	}
142662306a36Sopenharmony_ci	vid_hdr->sqnum = cpu_to_be64(ubi_next_sqnum(ubi));
142762306a36Sopenharmony_ci
142862306a36Sopenharmony_ci	err = ubi_io_write_vid_hdr(ubi, to, vidb);
142962306a36Sopenharmony_ci	if (err) {
143062306a36Sopenharmony_ci		if (err == -EIO)
143162306a36Sopenharmony_ci			err = MOVE_TARGET_WR_ERR;
143262306a36Sopenharmony_ci		goto out_unlock_buf;
143362306a36Sopenharmony_ci	}
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci	cond_resched();
143662306a36Sopenharmony_ci
143762306a36Sopenharmony_ci	/* Read the VID header back and check if it was written correctly */
143862306a36Sopenharmony_ci	err = ubi_io_read_vid_hdr(ubi, to, vidb, 1);
143962306a36Sopenharmony_ci	if (err) {
144062306a36Sopenharmony_ci		if (err != UBI_IO_BITFLIPS) {
144162306a36Sopenharmony_ci			ubi_warn(ubi, "error %d while reading VID header back from PEB %d",
144262306a36Sopenharmony_ci				 err, to);
144362306a36Sopenharmony_ci			if (is_error_sane(err))
144462306a36Sopenharmony_ci				err = MOVE_TARGET_RD_ERR;
144562306a36Sopenharmony_ci		} else
144662306a36Sopenharmony_ci			err = MOVE_TARGET_BITFLIPS;
144762306a36Sopenharmony_ci		goto out_unlock_buf;
144862306a36Sopenharmony_ci	}
144962306a36Sopenharmony_ci
145062306a36Sopenharmony_ci	if (data_size > 0) {
145162306a36Sopenharmony_ci		err = ubi_io_write_data(ubi, ubi->peb_buf, to, 0, aldata_size);
145262306a36Sopenharmony_ci		if (err) {
145362306a36Sopenharmony_ci			if (err == -EIO)
145462306a36Sopenharmony_ci				err = MOVE_TARGET_WR_ERR;
145562306a36Sopenharmony_ci			goto out_unlock_buf;
145662306a36Sopenharmony_ci		}
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci		cond_resched();
145962306a36Sopenharmony_ci	}
146062306a36Sopenharmony_ci
146162306a36Sopenharmony_ci	ubi_assert(vol->eba_tbl->entries[lnum].pnum == from);
146262306a36Sopenharmony_ci	vol->eba_tbl->entries[lnum].pnum = to;
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ciout_unlock_buf:
146562306a36Sopenharmony_ci	mutex_unlock(&ubi->buf_mutex);
146662306a36Sopenharmony_ciout_unlock_leb:
146762306a36Sopenharmony_ci	leb_write_unlock(ubi, vol_id, lnum);
146862306a36Sopenharmony_ci	return err;
146962306a36Sopenharmony_ci}
147062306a36Sopenharmony_ci
147162306a36Sopenharmony_ci/**
147262306a36Sopenharmony_ci * print_rsvd_warning - warn about not having enough reserved PEBs.
147362306a36Sopenharmony_ci * @ubi: UBI device description object
147462306a36Sopenharmony_ci * @ai: UBI attach info object
147562306a36Sopenharmony_ci *
147662306a36Sopenharmony_ci * This is a helper function for 'ubi_eba_init()' which is called when UBI
147762306a36Sopenharmony_ci * cannot reserve enough PEBs for bad block handling. This function makes a
147862306a36Sopenharmony_ci * decision whether we have to print a warning or not. The algorithm is as
147962306a36Sopenharmony_ci * follows:
148062306a36Sopenharmony_ci *   o if this is a new UBI image, then just print the warning
148162306a36Sopenharmony_ci *   o if this is an UBI image which has already been used for some time, print
148262306a36Sopenharmony_ci *     a warning only if we can reserve less than 10% of the expected amount of
148362306a36Sopenharmony_ci *     the reserved PEB.
148462306a36Sopenharmony_ci *
148562306a36Sopenharmony_ci * The idea is that when UBI is used, PEBs become bad, and the reserved pool
148662306a36Sopenharmony_ci * of PEBs becomes smaller, which is normal and we do not want to scare users
148762306a36Sopenharmony_ci * with a warning every time they attach the MTD device. This was an issue
148862306a36Sopenharmony_ci * reported by real users.
148962306a36Sopenharmony_ci */
149062306a36Sopenharmony_cistatic void print_rsvd_warning(struct ubi_device *ubi,
149162306a36Sopenharmony_ci			       struct ubi_attach_info *ai)
149262306a36Sopenharmony_ci{
149362306a36Sopenharmony_ci	/*
149462306a36Sopenharmony_ci	 * The 1 << 18 (256KiB) number is picked randomly, just a reasonably
149562306a36Sopenharmony_ci	 * large number to distinguish between newly flashed and used images.
149662306a36Sopenharmony_ci	 */
149762306a36Sopenharmony_ci	if (ai->max_sqnum > (1 << 18)) {
149862306a36Sopenharmony_ci		int min = ubi->beb_rsvd_level / 10;
149962306a36Sopenharmony_ci
150062306a36Sopenharmony_ci		if (!min)
150162306a36Sopenharmony_ci			min = 1;
150262306a36Sopenharmony_ci		if (ubi->beb_rsvd_pebs > min)
150362306a36Sopenharmony_ci			return;
150462306a36Sopenharmony_ci	}
150562306a36Sopenharmony_ci
150662306a36Sopenharmony_ci	ubi_warn(ubi, "cannot reserve enough PEBs for bad PEB handling, reserved %d, need %d",
150762306a36Sopenharmony_ci		 ubi->beb_rsvd_pebs, ubi->beb_rsvd_level);
150862306a36Sopenharmony_ci	if (ubi->corr_peb_count)
150962306a36Sopenharmony_ci		ubi_warn(ubi, "%d PEBs are corrupted and not used",
151062306a36Sopenharmony_ci			 ubi->corr_peb_count);
151162306a36Sopenharmony_ci}
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_ci/**
151462306a36Sopenharmony_ci * self_check_eba - run a self check on the EBA table constructed by fastmap.
151562306a36Sopenharmony_ci * @ubi: UBI device description object
151662306a36Sopenharmony_ci * @ai_fastmap: UBI attach info object created by fastmap
151762306a36Sopenharmony_ci * @ai_scan: UBI attach info object created by scanning
151862306a36Sopenharmony_ci *
151962306a36Sopenharmony_ci * Returns < 0 in case of an internal error, 0 otherwise.
152062306a36Sopenharmony_ci * If a bad EBA table entry was found it will be printed out and
152162306a36Sopenharmony_ci * ubi_assert() triggers.
152262306a36Sopenharmony_ci */
152362306a36Sopenharmony_ciint self_check_eba(struct ubi_device *ubi, struct ubi_attach_info *ai_fastmap,
152462306a36Sopenharmony_ci		   struct ubi_attach_info *ai_scan)
152562306a36Sopenharmony_ci{
152662306a36Sopenharmony_ci	int i, j, num_volumes, ret = 0;
152762306a36Sopenharmony_ci	int **scan_eba, **fm_eba;
152862306a36Sopenharmony_ci	struct ubi_ainf_volume *av;
152962306a36Sopenharmony_ci	struct ubi_volume *vol;
153062306a36Sopenharmony_ci	struct ubi_ainf_peb *aeb;
153162306a36Sopenharmony_ci	struct rb_node *rb;
153262306a36Sopenharmony_ci
153362306a36Sopenharmony_ci	num_volumes = ubi->vtbl_slots + UBI_INT_VOL_COUNT;
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_ci	scan_eba = kmalloc_array(num_volumes, sizeof(*scan_eba), GFP_KERNEL);
153662306a36Sopenharmony_ci	if (!scan_eba)
153762306a36Sopenharmony_ci		return -ENOMEM;
153862306a36Sopenharmony_ci
153962306a36Sopenharmony_ci	fm_eba = kmalloc_array(num_volumes, sizeof(*fm_eba), GFP_KERNEL);
154062306a36Sopenharmony_ci	if (!fm_eba) {
154162306a36Sopenharmony_ci		kfree(scan_eba);
154262306a36Sopenharmony_ci		return -ENOMEM;
154362306a36Sopenharmony_ci	}
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_ci	for (i = 0; i < num_volumes; i++) {
154662306a36Sopenharmony_ci		vol = ubi->volumes[i];
154762306a36Sopenharmony_ci		if (!vol)
154862306a36Sopenharmony_ci			continue;
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_ci		scan_eba[i] = kmalloc_array(vol->reserved_pebs,
155162306a36Sopenharmony_ci					    sizeof(**scan_eba),
155262306a36Sopenharmony_ci					    GFP_KERNEL);
155362306a36Sopenharmony_ci		if (!scan_eba[i]) {
155462306a36Sopenharmony_ci			ret = -ENOMEM;
155562306a36Sopenharmony_ci			goto out_free;
155662306a36Sopenharmony_ci		}
155762306a36Sopenharmony_ci
155862306a36Sopenharmony_ci		fm_eba[i] = kmalloc_array(vol->reserved_pebs,
155962306a36Sopenharmony_ci					  sizeof(**fm_eba),
156062306a36Sopenharmony_ci					  GFP_KERNEL);
156162306a36Sopenharmony_ci		if (!fm_eba[i]) {
156262306a36Sopenharmony_ci			ret = -ENOMEM;
156362306a36Sopenharmony_ci			goto out_free;
156462306a36Sopenharmony_ci		}
156562306a36Sopenharmony_ci
156662306a36Sopenharmony_ci		for (j = 0; j < vol->reserved_pebs; j++)
156762306a36Sopenharmony_ci			scan_eba[i][j] = fm_eba[i][j] = UBI_LEB_UNMAPPED;
156862306a36Sopenharmony_ci
156962306a36Sopenharmony_ci		av = ubi_find_av(ai_scan, idx2vol_id(ubi, i));
157062306a36Sopenharmony_ci		if (!av)
157162306a36Sopenharmony_ci			continue;
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_ci		ubi_rb_for_each_entry(rb, aeb, &av->root, u.rb)
157462306a36Sopenharmony_ci			scan_eba[i][aeb->lnum] = aeb->pnum;
157562306a36Sopenharmony_ci
157662306a36Sopenharmony_ci		av = ubi_find_av(ai_fastmap, idx2vol_id(ubi, i));
157762306a36Sopenharmony_ci		if (!av)
157862306a36Sopenharmony_ci			continue;
157962306a36Sopenharmony_ci
158062306a36Sopenharmony_ci		ubi_rb_for_each_entry(rb, aeb, &av->root, u.rb)
158162306a36Sopenharmony_ci			fm_eba[i][aeb->lnum] = aeb->pnum;
158262306a36Sopenharmony_ci
158362306a36Sopenharmony_ci		for (j = 0; j < vol->reserved_pebs; j++) {
158462306a36Sopenharmony_ci			if (scan_eba[i][j] != fm_eba[i][j]) {
158562306a36Sopenharmony_ci				if (scan_eba[i][j] == UBI_LEB_UNMAPPED ||
158662306a36Sopenharmony_ci					fm_eba[i][j] == UBI_LEB_UNMAPPED)
158762306a36Sopenharmony_ci					continue;
158862306a36Sopenharmony_ci
158962306a36Sopenharmony_ci				ubi_err(ubi, "LEB:%i:%i is PEB:%i instead of %i!",
159062306a36Sopenharmony_ci					vol->vol_id, j, fm_eba[i][j],
159162306a36Sopenharmony_ci					scan_eba[i][j]);
159262306a36Sopenharmony_ci				ubi_assert(0);
159362306a36Sopenharmony_ci			}
159462306a36Sopenharmony_ci		}
159562306a36Sopenharmony_ci	}
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_ciout_free:
159862306a36Sopenharmony_ci	for (i = 0; i < num_volumes; i++) {
159962306a36Sopenharmony_ci		if (!ubi->volumes[i])
160062306a36Sopenharmony_ci			continue;
160162306a36Sopenharmony_ci
160262306a36Sopenharmony_ci		kfree(scan_eba[i]);
160362306a36Sopenharmony_ci		kfree(fm_eba[i]);
160462306a36Sopenharmony_ci	}
160562306a36Sopenharmony_ci
160662306a36Sopenharmony_ci	kfree(scan_eba);
160762306a36Sopenharmony_ci	kfree(fm_eba);
160862306a36Sopenharmony_ci	return ret;
160962306a36Sopenharmony_ci}
161062306a36Sopenharmony_ci
161162306a36Sopenharmony_ci/**
161262306a36Sopenharmony_ci * ubi_eba_init - initialize the EBA sub-system using attaching information.
161362306a36Sopenharmony_ci * @ubi: UBI device description object
161462306a36Sopenharmony_ci * @ai: attaching information
161562306a36Sopenharmony_ci *
161662306a36Sopenharmony_ci * This function returns zero in case of success and a negative error code in
161762306a36Sopenharmony_ci * case of failure.
161862306a36Sopenharmony_ci */
161962306a36Sopenharmony_ciint ubi_eba_init(struct ubi_device *ubi, struct ubi_attach_info *ai)
162062306a36Sopenharmony_ci{
162162306a36Sopenharmony_ci	int i, err, num_volumes;
162262306a36Sopenharmony_ci	struct ubi_ainf_volume *av;
162362306a36Sopenharmony_ci	struct ubi_volume *vol;
162462306a36Sopenharmony_ci	struct ubi_ainf_peb *aeb;
162562306a36Sopenharmony_ci	struct rb_node *rb;
162662306a36Sopenharmony_ci
162762306a36Sopenharmony_ci	dbg_eba("initialize EBA sub-system");
162862306a36Sopenharmony_ci
162962306a36Sopenharmony_ci	spin_lock_init(&ubi->ltree_lock);
163062306a36Sopenharmony_ci	mutex_init(&ubi->alc_mutex);
163162306a36Sopenharmony_ci	ubi->ltree = RB_ROOT;
163262306a36Sopenharmony_ci
163362306a36Sopenharmony_ci	ubi->global_sqnum = ai->max_sqnum + 1;
163462306a36Sopenharmony_ci	num_volumes = ubi->vtbl_slots + UBI_INT_VOL_COUNT;
163562306a36Sopenharmony_ci
163662306a36Sopenharmony_ci	for (i = 0; i < num_volumes; i++) {
163762306a36Sopenharmony_ci		struct ubi_eba_table *tbl;
163862306a36Sopenharmony_ci
163962306a36Sopenharmony_ci		vol = ubi->volumes[i];
164062306a36Sopenharmony_ci		if (!vol)
164162306a36Sopenharmony_ci			continue;
164262306a36Sopenharmony_ci
164362306a36Sopenharmony_ci		cond_resched();
164462306a36Sopenharmony_ci
164562306a36Sopenharmony_ci		tbl = ubi_eba_create_table(vol, vol->reserved_pebs);
164662306a36Sopenharmony_ci		if (IS_ERR(tbl)) {
164762306a36Sopenharmony_ci			err = PTR_ERR(tbl);
164862306a36Sopenharmony_ci			goto out_free;
164962306a36Sopenharmony_ci		}
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_ci		ubi_eba_replace_table(vol, tbl);
165262306a36Sopenharmony_ci
165362306a36Sopenharmony_ci		av = ubi_find_av(ai, idx2vol_id(ubi, i));
165462306a36Sopenharmony_ci		if (!av)
165562306a36Sopenharmony_ci			continue;
165662306a36Sopenharmony_ci
165762306a36Sopenharmony_ci		ubi_rb_for_each_entry(rb, aeb, &av->root, u.rb) {
165862306a36Sopenharmony_ci			if (aeb->lnum >= vol->reserved_pebs) {
165962306a36Sopenharmony_ci				/*
166062306a36Sopenharmony_ci				 * This may happen in case of an unclean reboot
166162306a36Sopenharmony_ci				 * during re-size.
166262306a36Sopenharmony_ci				 */
166362306a36Sopenharmony_ci				ubi_move_aeb_to_list(av, aeb, &ai->erase);
166462306a36Sopenharmony_ci			} else {
166562306a36Sopenharmony_ci				struct ubi_eba_entry *entry;
166662306a36Sopenharmony_ci
166762306a36Sopenharmony_ci				entry = &vol->eba_tbl->entries[aeb->lnum];
166862306a36Sopenharmony_ci				entry->pnum = aeb->pnum;
166962306a36Sopenharmony_ci			}
167062306a36Sopenharmony_ci		}
167162306a36Sopenharmony_ci	}
167262306a36Sopenharmony_ci
167362306a36Sopenharmony_ci	if (ubi->avail_pebs < EBA_RESERVED_PEBS) {
167462306a36Sopenharmony_ci		ubi_err(ubi, "no enough physical eraseblocks (%d, need %d)",
167562306a36Sopenharmony_ci			ubi->avail_pebs, EBA_RESERVED_PEBS);
167662306a36Sopenharmony_ci		if (ubi->corr_peb_count)
167762306a36Sopenharmony_ci			ubi_err(ubi, "%d PEBs are corrupted and not used",
167862306a36Sopenharmony_ci				ubi->corr_peb_count);
167962306a36Sopenharmony_ci		err = -ENOSPC;
168062306a36Sopenharmony_ci		goto out_free;
168162306a36Sopenharmony_ci	}
168262306a36Sopenharmony_ci	ubi->avail_pebs -= EBA_RESERVED_PEBS;
168362306a36Sopenharmony_ci	ubi->rsvd_pebs += EBA_RESERVED_PEBS;
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	if (ubi->bad_allowed) {
168662306a36Sopenharmony_ci		ubi_calculate_reserved(ubi);
168762306a36Sopenharmony_ci
168862306a36Sopenharmony_ci		if (ubi->avail_pebs < ubi->beb_rsvd_level) {
168962306a36Sopenharmony_ci			/* No enough free physical eraseblocks */
169062306a36Sopenharmony_ci			ubi->beb_rsvd_pebs = ubi->avail_pebs;
169162306a36Sopenharmony_ci			print_rsvd_warning(ubi, ai);
169262306a36Sopenharmony_ci		} else
169362306a36Sopenharmony_ci			ubi->beb_rsvd_pebs = ubi->beb_rsvd_level;
169462306a36Sopenharmony_ci
169562306a36Sopenharmony_ci		ubi->avail_pebs -= ubi->beb_rsvd_pebs;
169662306a36Sopenharmony_ci		ubi->rsvd_pebs  += ubi->beb_rsvd_pebs;
169762306a36Sopenharmony_ci	}
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci	dbg_eba("EBA sub-system is initialized");
170062306a36Sopenharmony_ci	return 0;
170162306a36Sopenharmony_ci
170262306a36Sopenharmony_ciout_free:
170362306a36Sopenharmony_ci	for (i = 0; i < num_volumes; i++) {
170462306a36Sopenharmony_ci		if (!ubi->volumes[i])
170562306a36Sopenharmony_ci			continue;
170662306a36Sopenharmony_ci		ubi_eba_replace_table(ubi->volumes[i], NULL);
170762306a36Sopenharmony_ci	}
170862306a36Sopenharmony_ci	return err;
170962306a36Sopenharmony_ci}
1710