* [PATCH] UBI: fastmap: fix backward compatibility with image_seq
@ 2013-09-27 12:51 Richard Genoud
2013-09-27 12:51 ` [PATCH] UBI: simplify image sequence test Richard Genoud
2013-09-27 13:09 ` [PATCH] UBI: fastmap: fix backward compatibility with image_seq Richard Weinberger
0 siblings, 2 replies; 7+ messages in thread
From: Richard Genoud @ 2013-09-27 12:51 UTC (permalink / raw)
To: Richard Weinberger, Artem Bityutskiy
Cc: Richard Genoud, linux-mtd, David Woodhouse, linux-kernel
Some old UBI implementations (e.g. U-Boot) have not implemented the image
sequence feature.
So, when erase blocks are written, the image sequence in the ec header
is lost (set to zero).
UBI scan_all() takes this case into account (commits
32bc4820287a1a03982979515949e8ea56eac641 and
2eadaad67b2b6bd132eda105128d2d466298b8e3)
But fastmap scan functions (ubi_scan_fastmap() and scan_pool()) didn't.
This patch fixes the issue.
Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
---
drivers/mtd/ubi/fastmap.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c
index 9b42add..05067f5 100644
--- a/drivers/mtd/ubi/fastmap.c
+++ b/drivers/mtd/ubi/fastmap.c
@@ -407,6 +407,7 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
*/
for (i = 0; i < pool_size; i++) {
int scrub = 0;
+ int image_seq;
pnum = be32_to_cpu(pebs[i]);
@@ -425,7 +426,13 @@ static int scan_pool(struct ubi_device *ubi, struct ubi_attach_info *ai,
} else if (ret == UBI_IO_BITFLIPS)
scrub = 1;
- if (be32_to_cpu(ech->image_seq) != ubi->image_seq) {
+ /*
+ * Older UBI implementations have image_seq set to zero, so
+ * we shouldn't fail if image_seq == 0.
+ */
+ image_seq = be32_to_cpu(ech->image_seq);
+
+ if (image_seq && (image_seq != ubi->image_seq)) {
ubi_err("bad image seq: 0x%x, expected: 0x%x",
be32_to_cpu(ech->image_seq), ubi->image_seq);
ret = UBI_BAD_FASTMAP;
@@ -923,6 +930,8 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
}
for (i = 0; i < used_blocks; i++) {
+ int image_seq;
+
pnum = be32_to_cpu(fmsb->block_loc[i]);
if (ubi_io_is_bad(ubi, pnum)) {
@@ -940,10 +949,17 @@ int ubi_scan_fastmap(struct ubi_device *ubi, struct ubi_attach_info *ai,
} else if (ret == UBI_IO_BITFLIPS)
fm->to_be_tortured[i] = 1;
+ image_seq = be32_to_cpu(ech->image_seq);
if (!ubi->image_seq)
- ubi->image_seq = be32_to_cpu(ech->image_seq);
+ ubi->image_seq = image_seq;
- if (be32_to_cpu(ech->image_seq) != ubi->image_seq) {
+ /*
+ * Older UBI implementations have image_seq set to zero, so
+ * we shouldn't fail if image_seq == 0.
+ */
+ if (image_seq && (image_seq != ubi->image_seq)) {
+ ubi_err("wrong image seq:%d instead of %d",
+ be32_to_cpu(ech->image_seq), ubi->image_seq);
ret = UBI_BAD_FASTMAP;
goto free_hdr;
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH] UBI: simplify image sequence test
2013-09-27 12:51 [PATCH] UBI: fastmap: fix backward compatibility with image_seq Richard Genoud
@ 2013-09-27 12:51 ` Richard Genoud
2013-09-27 13:28 ` Richard Weinberger
2013-09-27 13:09 ` [PATCH] UBI: fastmap: fix backward compatibility with image_seq Richard Weinberger
1 sibling, 1 reply; 7+ messages in thread
From: Richard Genoud @ 2013-09-27 12:51 UTC (permalink / raw)
To: Richard Weinberger, Artem Bityutskiy
Cc: Richard Genoud, linux-mtd, David Woodhouse, linux-kernel
The test:
if (!a && b)
a = b;
can be symplified in:
if (!a)
a = b;
And there's no need to test if ubi->image_seq is not null, because if it is,
it is set to image_seq.
So, we just test if image_seq is not null.
Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
---
drivers/mtd/ubi/attach.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c
index 03b32b0..33bb1f2 100644
--- a/drivers/mtd/ubi/attach.c
+++ b/drivers/mtd/ubi/attach.c
@@ -900,10 +900,9 @@ static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
* number.
*/
image_seq = be32_to_cpu(ech->image_seq);
- if (!ubi->image_seq && image_seq)
+ if (!ubi->image_seq)
ubi->image_seq = image_seq;
- if (ubi->image_seq && image_seq &&
- ubi->image_seq != image_seq) {
+ if (image_seq && ubi->image_seq != image_seq) {
ubi_err("bad image sequence number %d in PEB %d, expected %d",
image_seq, pnum, ubi->image_seq);
ubi_dump_ec_hdr(ech);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] UBI: fastmap: fix backward compatibility with image_seq
2013-09-27 12:51 [PATCH] UBI: fastmap: fix backward compatibility with image_seq Richard Genoud
2013-09-27 12:51 ` [PATCH] UBI: simplify image sequence test Richard Genoud
@ 2013-09-27 13:09 ` Richard Weinberger
2013-09-27 13:16 ` Richard Genoud
1 sibling, 1 reply; 7+ messages in thread
From: Richard Weinberger @ 2013-09-27 13:09 UTC (permalink / raw)
To: Richard Genoud; +Cc: linux-mtd, David Woodhouse, linux-kernel, Artem Bityutskiy
Am 27.09.2013 14:51, schrieb Richard Genoud:
> Some old UBI implementations (e.g. U-Boot) have not implemented the image
> sequence feature.
> So, when erase blocks are written, the image sequence in the ec header
> is lost (set to zero).
> UBI scan_all() takes this case into account (commits
> 32bc4820287a1a03982979515949e8ea56eac641 and
> 2eadaad67b2b6bd132eda105128d2d466298b8e3)
>
> But fastmap scan functions (ubi_scan_fastmap() and scan_pool()) didn't.
>
> This patch fixes the issue.
>
> Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
> ---
W00t! Good catch!
Acked-by: Richard Weinberger <richard@nod.at>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] UBI: fastmap: fix backward compatibility with image_seq
2013-09-27 13:09 ` [PATCH] UBI: fastmap: fix backward compatibility with image_seq Richard Weinberger
@ 2013-09-27 13:16 ` Richard Genoud
2013-09-27 13:21 ` Richard Weinberger
0 siblings, 1 reply; 7+ messages in thread
From: Richard Genoud @ 2013-09-27 13:16 UTC (permalink / raw)
To: Richard Weinberger
Cc: linux-mtd, David Woodhouse, linux-kernel@vger.kernel.org,
Artem Bityutskiy
2013/9/27 Richard Weinberger <richard@nod.at>:
> Am 27.09.2013 14:51, schrieb Richard Genoud:
>> Some old UBI implementations (e.g. U-Boot) have not implemented the image
>> sequence feature.
>> So, when erase blocks are written, the image sequence in the ec header
>> is lost (set to zero).
>> UBI scan_all() takes this case into account (commits
>> 32bc4820287a1a03982979515949e8ea56eac641 and
>> 2eadaad67b2b6bd132eda105128d2d466298b8e3)
>>
>> But fastmap scan functions (ubi_scan_fastmap() and scan_pool()) didn't.
>>
>> This patch fixes the issue.
>>
>> Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
>> ---
>
> W00t! Good catch!
>
> Acked-by: Richard Weinberger <richard@nod.at>
Thanks :)
There's still an error when the image sequence is bad:
[ 35.632812] UBI error: scan_pool: bad image seq: 0x0, expected: 0x6e452f03
[ 35.640625] UBI error: ubi_scan_fastmap: Attach by fastmap failed,
doing a full scan!
[ 35.648437] kmem_cache_destroy ubi_ainf_peb_slab: Slab cache still
has objects <- the destroy_ai in line 1415
[ 35.656250] CPU: 0 PID: 486 Comm: ubiattach Not tainted 3.11.1 #38
[ 35.656250] [<c001283c>] (unwind_backtrace+0x0/0xe0) from
[<c0010a24>] (show_stack+0x10/0x14)
[ 35.671875] [<c0010a24>] (show_stack+0x10/0x14) from [<c019b9e4>]
(destroy_ai+0x230/0x244)
[ 35.679687] [<c019b9e4>] (destroy_ai+0x230/0x244) from [<c019d334>]
(ubi_attach+0x1f8/0x390)
[ 35.687500] [<c019d334>] (ubi_attach+0x1f8/0x390) from [<c0191a18>]
(ubi_attach_mtd_dev+0x2b8/0x86c)
[ 35.695312] [<c0191a18>] (ubi_attach_mtd_dev+0x2b8/0x86c) from
[<c0192208>] (ctrl_cdev_ioctl+0xd0/0x184)
[ 35.703125] [<c0192208>] (ctrl_cdev_ioctl+0xd0/0x184) from
[<c007ef4c>] (vfs_ioctl+0x28/0x3c)
[ 35.710937] [<c007ef4c>] (vfs_ioctl+0x28/0x3c) from [<c007f974>]
(do_vfs_ioctl+0x4e8/0x54c)
[ 35.718750] [<c007f974>] (do_vfs_ioctl+0x4e8/0x54c) from
[<c007fa0c>] (SyS_ioctl+0x34/0x58)
[ 35.726562] [<c007fa0c>] (SyS_ioctl+0x34/0x58) from [<c000e3c0>]
(ret_fast_syscall+0x0/0x2c)
I'll look into that
Richard
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] UBI: fastmap: fix backward compatibility with image_seq
2013-09-27 13:16 ` Richard Genoud
@ 2013-09-27 13:21 ` Richard Weinberger
2013-09-27 14:53 ` Richard Genoud
0 siblings, 1 reply; 7+ messages in thread
From: Richard Weinberger @ 2013-09-27 13:21 UTC (permalink / raw)
To: Richard Genoud
Cc: linux-mtd, David Woodhouse, linux-kernel@vger.kernel.org,
Artem Bityutskiy
Am 27.09.2013 15:16, schrieb Richard Genoud:
> 2013/9/27 Richard Weinberger <richard@nod.at>:
>> Am 27.09.2013 14:51, schrieb Richard Genoud:
>>> Some old UBI implementations (e.g. U-Boot) have not implemented the image
>>> sequence feature.
>>> So, when erase blocks are written, the image sequence in the ec header
>>> is lost (set to zero).
>>> UBI scan_all() takes this case into account (commits
>>> 32bc4820287a1a03982979515949e8ea56eac641 and
>>> 2eadaad67b2b6bd132eda105128d2d466298b8e3)
>>>
>>> But fastmap scan functions (ubi_scan_fastmap() and scan_pool()) didn't.
>>>
>>> This patch fixes the issue.
>>>
>>> Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
>>> ---
>>
>> W00t! Good catch!
>>
>> Acked-by: Richard Weinberger <richard@nod.at>
> Thanks :)
>
>
> There's still an error when the image sequence is bad:
> [ 35.632812] UBI error: scan_pool: bad image seq: 0x0, expected: 0x6e452f03
> [ 35.640625] UBI error: ubi_scan_fastmap: Attach by fastmap failed,
> doing a full scan!
> [ 35.648437] kmem_cache_destroy ubi_ainf_peb_slab: Slab cache still
> has objects <- the destroy_ai in line 1415
*grrr*, the problem here is that not all allocations which are done via
kmem_cache_alloc(ai->aeb_slab_cache, ...) got kfree()'d.
Thanks,
//richard
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] UBI: simplify image sequence test
2013-09-27 12:51 ` [PATCH] UBI: simplify image sequence test Richard Genoud
@ 2013-09-27 13:28 ` Richard Weinberger
0 siblings, 0 replies; 7+ messages in thread
From: Richard Weinberger @ 2013-09-27 13:28 UTC (permalink / raw)
To: Richard Genoud; +Cc: linux-mtd, David Woodhouse, linux-kernel, Artem Bityutskiy
Am 27.09.2013 14:51, schrieb Richard Genoud:
> The test:
> if (!a && b)
> a = b;
> can be symplified in:
> if (!a)
> a = b;
>
> And there's no need to test if ubi->image_seq is not null, because if it is,
> it is set to image_seq.
> So, we just test if image_seq is not null.
>
> Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
Acked-by: Richard Weinberger <richard@nod.at>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] UBI: fastmap: fix backward compatibility with image_seq
2013-09-27 13:21 ` Richard Weinberger
@ 2013-09-27 14:53 ` Richard Genoud
0 siblings, 0 replies; 7+ messages in thread
From: Richard Genoud @ 2013-09-27 14:53 UTC (permalink / raw)
To: Richard Weinberger
Cc: linux-mtd, David Woodhouse, linux-kernel@vger.kernel.org,
Artem Bityutskiy
2013/9/27 Richard Weinberger <richard@nod.at>:
> Am 27.09.2013 15:16, schrieb Richard Genoud:
>> 2013/9/27 Richard Weinberger <richard@nod.at>:
>>> Am 27.09.2013 14:51, schrieb Richard Genoud:
>>>> Some old UBI implementations (e.g. U-Boot) have not implemented the image
>>>> sequence feature.
>>>> So, when erase blocks are written, the image sequence in the ec header
>>>> is lost (set to zero).
>>>> UBI scan_all() takes this case into account (commits
>>>> 32bc4820287a1a03982979515949e8ea56eac641 and
>>>> 2eadaad67b2b6bd132eda105128d2d466298b8e3)
>>>>
>>>> But fastmap scan functions (ubi_scan_fastmap() and scan_pool()) didn't.
>>>>
>>>> This patch fixes the issue.
>>>>
>>>> Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
>>>> ---
>>>
>>> W00t! Good catch!
>>>
>>> Acked-by: Richard Weinberger <richard@nod.at>
>> Thanks :)
>>
>>
>> There's still an error when the image sequence is bad:
>> [ 35.632812] UBI error: scan_pool: bad image seq: 0x0, expected: 0x6e452f03
>> [ 35.640625] UBI error: ubi_scan_fastmap: Attach by fastmap failed,
>> doing a full scan!
>> [ 35.648437] kmem_cache_destroy ubi_ainf_peb_slab: Slab cache still
>> has objects <- the destroy_ai in line 1415
>
> *grrr*, the problem here is that not all allocations which are done via
> kmem_cache_alloc(ai->aeb_slab_cache, ...) got kfree()'d.
>
> Thanks,
> //richard
My first guess is in fastmap.c, function scan_pool(), in the loop "for
(i = 0; i < pool_size; i++)"
there's some "add_aeb()" and "new_aeb = kmem_cache_alloc()"
And on error, I don't see a loop backward to free those ones.
Richard.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-09-27 14:54 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-27 12:51 [PATCH] UBI: fastmap: fix backward compatibility with image_seq Richard Genoud
2013-09-27 12:51 ` [PATCH] UBI: simplify image sequence test Richard Genoud
2013-09-27 13:28 ` Richard Weinberger
2013-09-27 13:09 ` [PATCH] UBI: fastmap: fix backward compatibility with image_seq Richard Weinberger
2013-09-27 13:16 ` Richard Genoud
2013-09-27 13:21 ` Richard Weinberger
2013-09-27 14:53 ` Richard Genoud
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox