public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* Bug in jffs2/scan.c re: incorrect assumption of "all clean" block
@ 2005-02-10 22:44 Steven J. Magnani
  2005-02-14 13:24 ` Artem B. Bityuckiy
  0 siblings, 1 reply; 7+ messages in thread
From: Steven J. Magnani @ 2005-02-10 22:44 UTC (permalink / raw)
  To: linux-mtd

Hello MTD folk,

I'm not hooked into the MTD list so please cc: me on any replies. Also
please note that this is my first experience with this code, so excuse
me if I've gone off base.

I believe there is a bug in fs/jffs2/scan.c that causes it to
incorrectly assume a block with a cleanmarker is "all clean". This
causes an "Eep. Block 0xXXXXXXXX taken from free_list had free_size of
0xXXXXXXXX!!" to go off when jffs2_do_reserve_space() is called later.

There are 4 conditions that have to be met in a particular block for the
bug to surface:

* The block has a cleanmarker
* The end of the block has to be free space (0xFF)
* The block has JFFS2_NODETYPE_INODEs
* The block does NOT have any JFFS2_NODETYPE_DIRENTs

The test that governs the "all clean" assumption is as follows (cf.
scan.c 1.118 line 435)

	if (buf_ofs == jeb->offset && jeb->used_size ==
PAD(c->cleanmarker_size) && 
	    c->cleanmarker_size && !jeb->dirty_size &&
!jeb->first_node->next_in_ino) {

The bug is that there is no test that checks whether any
JFFS2_NODETYPE_INODEs have been seen. Since only JFFS2_NODETYPE_DIRENTs
are counted as used, and JFFS2_NODETYPE_INODEs are counted as unchecked,
I think that the correction should look like this:

	if (buf_ofs == jeb->offset && ((jeb->used_size +
jeb->unchecked_size) == PAD(c->cleanmarker_size)) && 
	    c->cleanmarker_size && !jeb->dirty_size &&
!jeb->first_node->next_in_ino) {


This seems consistent with what is done at line 631:

	if ((jeb->used_size + jeb->unchecked_size) ==
PAD(c->cleanmarker_size) && !jeb->dirty_size 
		&& (!jeb->first_node || !jeb->first_node->next_in_ino) )

...although the two are still not checking quite the same set of
conditions.

Comments? I can provide a JFFS2 image that triggers the problem if
someone is interested in stepping through it.

Steve Magnani
Digital Design Corporation
www.digidescorp.com

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Bug in jffs2/scan.c re: incorrect assumption of "all clean" block
  2005-02-10 22:44 Bug in jffs2/scan.c re: incorrect assumption of "all clean" block Steven J. Magnani
@ 2005-02-14 13:24 ` Artem B. Bityuckiy
  0 siblings, 0 replies; 7+ messages in thread
From: Artem B. Bityuckiy @ 2005-02-14 13:24 UTC (permalink / raw)
  To: Steven J. Magnani; +Cc: linux-mtd

Could you please send your JFFS2 dbg L1 output?

Is your flash NOR or NAND?

On Thu, 2005-02-10 at 16:44 -0600, Steven J. Magnani wrote:
> Hello MTD folk,
> 
> I'm not hooked into the MTD list so please cc: me on any replies. Also
> please note that this is my first experience with this code, so excuse
> me if I've gone off base.
> 
> I believe there is a bug in fs/jffs2/scan.c that causes it to
> incorrectly assume a block with a cleanmarker is "all clean". This
> causes an "Eep. Block 0xXXXXXXXX taken from free_list had free_size of
> 0xXXXXXXXX!!" to go off when jffs2_do_reserve_space() is called later.
> 
> There are 4 conditions that have to be met in a particular block for the
> bug to surface:
> 
> * The block has a cleanmarker
> * The end of the block has to be free space (0xFF)
> * The block has JFFS2_NODETYPE_INODEs
> * The block does NOT have any JFFS2_NODETYPE_DIRENTs
> 
> The test that governs the "all clean" assumption is as follows (cf.
> scan.c 1.118 line 435)
> 
> 	if (buf_ofs == jeb->offset && jeb->used_size ==
> PAD(c->cleanmarker_size) && 
> 	    c->cleanmarker_size && !jeb->dirty_size &&
> !jeb->first_node->next_in_ino) {
> 
> The bug is that there is no test that checks whether any
> JFFS2_NODETYPE_INODEs have been seen. Since only JFFS2_NODETYPE_DIRENTs
> are counted as used, and JFFS2_NODETYPE_INODEs are counted as unchecked,
> I think that the correction should look like this:
> 
> 	if (buf_ofs == jeb->offset && ((jeb->used_size +
> jeb->unchecked_size) == PAD(c->cleanmarker_size)) && 
> 	    c->cleanmarker_size && !jeb->dirty_size &&
> !jeb->first_node->next_in_ino) {
> 
> 
> This seems consistent with what is done at line 631:
> 
> 	if ((jeb->used_size + jeb->unchecked_size) ==
> PAD(c->cleanmarker_size) && !jeb->dirty_size 
> 		&& (!jeb->first_node || !jeb->first_node->next_in_ino) )
> 
> ...although the two are still not checking quite the same set of
> conditions.
> 
> Comments? I can provide a JFFS2 image that triggers the problem if
> someone is interested in stepping through it.
> 
> Steve Magnani
> Digital Design Corporation
> www.digidescorp.com
> 
> 
> 
> 
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: Bug in jffs2/scan.c re: incorrect assumption of "all clean"block
       [not found] <004a01c512c2$60b92930$6ffea8c0@banana>
@ 2005-02-15  8:04 ` Artem B. Bityuckiy
  2005-02-15 15:24   ` Bug in jffs2/scan.c re: incorrect assumption of "allclean"block Steven J. Magnani
  2005-02-16  7:41   ` Bug in jffs2/scan.c re: incorrect assumption of "all clean"block Martin Egholm Nielsen
  0 siblings, 2 replies; 7+ messages in thread
From: Artem B. Bityuckiy @ 2005-02-15  8:04 UTC (permalink / raw)
  To: Steven J. Magnani, linux-mtd

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

Well, I've looked trough your debug output and the code and think the
following patch should fix the bug.

On Mon, 2005-02-14 at 12:24 -0600, Steven J. Magnani wrote:
> Artem -
> 
> I'm assuming when you say "JFFS2 dbg L1 output" you mean the kernel log
> contents when CONFIG_JFFS2_FS_DEBUG=1. That seems to be WAY too much
> output for the kernel to handle.
> 
> I built a kernel with just scan.c at L1 debugging, the output is
> attached. This is completely reproducible the first time I mount this
> image created by mkfs.jffs2.
> 
> The part is NOR flash (Intel 28F320C3).
> 
> Steve
> 
> -----Original Message-----
> From: Artem B. Bityuckiy [mailto:dedekind@infradead.org] 
> Sent: Monday, February 14, 2005 7:24 AM
> To: Steven J. Magnani
> Cc: linux-mtd@lists.infradead.org
> Subject: Re: Bug in jffs2/scan.c re: incorrect assumption of "all
> clean"block
> 
> 
> Could you please send your JFFS2 dbg L1 output?
> 
> Is your flash NOR or NAND?
> 
> On Thu, 2005-02-10 at 16:44 -0600, Steven J. Magnani wrote:
> > Hello MTD folk,
> > 
> > I'm not hooked into the MTD list so please cc: me on any replies. Also
> 
> > please note that this is my first experience with this code, so excuse
> 
> > me if I've gone off base.
> > 
> > I believe there is a bug in fs/jffs2/scan.c that causes it to 
> > incorrectly assume a block with a cleanmarker is "all clean". This 
> > causes an "Eep. Block 0xXXXXXXXX taken from free_list had free_size of
> 
> > 0xXXXXXXXX!!" to go off when jffs2_do_reserve_space() is called later.
> > 
> > There are 4 conditions that have to be met in a particular block for 
> > the bug to surface:
> > 
> > * The block has a cleanmarker
> > * The end of the block has to be free space (0xFF)
> > * The block has JFFS2_NODETYPE_INODEs
> > * The block does NOT have any JFFS2_NODETYPE_DIRENTs
> > 
> > The test that governs the "all clean" assumption is as follows (cf. 
> > scan.c 1.118 line 435)
> > 
> > 	if (buf_ofs == jeb->offset && jeb->used_size ==
> > PAD(c->cleanmarker_size) && 
> > 	    c->cleanmarker_size && !jeb->dirty_size &&
> > !jeb->first_node->next_in_ino) {
> > 
> > The bug is that there is no test that checks whether any 
> > JFFS2_NODETYPE_INODEs have been seen. Since only 
> > JFFS2_NODETYPE_DIRENTs are counted as used, and JFFS2_NODETYPE_INODEs 
> > are counted as unchecked, I think that the correction should look like
> 
> > this:
> > 
> > 	if (buf_ofs == jeb->offset && ((jeb->used_size +
> > jeb->unchecked_size) == PAD(c->cleanmarker_size)) &&
> > 	    c->cleanmarker_size && !jeb->dirty_size &&
> > !jeb->first_node->next_in_ino) {
> > 
> > 
> > This seems consistent with what is done at line 631:
> > 
> > 	if ((jeb->used_size + jeb->unchecked_size) ==
> > PAD(c->cleanmarker_size) && !jeb->dirty_size 
> > 		&& (!jeb->first_node || !jeb->first_node->next_in_ino) )
> > 
> > ...although the two are still not checking quite the same set of 
> > conditions.
> > 
> > Comments? I can provide a JFFS2 image that triggers the problem if 
> > someone is interested in stepping through it.
> > 
> > Steve Magnani
> > Digital Design Corporation
> > www.digidescorp.com
> > 
> > 
> > 
> > 
> > ______________________________________________________
> > Linux MTD discussion mailing list 
> > http://lists.infradead.org/mailman/listinfo/linux-mtd/
> 
-- 
Best Regards,
Artem B. Bityuckiy,
St.-Petersburg, Russia.

[-- Attachment #2: scan.c.diff --]
[-- Type: text/x-patch, Size: 651 bytes --]

--- scan.c	2005-02-14 16:30:11.000000000 +0300
+++ /home/dedekind/tmp/scan.c_modified	2005-02-15 10:55:53.879765568 +0300
@@ -433,7 +433,7 @@
 			/* If we're only checking the beginning of a block with a cleanmarker,
 			   bail now */
 			if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) && 
-			    c->cleanmarker_size && !jeb->dirty_size && !jeb->first_node->next_in_ino) {
+			    c->cleanmarker_size && !jeb->dirty_size && !jeb->first_node->next_phys) {
 				D1(printk(KERN_DEBUG "%d bytes at start of block seems clean... assuming all clean\n", EMPTY_SCAN_SIZE(c->sector_size)));
 				return BLK_STATE_CLEANMARKER;
 			}

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: Bug in jffs2/scan.c re: incorrect assumption of "allclean"block
  2005-02-15  8:04 ` Bug in jffs2/scan.c re: incorrect assumption of "all clean"block Artem B. Bityuckiy
@ 2005-02-15 15:24   ` Steven J. Magnani
  2005-02-15 15:57     ` Artem B. Bityuckiy
  2005-02-16  7:41   ` Bug in jffs2/scan.c re: incorrect assumption of "all clean"block Martin Egholm Nielsen
  1 sibling, 1 reply; 7+ messages in thread
From: Steven J. Magnani @ 2005-02-15 15:24 UTC (permalink / raw)
  To: dedekind, linux-mtd


> Well, I've looked trough your debug output and the code and think the
following patch should fix the bug.

That also seems to work. I assume that the test for "jeb->used_size ==
PAD(c->cleanmarker_size)" assures that jeb->first_node is non-NULL, so
dereferencing it won't ever cause an oops.

Should the code at line 631 be changed to look more like your patched
code? (Why the difference?)

Steve

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: Bug in jffs2/scan.c re: incorrect assumption of "allclean"block
  2005-02-15 15:24   ` Bug in jffs2/scan.c re: incorrect assumption of "allclean"block Steven J. Magnani
@ 2005-02-15 15:57     ` Artem B. Bityuckiy
  0 siblings, 0 replies; 7+ messages in thread
From: Artem B. Bityuckiy @ 2005-02-15 15:57 UTC (permalink / raw)
  To: Steven J. Magnani; +Cc: linux-mtd

On Tue, 2005-02-15 at 09:24 -0600, Steven J. Magnani wrote:
> > Well, I've looked trough your debug output and the code and think the
> following patch should fix the bug.
> 
> That also seems to work. I assume that the test for "jeb->used_size ==
> PAD(c->cleanmarker_size)" assures that jeb->first_node is non-NULL, so
> dereferencing it won't ever cause an oops.
Yes

> 
> Should the code at line 631 be changed to look more like your patched
> code? (Why the difference?)
I believe the same should be done there too.

-- 
Best Regards,
Artem B. Bityuckiy,
St.-Petersburg, Russia.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Bug in jffs2/scan.c re: incorrect assumption of "all clean"block
  2005-02-15  8:04 ` Bug in jffs2/scan.c re: incorrect assumption of "all clean"block Artem B. Bityuckiy
  2005-02-15 15:24   ` Bug in jffs2/scan.c re: incorrect assumption of "allclean"block Steven J. Magnani
@ 2005-02-16  7:41   ` Martin Egholm Nielsen
  2005-02-16  7:57     ` Artem B. Bityuckiy
  1 sibling, 1 reply; 7+ messages in thread
From: Martin Egholm Nielsen @ 2005-02-16  7:41 UTC (permalink / raw)
  To: linux-mtd

>>>>I believe there is a bug in fs/jffs2/scan.c that causes it to 
=== 8< 8< 8< ===
>>>Is your flash NOR or NAND?
>>The part is NOR flash (Intel 28F320C3).
So will this bug effect NAND users, as well?

// Martin

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Bug in jffs2/scan.c re: incorrect assumption of "all clean"block
  2005-02-16  7:41   ` Bug in jffs2/scan.c re: incorrect assumption of "all clean"block Martin Egholm Nielsen
@ 2005-02-16  7:57     ` Artem B. Bityuckiy
  0 siblings, 0 replies; 7+ messages in thread
From: Artem B. Bityuckiy @ 2005-02-16  7:57 UTC (permalink / raw)
  To: Martin Egholm Nielsen; +Cc: linux-mtd

On Wed, 16 Feb 2005, Martin Egholm Nielsen wrote:

> >>>>I believe there is a bug in fs/jffs2/scan.c that causes it to 
> === 8< 8< 8< ===
> >>>Is your flash NOR or NAND?
> >>The part is NOR flash (Intel 28F320C3).
> So will this bug effect NAND users, as well?
> 
No, it is NOR specific.
We'll commit the fix.

--
Best Regards,
Artem B. Bityuckiy,
St.-Petersburg, Russia.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2005-02-16  7:57 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <004a01c512c2$60b92930$6ffea8c0@banana>
2005-02-15  8:04 ` Bug in jffs2/scan.c re: incorrect assumption of "all clean"block Artem B. Bityuckiy
2005-02-15 15:24   ` Bug in jffs2/scan.c re: incorrect assumption of "allclean"block Steven J. Magnani
2005-02-15 15:57     ` Artem B. Bityuckiy
2005-02-16  7:41   ` Bug in jffs2/scan.c re: incorrect assumption of "all clean"block Martin Egholm Nielsen
2005-02-16  7:57     ` Artem B. Bityuckiy
2005-02-10 22:44 Bug in jffs2/scan.c re: incorrect assumption of "all clean" block Steven J. Magnani
2005-02-14 13:24 ` Artem B. Bityuckiy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox