Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1292ee1 authored by Tatyana Brokhman's avatar Tatyana Brokhman
Browse files

mtd: ubi: Free peb's synchronously for fastmap



At first mount it's possible that there are not enough free PEBs since
there are PEB's pending to be erased. In such scenario, fm_pool (which is
the pool from which user required PEBs are allocated) will be empty.
Try fixing the above described situation by synchronously performing
pending erase work, thus produce another free PEB.

Change-Id: If4152ed8db8123a93c2c4fd4bad694a5b0079c6c
Signed-off-by: default avatarTatyana Brokhman <tlinder@codeaurora.org>
parent 488e1012
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -595,10 +595,28 @@ static void refill_wl_pool(struct ubi_device *ubi)
static void refill_wl_user_pool(struct ubi_device *ubi)
{
	struct ubi_fm_pool *pool = &ubi->fm_pool;
	int err;

	return_unused_pool_pebs(ubi, pool);

	for (pool->size = 0; pool->size < pool->max_size; pool->size++) {
retry:
		if (!ubi->free.rb_node ||
		   (ubi->free_count - ubi->beb_rsvd_pebs < 1)) {
			/* There are no avaliable pebs. Try to free
			 * PEB by means of synchronous execution of
			 * pending works.
			 */
			if (ubi->works_count == 0)
				break;
			spin_unlock(&ubi->wl_lock);
			err = do_work(ubi);
			spin_lock(&ubi->wl_lock);
			if (err < 0)
				break;
			goto retry;
		}

		pool->pebs[pool->size] = __wl_get_peb(ubi);
		if (pool->pebs[pool->size] < 0)
			break;