Re: ubi_wl_get_peb: Unable to get a free PEB from user WL pool

Richard Weinberger
2015-08-05T22:01:36Z

[-- Attachment #1: Type: text/plain, Size: 1126 bytes --]

Am 05.08.2015 um 23:53 schrieb Jörg Krause:
> On Mi, 2015-08-05 at 23:45 +0200, Richard Weinberger wrote:
>> Jörg,
>>
>> Am 05.08.2015 um 23:38 schrieb Jörg Krause:
>>> On Mi, 2015-08-05 at 23:30 +0200, Richard Weinberger wrote:
>
> [snip]
>
>>>
>>> I attached the kernel boot log.
>>
>> Thanks.
>> That's a really small UBI setup.
>> [ 3.202421] ubi1: default fastmap pool size: 10
>> [ 3.207174] ubi1: default fastmap WL pool size: 5
>
> What do you exactly mean by small UBI setup? The fastmap pool size? The
> UBI layout?

The UBI image it self. Your MTD is very small.
But it should not matter.

> [snip]
>
>>>
>>> It is enabled in the kernel config. Not sure how to use it.
>>
>> Then just disable it. :)
>
> I did :) I thought fastmap is used automatically by the UBI driver?

It will *use* fastmap automatically but not convert non-fastmap UBI images
to fastmap.
You can enable ubi.fm_autoconvert to do so.

>> Meanwhile I'll find out what exactly is going on.
>
> Many thanks!

Can you please apply the attached debug patch?
I wonder why exactly the auto resize function is failing.

Thanks,
//richard

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: debug.diff --]
[-- Type: text/x-patch; name="debug.diff", Size: 1012 bytes --]

diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
index 22fd19c..89aa7ac9 100644
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
@@ -820,8 +820,8 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
err = ubi_resize_volume(&desc,
old_reserved_pebs + ubi->avail_pebs);
if (err)
- ubi_err(ubi, "cannot auto-resize volume %d",
- vol_id);
+ ubi_err(ubi, "cannot auto-resize volume %d: %d",
+ vol_id, err);
}

if (err)
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
index 1ae17bb..7be6fa3 100644
--- a/drivers/mtd/ubi/vmt.c
+++ b/drivers/mtd/ubi/vmt.c
@@ -498,8 +498,10 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
if (pebs < 0) {
for (i = 0; i < -pebs; i++) {
err = ubi_eba_unmap_leb(ubi, vol, reserved_pebs + i);
- if (err)
+ if (err) {
+ ubi_err(ubi, "unable to unmap LEB");
goto out_acc;
+ }
}
spin_lock(&ubi->volumes_lock);
ubi->rsvd_pebs += pebs;