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