diff options
Diffstat (limited to 'drivers/mtd/ubi/misc.c')
| -rw-r--r-- | drivers/mtd/ubi/misc.c | 25 | 
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/mtd/ubi/misc.c b/drivers/mtd/ubi/misc.c index f6a7d7ac4b9..8bbfb444b89 100644 --- a/drivers/mtd/ubi/misc.c +++ b/drivers/mtd/ubi/misc.c @@ -92,7 +92,30 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id)  }  /** - * ubi_calculate_rsvd_pool - calculate how many PEBs must be reserved for bad + * ubi_update_reserved - update bad eraseblock handling accounting data. + * @ubi: UBI device description object + * + * This function calculates the gap between current number of PEBs reserved for + * bad eraseblock handling and the required level of PEBs that must be + * reserved, and if necessary, reserves more PEBs to fill that gap, according + * to availability. Should be called with ubi->volumes_lock held. + */ +void ubi_update_reserved(struct ubi_device *ubi) +{ +	int need = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs; + +	if (need <= 0 || ubi->avail_pebs == 0) +		return; + +	need = min_t(int, need, ubi->avail_pebs); +	ubi->avail_pebs -= need; +	ubi->rsvd_pebs += need; +	ubi->beb_rsvd_pebs += need; +	ubi_msg("reserved more %d PEBs for bad PEB handling", need); +} + +/** + * ubi_calculate_reserved - calculate how many PEBs must be reserved for bad   * eraseblock handling.   * @ubi: UBI device description object   */  |