* jffs2 Oops on 2.6.10-rc2
@ 2004-11-18 16:35 Konstantin Kletschke
2004-11-18 17:20 ` Konstantin Kletschke
2004-11-20 13:57 ` David Woodhouse
0 siblings, 2 replies; 16+ messages in thread
From: Konstantin Kletschke @ 2004-11-18 16:35 UTC (permalink / raw)
To: linux-mtd
Well I tried out the jffs2 which is in 2.6.10-rc2 vanilla and
experienced the same:
>>EIP; c00b55a0 <jffs2_garbage_collect_metadata+2a4/2e0> <=====
>>r3; c0179f24 <init_thread_union+1f24/2000>
Trace; c00b5570 <jffs2_garbage_collect_metadata+274/2e0>
Trace; c00b53c8 <jffs2_garbage_collect_metadata+cc/2e0>
Trace; c00b51e4 <jffs2_garbage_collect_pristine+4c4/5dc>
Trace; c00b5904 <jffs2_garbage_collect_hole+d0/478>
Trace; c00b56dc <jffs2_garbage_collect_dirent+100/1cc>
Trace; c00b78ac <jffs2_do_setattr+38/780>
Trace; c00b777c <jffs2_garbage_collect_thread+cc/1c4>
Trace; c00b7ee4 <jffs2_do_setattr+670/780>
Trace; c00b7e4c <jffs2_do_setattr+5d8/780>
Trace; c00b8130 <jffs2_read_inode+58/2f8>
>>r8; c017e040 <def_chr_fops+1c/64>
Trace; c00b7f9c <jffs2_do_setattr+728/780>
Trace; c00789f4 <generic_shutdown_super+70/178>
Trace; c0078998 <generic_shutdown_super+14/178>
Trace; c008fe8c <__mntput+2c/30>
Trace; c008fe08 <clone_mnt+94/ec>
Trace; c0090610 <copy_tree+24/174>
Trace; c00904c0 <do_umount+1bc/1c0>
Trace; c0090a5c <do_loopback+160/1c0>
Trace; c00909b4 <do_loopback+b8/1c0>
Trace; c0008f18 <do_mount_root+30/bc>
>>r8; c0190600 <uidhash_table+7c8/800>
>>r7; c015a8e8 <border+28/4c>
Trace; c0008ee8 <do_mount_root+0/bc>
Trace; c0008ffc <mount_block_root+58/124>
Trace; c0008fa4 <mount_block_root+0/124>
Trace; c0009194 <prepare_namespace+60/a0>
>>r4; c0016628 <tmp_cmdline.1+3a8/400>
Trace; c0009134 <prepare_namespace+0/a0>
Trace; c0017258 <thash_entries+204/fac>
>>r4; c015a700 <__lock_text_end+42c/5ec>
Trace; c0017204 <thash_entries+1b0/fac>
Trace; c00359cc <__set_special_pids+54/8c>
Code; c00b5590 <jffs2_garbage_collect_metadata+294/2e0>
00000000 <_EIP>:
Code; c00b5590 <jffs2_garbage_collect_metadata+294/2e0>
0: 05 00 00 0a 04 add $0x40a0000,%eax
Code; c00b5595 <jffs2_garbage_collect_metadata+299/2e0>
5: 10 a0 e1 07 00 a0 adc %ah,0xa00007e1(%eax)
Code; c00b559b <jffs2_garbage_collect_metadata+29f/2e0>
b: e1 d1 loope ffffffde <_EIP+0xffffffde>
Code; c00b559d <jffs2_garbage_collect_metadata+2a1/2e0>
d: e3 ff jecxz e <_EIP+0xe>
Code; c00b559f <jffs2_garbage_collect_metadata+2a3/2e0> <=====
f: eb 00 jmp 11 <_EIP+0x11> <=====
Code; c00b55a1 <jffs2_garbage_collect_metadata+2a5/2e0>
11: 40 inc %eax
Code; c00b55a2 <jffs2_garbage_collect_metadata+2a6/2e0>
12: 94 xchg %eax,%esp
Code; c00b55a3 <jffs2_garbage_collect_metadata+2a7/2e0>
13: e5 00 in $0x0,%eax
<0>Kernel panic - not syncing: Attempted to kill init!
1 error issued. Results may not be reliable.
I just wanted to inform you to guide to direction where to search.
Also "fixing" with booting 2.6.9 once helps here :)
I haven't found out yet how to test with emulation driver on host PC.
Konsti
--
GPG KeyID EF62FCEF
Fingerprint: 13C9 B16B 9844 EC15 CC2E A080 1E69 3FDA EF62 FCEF
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-18 16:35 jffs2 Oops on 2.6.10-rc2 Konstantin Kletschke
@ 2004-11-18 17:20 ` Konstantin Kletschke
2004-11-20 13:57 ` David Woodhouse
1 sibling, 0 replies; 16+ messages in thread
From: Konstantin Kletschke @ 2004-11-18 17:20 UTC (permalink / raw)
To: linux-mtd
In nodemgmt.c I remove the following code, which was added after 2.6.9:
#undef KONSTI
#ifdef KONSTI
/* Nodes which have been marked obsolete no longer need to be
associated with any inode. Remove them from the per-inode list */
if (ref->next_in_ino) {
struct jffs2_inode_cache *ic;
struct jffs2_raw_node_ref **p;
ic = jffs2_raw_ref_to_ic(ref);
for (p = &ic->nodes; (*p) != ref; p = &((*p)->next_in_ino))
;
*p = ref->next_in_ino;
ref->next_in_ino = NULL;
}
/* Merge with the next node in the physical list, if there is one
and if it's also obsolete. */
if (ref->next_phys && ref_obsolete(ref->next_phys) ) {
struct jffs2_raw_node_ref *n = ref->next_phys;
ref->__totlen += n->__totlen;
ref->next_phys = n->next_phys;
if (jeb->last_node == n) jeb->last_node = ref;
if (jeb->gc_node == n) {
/* gc will be happy continuing gc on this node */
jeb->gc_node=ref;
}
BUG_ON(n->next_in_ino);
jffs2_free_raw_node_ref(n);
}
/* Also merge with the previous node in the list, if there is one
and that one is obsolete */
if (ref != jeb->first_node ) {
struct jffs2_raw_node_ref *p = jeb->first_node;
while (p->next_phys != ref)
p = p->next_phys;
if (ref_obsolete(p) ) {
p->__totlen += ref->__totlen;
if (jeb->last_node == ref) {
jeb->last_node = p;
}
if (jeb->gc_node == ref) {
/* gc will be happy continuing gc on this node */
jeb->gc_node=p;
}
p->next_phys = ref->next_phys;
jffs2_free_raw_node_ref(ref);
}
}
#endif
That helps, the Kernel doesn't Oops on fresh flashed filesystem. Don't know
if the error is this code or only triggered by it though.
Konsti
--
GPG KeyID EF62FCEF
Fingerprint: 13C9 B16B 9844 EC15 CC2E A080 1E69 3FDA EF62 FCEF
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-18 16:35 jffs2 Oops on 2.6.10-rc2 Konstantin Kletschke
2004-11-18 17:20 ` Konstantin Kletschke
@ 2004-11-20 13:57 ` David Woodhouse
2004-11-20 14:47 ` David Woodhouse
2004-11-20 14:50 ` Konstantin Kletschke
1 sibling, 2 replies; 16+ messages in thread
From: David Woodhouse @ 2004-11-20 13:57 UTC (permalink / raw)
To: Konstantin Kletschke; +Cc: linux-mtd
On Thu, 2004-11-18 at 17:35 +0100, Konstantin Kletschke wrote:
> Well I tried out the jffs2 which is in 2.6.10-rc2 vanilla and
> experienced the same:
Is this with an SMP or preemptable kernel? If so, I think I see the
problem. Does it also fix it if you wrap the code you disabled with
spin_lock(&c->erase_completion_lock);
<...>
spin_unlock(&c->erase_completion_lock);
?
--
dwmw2
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 13:57 ` David Woodhouse
@ 2004-11-20 14:47 ` David Woodhouse
2004-11-20 14:50 ` Konstantin Kletschke
1 sibling, 0 replies; 16+ messages in thread
From: David Woodhouse @ 2004-11-20 14:47 UTC (permalink / raw)
To: Konstantin Kletschke; +Cc: linux-mtd
[-- Attachment #1: Type: text/plain, Size: 961 bytes --]
On Sat, 2004-11-20 at 13:57 +0000, David Woodhouse wrote:
> On Thu, 2004-11-18 at 17:35 +0100, Konstantin Kletschke wrote:
> > Well I tried out the jffs2 which is in 2.6.10-rc2 vanilla and
> > experienced the same:
>
> Is this with an SMP or preemptable kernel? If so, I think I see the
> problem. Does it also fix it if you wrap the code you disabled with
> spin_lock(&c->erase_completion_lock);
> <...>
> spin_unlock(&c->erase_completion_lock);
Alternatively try the better fix I committed to CVS, which is attached.
There was another race in jffs2_mark_node_obsolete() anyway -- we were
marking the ref as REF_OBSOLETE and then potentially filing its
eraseblock onto the erase_pending_list, but then we were dropping the
lock -- and nothing was preventing the erase code from actually erasing
the block and then freeing 'ref' before we got round to clearing the
JFFS2_NODETYPE_OBSOLETE bit and trying to merge with adjacent obsolete
refs.
--
dwmw2
[-- Attachment #2: Attached message - mtd/fs/jffs2 nodemgmt.c,1.111,1.112 --]
[-- Type: message/rfc822, Size: 7876 bytes --]
From: David Woodhouse <dwmw2@infradead.org>
To: linux-mtd-cvs@lists.infradead.org
Subject: mtd/fs/jffs2 nodemgmt.c,1.111,1.112
Date: Sat, 20 Nov 2004 14:25:09 +0000
Message-ID: <E1CVWAn-0004sU-3M@phoenix.infradead.org>
Update of /home/cvs/mtd/fs/jffs2
In directory phoenix.infradead.org:/tmp/cvs-serv18719
Modified Files:
nodemgmt.c
Log Message:
Fix race in jffs2_mark_node_obsolete(). There was nothing preventing the
block from being erased and 'ref' from being freed before we even got
around to marking it obsolete and then trying to merge nodes.
Index: nodemgmt.c
===================================================================
RCS file: /home/cvs/mtd/fs/jffs2/nodemgmt.c,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -r1.111 -r1.112
--- nodemgmt.c 16 Nov 2004 20:36:11 -0000 1.111
+++ nodemgmt.c 20 Nov 2004 14:25:05 -0000 1.112
@@ -399,6 +399,17 @@
}
jeb = &c->blocks[blocknr];
+ if (jffs2_can_mark_obsolete(c) && !jffs2_is_readonly(c) &&
+ !(c->flags & JFFS2_SB_FLAG_MOUNTING)) {
+ /* Hm. This may confuse static lock analysis. If any of the above
+ three conditions is false, we're going to return from this
+ function without actually obliterating any nodes or freeing
+ any jffs2_raw_node_refs. So we don't need to stop erases from
+ happening, or protect against people holding an obsolete
+ jffs2_raw_node_ref without the erase_completion_lock. */
+ down(&c->erase_free_sem);
+ }
+
spin_lock(&c->erase_completion_lock);
if (ref_flags(ref) == REF_UNCHECKED) {
@@ -463,6 +474,7 @@
marked obsolete on the flash at the time they _became_
obsolete, there was probably a reason for that. */
spin_unlock(&c->erase_completion_lock);
+ /* We didn't lock the erase_free_sem */
return;
}
@@ -515,53 +527,66 @@
spin_unlock(&c->erase_completion_lock);
- if (!jffs2_can_mark_obsolete(c))
- return;
- if (jffs2_is_readonly(c))
+ if (!jffs2_can_mark_obsolete(c) || jffs2_is_readonly(c)) {
+ /* We didn't lock the erase_free_sem */
return;
+ }
+
+ /* The erase_free_sem is locked, and has been since before we marked the node obsolete
+ and potentially put its eraseblock onto the erase_pending_list. Thus, we know that
+ the block hasn't _already_ been erased, and that 'ref' itself hasn't been freed yet
+ by jffs2_free_all_node_refs() in erase.c. Which is nice. */
D1(printk(KERN_DEBUG "obliterating obsoleted node at 0x%08x\n", ref_offset(ref)));
ret = jffs2_flash_read(c, ref_offset(ref), sizeof(n), &retlen, (char *)&n);
if (ret) {
printk(KERN_WARNING "Read error reading from obsoleted node at 0x%08x: %d\n", ref_offset(ref), ret);
- return;
+ goto out_erase_sem;
}
if (retlen != sizeof(n)) {
printk(KERN_WARNING "Short read from obsoleted node at 0x%08x: %zd\n", ref_offset(ref), retlen);
- return;
+ goto out_erase_sem;
}
if (PAD(je32_to_cpu(n.totlen)) != PAD(ref_totlen(c, jeb, ref))) {
printk(KERN_WARNING "Node totlen on flash (0x%08x) != totlen from node ref (0x%08x)\n", je32_to_cpu(n.totlen), ref_totlen(c, jeb, ref));
- return;
+ goto out_erase_sem;
}
if (!(je16_to_cpu(n.nodetype) & JFFS2_NODE_ACCURATE)) {
D1(printk(KERN_DEBUG "Node at 0x%08x was already marked obsolete (nodetype 0x%04x)\n", ref_offset(ref), je16_to_cpu(n.nodetype)));
- return;
+ goto out_erase_sem;
}
/* XXX FIXME: This is ugly now */
n.nodetype = cpu_to_je16(je16_to_cpu(n.nodetype) & ~JFFS2_NODE_ACCURATE);
ret = jffs2_flash_write(c, ref_offset(ref), sizeof(n), &retlen, (char *)&n);
if (ret) {
printk(KERN_WARNING "Write error in obliterating obsoleted node at 0x%08x: %d\n", ref_offset(ref), ret);
- return;
+ goto out_erase_sem;
}
if (retlen != sizeof(n)) {
printk(KERN_WARNING "Short write in obliterating obsoleted node at 0x%08x: %zd\n", ref_offset(ref), retlen);
- return;
+ goto out_erase_sem;
}
/* Nodes which have been marked obsolete no longer need to be
- associated with any inode. Remove them from the per-inode list */
+ associated with any inode. Remove them from the per-inode list.
+
+ Note we can't do this for NAND at the moment because we need
+ obsolete dirent nodes to stay on the lists, because of the
+ horridness in jffs2_garbage_collect_deletion_dirent(). */
if (ref->next_in_ino) {
struct jffs2_inode_cache *ic;
struct jffs2_raw_node_ref **p;
+ spin_lock(&c->erase_completion_lock);
+
ic = jffs2_raw_ref_to_ic(ref);
for (p = &ic->nodes; (*p) != ref; p = &((*p)->next_in_ino))
;
*p = ref->next_in_ino;
ref->next_in_ino = NULL;
+
+ spin_unlock(&c->erase_completion_lock);
}
@@ -570,6 +595,8 @@
if (ref->next_phys && ref_obsolete(ref->next_phys) ) {
struct jffs2_raw_node_ref *n = ref->next_phys;
+ spin_lock(&c->erase_completion_lock);
+
ref->__totlen += n->__totlen;
ref->next_phys = n->next_phys;
if (jeb->last_node == n) jeb->last_node = ref;
@@ -577,6 +604,8 @@
/* gc will be happy continuing gc on this node */
jeb->gc_node=ref;
}
+ spin_unlock(&c->erase_completion_lock);
+
BUG_ON(n->next_in_ino);
jffs2_free_raw_node_ref(n);
}
@@ -585,7 +614,9 @@
and that one is obsolete */
if (ref != jeb->first_node ) {
struct jffs2_raw_node_ref *p = jeb->first_node;
-
+
+ spin_lock(&c->erase_completion_lock);
+
while (p->next_phys != ref)
p = p->next_phys;
@@ -601,7 +632,10 @@
p->next_phys = ref->next_phys;
jffs2_free_raw_node_ref(ref);
}
+ spin_unlock(&c->erase_completion_lock);
}
+ out_erase_sem:
+ up(&c->erase_free_sem);
}
#if CONFIG_JFFS2_FS_DEBUG >= 2
__________________________________________________________
Linux-MTD CVS commit list
http://lists.infradead.org/mailman/listinfo/linux-mtd-cvs/
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 13:57 ` David Woodhouse
2004-11-20 14:47 ` David Woodhouse
@ 2004-11-20 14:50 ` Konstantin Kletschke
2004-11-20 14:57 ` David Woodhouse
2004-11-20 15:12 ` David Woodhouse
1 sibling, 2 replies; 16+ messages in thread
From: Konstantin Kletschke @ 2004-11-20 14:50 UTC (permalink / raw)
To: linux-mtd
Am 2004-11-20 13:57 +0000 schrieb David Woodhouse:
> Is this with an SMP or preemptable kernel? If so, I think I see the
Its not SMP but preemtive. Is this even recommend on an embedded system?
> problem. Does it also fix it if you wrap the code you disabled with
> spin_lock(&c->erase_completion_lock);
> <...>
> spin_unlock(&c->erase_completion_lock);
No, that does not help. I replaced my disabling #defines by the
lock<->unlcocp pair, no avail:
>>EIP; c00b1c74 <jffs2_build_remove_unlinked_inode+30/ec> <=====
>>r3; c0177f24 <log_wait+0/8>
Trace; c00b1c44 <jffs2_build_remove_unlinked_inode+0/ec>
Trace; c00b1a9c <jffs2_build_filesystem+1e4/38c>
Trace; c00b18b8 <jffs2_build_filesystem+0/38c>
Trace; c00b1fd8 <jffs2_do_mount_fs+228/270>
Trace; c00b1db0 <jffs2_do_mount_fs+0/270>
Trace; c00b3f80 <jffs2_do_fill_super+130/238>
Trace; c00b3e50 <jffs2_do_fill_super+0/238>
Trace; c00b45b8 <jffs2_get_sb_mtd+98/f8>
Trace; c00b4520 <jffs2_get_sb_mtd+0/f8>
Trace; c00b4804 <jffs2_get_sb+194/1d0>
>>r8; c017bdf0 <jffs2_fs_type+0/20>
Trace; c00b4670 <jffs2_get_sb+0/1d0>
Trace; c00750c0 <do_kern_mount+5c/f4>
Trace; c0075064 <do_kern_mount+0/f4>
Trace; c008c558 <do_new_mount+84/b8>
Trace; c008c4d4 <do_new_mount+0/b8>
Trace; c008ccdc <do_mount+150/16c>
Trace; c008cb8c <do_mount+0/16c>
Trace; c008d128 <sys_mount+a8/f0>
Trace; c008d080 <sys_mount+0/f0>
Trace; c0008f18 <do_mount_root+30/bc>
>>r8; c018e3c8 <names_cachep+0/4>
>>r7; c01581c8 <__func__.1+458/f5f0>
Trace; c0008ee8 <do_mount_root+0/bc>
Trace; c0008ffc <mount_block_root+58/124>
Trace; c0008fa4 <mount_block_root+0/124>
Trace; c0009194 <prepare_namespace+60/a0>
>>r4; c0016648 <root_device_name+0/4>
Trace; c0009134 <prepare_namespace+0/a0>
Trace; c0017258 <init+54/f8>
>>r4; c0157fe0 <__func__.1+270/f5f0>
Trace; c0017204 <init+0/f8>
Trace; c00359cc <do_exit+0/500>
Code; c00b1c64 <jffs2_build_remove_unlinked_inode+20/ec>
00000000 <_EIP>:
Code; c00b1c64 <jffs2_build_remove_unlinked_inode+20/ec>
0: 05 00 00 0a 04 add $0x40a0000,%eax
Code; c00b1c69 <jffs2_build_remove_unlinked_inode+25/ec>
5: 10 a0 e1 07 00 a0 adc %ah,0xa00007e1(%eax)
Code; c00b1c6f <jffs2_build_remove_unlinked_inode+2b/ec>
b: e1 cd loope ffffffda <_EIP+0xffffffda>
Code; c00b1c71 <jffs2_build_remove_unlinked_inode+2d/ec>
d: e3 ff jecxz e <_EIP+0xe>
Code; c00b1c73 <jffs2_build_remove_unlinked_inode+2f/ec> <=====
f: eb 00 jmp 11 <_EIP+0x11> <=====
Code; c00b1c75 <jffs2_build_remove_unlinked_inode+31/ec>
11: 40 inc %eax
Code; c00b1c76 <jffs2_build_remove_unlinked_inode+32/ec>
12: 94 xchg %eax,%esp
Code; c00b1c77 <jffs2_build_remove_unlinked_inode+33/ec>
13: e5 00 in $0x0,%eax
<0>Kernel panic - not syncing: Attempted to kill init!
1 error issued. Results may not be reliable.
Even disabling preemtion generates the same Oops :(
Regards, Konsti
--
GPG KeyID EF62FCEF
Fingerprint: 13C9 B16B 9844 EC15 CC2E A080 1E69 3FDA EF62 FCEF
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 14:50 ` Konstantin Kletschke
@ 2004-11-20 14:57 ` David Woodhouse
2004-11-20 15:13 ` Artem B. Bityuckiy
` (2 more replies)
2004-11-20 15:12 ` David Woodhouse
1 sibling, 3 replies; 16+ messages in thread
From: David Woodhouse @ 2004-11-20 14:57 UTC (permalink / raw)
To: Konstantin Kletschke; +Cc: linux-mtd
On Sat, 2004-11-20 at 15:50 +0100, Konstantin Kletschke wrote:
> No, that does not help. I replaced my disabling #defines by the
> lock<->unlcocp pair, no avail:
Hm, OK. I don't think the other patch is likely to fix it either then.
I'll take another look.
Are you able to join us on IRC? Channel #mtd of irc.freenode.net
--
dwmw2
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 14:50 ` Konstantin Kletschke
2004-11-20 14:57 ` David Woodhouse
@ 2004-11-20 15:12 ` David Woodhouse
1 sibling, 0 replies; 16+ messages in thread
From: David Woodhouse @ 2004-11-20 15:12 UTC (permalink / raw)
To: Konstantin Kletschke; +Cc: linux-mtd
On Sat, 2004-11-20 at 15:50 +0100, Konstantin Kletschke wrote:
> >>EIP; c00b1c74 <jffs2_build_remove_unlinked_inode+30/ec> <=====
> Code; c00b1c71 <jffs2_build_remove_unlinked_inode+2d/ec>
> d: e3 ff jecxz e <_EIP+0xe>
> Code; c00b1c73 <jffs2_build_remove_unlinked_inode+2f/ec> <=====
> f: eb 00 jmp 11 <_EIP+0x11> <=====
> Code; c00b1c75 <jffs2_build_remove_unlinked_inode+31/ec>
> 11: 40 inc %eax
Would be nice to see the actual code at jffs2_b_r_u_i+0x30, which isn't
in the above. Can you show the output of 'objdump -d' for the function
in question? And/or the result of telling gdb 'list *0xc00b1c74' on your
vmlinux?
It would also be useful to see the output with CONFIG_JFFS2_FS_DEBUG=1
when mounting the offending file system.
--
dwmw2
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 14:57 ` David Woodhouse
@ 2004-11-20 15:13 ` Artem B. Bityuckiy
2004-11-20 16:28 ` Konstantin Kletschke
2004-11-20 16:31 ` Konstantin Kletschke
2004-11-20 16:35 ` Konstantin Kletschke
2 siblings, 1 reply; 16+ messages in thread
From: Artem B. Bityuckiy @ 2004-11-20 15:13 UTC (permalink / raw)
To: David Woodhouse; +Cc: linux-mtd
Just to exclude the race errors, could you try to disable Preemption and
try?
On Sat, 20 Nov 2004, David Woodhouse wrote:
> On Sat, 2004-11-20 at 15:50 +0100, Konstantin Kletschke wrote:
> > No, that does not help. I replaced my disabling #defines by the
> > lock<->unlcocp pair, no avail:
>
> Hm, OK. I don't think the other patch is likely to fix it either then.
> I'll take another look.
>
> Are you able to join us on IRC? Channel #mtd of irc.freenode.net
>
> --
> dwmw2
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
--
Best Regards,
Artem B. Bityuckiy,
St.-Petersburg, Russia.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 15:13 ` Artem B. Bityuckiy
@ 2004-11-20 16:28 ` Konstantin Kletschke
0 siblings, 0 replies; 16+ messages in thread
From: Konstantin Kletschke @ 2004-11-20 16:28 UTC (permalink / raw)
To: linux-mtd
Am 2004-11-20 15:13 +0000 schrieb Artem B. Bityuckiy:
> Just to exclude the race errors, could you try to disable Preemption and
> try?
Yes, I did, same error.
K
--
GPG KeyID EF62FCEF
Fingerprint: 13C9 B16B 9844 EC15 CC2E A080 1E69 3FDA EF62 FCEF
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 14:57 ` David Woodhouse
2004-11-20 15:13 ` Artem B. Bityuckiy
@ 2004-11-20 16:31 ` Konstantin Kletschke
2004-11-20 16:35 ` Konstantin Kletschke
2 siblings, 0 replies; 16+ messages in thread
From: Konstantin Kletschke @ 2004-11-20 16:31 UTC (permalink / raw)
To: linux-mtd
Am 2004-11-20 14:57 +0000 schrieb David Woodhouse:
> Hm, OK. I don't think the other patch is likely to fix it either then.
> I'll take another look.
OK, take your time :)
> Are you able to join us on IRC? Channel #mtd of irc.freenode.net
Argh, sadly not this weekend, I have a visit from my ex gf this evening
and I have a judo tournament on sunday, but on monday or so I will
definately show up in IRC if this is sufficient :)
Regards, Konsti
--
GPG KeyID EF62FCEF
Fingerprint: 13C9 B16B 9844 EC15 CC2E A080 1E69 3FDA EF62 FCEF
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 16:35 ` Konstantin Kletschke
@ 2004-11-20 16:34 ` David Woodhouse
2004-11-22 10:27 ` Ian Campbell
0 siblings, 1 reply; 16+ messages in thread
From: David Woodhouse @ 2004-11-20 16:34 UTC (permalink / raw)
To: Konstantin Kletschke; +Cc: linux-mtd
[-- Attachment #1: Type: text/plain, Size: 309 bytes --]
On Sat, 2004-11-20 at 17:35 +0100, Konstantin Kletschke wrote:
> Sadly I overlooked your other (cvs comitted) patch this evening and I am
> at home now, what a pity... That would have cleared the situation up in
> 5 minutes :/
No it wouldn't -- that isn't the problem either. I _think_ this is...
--
dwmw2
[-- Attachment #2: Attached message - mtd/fs/jffs2 build.c,1.64,1.65 --]
[-- Type: message/rfc822, Size: 3393 bytes --]
From: David Woodhouse <dwmw2@infradead.org>
To: linux-mtd-cvs@lists.infradead.org
Subject: mtd/fs/jffs2 build.c,1.64,1.65
Date: Sat, 20 Nov 2004 16:19:42 +0000
Message-ID: <E1CVXxd-00050i-W8@phoenix.infradead.org>
Update of /home/cvs/mtd/fs/jffs2
In directory phoenix.infradead.org:/tmp/cvs-serv19258
Modified Files:
build.c
Log Message:
Fix freeing of refs belonging to unlinked inode
Index: build.c
===================================================================
RCS file: /home/cvs/mtd/fs/jffs2/build.c,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -r1.64 -r1.65
--- build.c 20 Nov 2004 10:44:07 -0000 1.64
+++ build.c 20 Nov 2004 16:19:38 -0000 1.65
@@ -191,9 +191,12 @@
D1(printk(KERN_DEBUG "JFFS2: Removing ino #%u with nlink == zero.\n", ic->ino));
- for (raw = ic->nodes; raw != (void *)ic; raw = raw->next_in_ino) {
+ raw = ic->nodes;
+ while (raw != (void *)ic) {
+ struct jffs2_raw_node_ref *next = raw->next_in_ino;
D1(printk(KERN_DEBUG "obsoleting node at 0x%08x\n", ref_offset(raw)));
jffs2_mark_node_obsolete(c, raw);
+ raw = next;
}
if (ic->scan_dents) {
__________________________________________________________
Linux-MTD CVS commit list
http://lists.infradead.org/mailman/listinfo/linux-mtd-cvs/
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 14:57 ` David Woodhouse
2004-11-20 15:13 ` Artem B. Bityuckiy
2004-11-20 16:31 ` Konstantin Kletschke
@ 2004-11-20 16:35 ` Konstantin Kletschke
2004-11-20 16:34 ` David Woodhouse
2 siblings, 1 reply; 16+ messages in thread
From: Konstantin Kletschke @ 2004-11-20 16:35 UTC (permalink / raw)
To: linux-mtd
Am 2004-11-20 14:57 +0000 schrieb David Woodhouse:
> On Sat, 2004-11-20 at 15:50 +0100, Konstantin Kletschke wrote:
> > No, that does not help. I replaced my disabling #defines by the
> > lock<->unlcocp pair, no avail:
>
> Hm, OK. I don't think the other patch is likely to fix it either then.
> I'll take another look.
Sadly I overlooked your other (cvs comitted) patch this evening and I am
at home now, what a pity... That would have cleared the situation up in
5 minutes :/
K
--
GPG KeyID EF62FCEF
Fingerprint: 13C9 B16B 9844 EC15 CC2E A080 1E69 3FDA EF62 FCEF
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-20 16:34 ` David Woodhouse
@ 2004-11-22 10:27 ` Ian Campbell
2004-11-22 10:50 ` Ian Campbell
0 siblings, 1 reply; 16+ messages in thread
From: Ian Campbell @ 2004-11-22 10:27 UTC (permalink / raw)
To: linux-mtd
On Sat, 2004-11-20 at 16:34 +0000, David Woodhouse wrote:
> On Sat, 2004-11-20 at 17:35 +0100, Konstantin Kletschke wrote:
> > Sadly I overlooked your other (cvs comitted) patch this evening and I am
> > at home now, what a pity... That would have cleared the situation up in
> > 5 minutes :/
>
> No it wouldn't -- that isn't the problem either. I _think_ this is...
Just FYI, either this fix (to build.c) or the other one (to nodemgmt.c)
also fixed the BUG_ON I reported earlier in the month...
Many thanks!
Ian.
--
Ian Campbell, Senior Design Engineer
Web: http://www.arcom.com
Arcom, Clifton Road, Direct: +44 (0)1223 403 465
Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-22 10:27 ` Ian Campbell
@ 2004-11-22 10:50 ` Ian Campbell
2004-11-22 11:05 ` David Woodhouse
0 siblings, 1 reply; 16+ messages in thread
From: Ian Campbell @ 2004-11-22 10:50 UTC (permalink / raw)
To: linux-mtd
On Mon, 2004-11-22 at 10:27 +0000, Ian Campbell wrote:
> On Sat, 2004-11-20 at 16:34 +0000, David Woodhouse wrote:
> > On Sat, 2004-11-20 at 17:35 +0100, Konstantin Kletschke wrote:
> > > Sadly I overlooked your other (cvs comitted) patch this evening and I am
> > > at home now, what a pity... That would have cleared the situation up in
> > > 5 minutes :/
> >
> > No it wouldn't -- that isn't the problem either. I _think_ this is...
>
> Just FYI, either this fix (to build.c) or the other one (to nodemgmt.c)
> also fixed the BUG_ON I reported earlier in the month...
Gah! Looks like I spoke to soon. Even with both of these patches I still
see the BUG_ON, I've turned off pre-empt as well.
kernel BUG at /home/icampbell/devel/kernel/arm/2.6/fs/jffs2/nodemgmt.c:609!
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c3b58000
[00000000] *pgd=a3a87011, *pte=00000000, *ppte=00000000
Internal error: Oops: 807 [#1]
Modules linked in: ds1307
CPU: 0
PC is at __bug+0x40/0x54
LR is at 0x1
pc : [<c0023274>] lr : [<00000001>] Not tainted
sp : c3b1fc14 ip : 60000093 fp : c3b1fc24
r10: c3cc4d04 r9 : c3b1fc44 r8 : c3c47400
r7 : c02c12c0 r6 : c3b1fc3c r5 : 00000000 r4 : 00000000
r3 : 00000000 r2 : 00000000 r1 : 60000013 r0 : 00000001
Flags: nZCv IRQs on FIQs on Mode SVC_32 Segment user
Control: 397F Table: A3B58000 DAC: 00000015
Process rpc.statd (pid: 1011, stack limit = 0xc3b1e190)
Stack: (0xc3b1fc14 to 0xc3b20000)
fc00: c3cc4cf4 c3b1fc78 c3b1fc28
fc20: c00b9764 c0023240 c3b1fc3c c3b1fc44 00000000 00000000 c3c47400 0000000c
fc40: c3b1c002 c0021985 00000048 d22144a5 c3f52ccc c3f52ccc c3f52dac 00000004
fc60: c3805844 c3c47400 c3f9fe24 c3b1fc8c c3b1fc7c c00b9dec c00b9174 00000004
fc80: c3b1fcb8 c3b1fc90 c00ba11c c00b9da8 c3f9fe24 00000000 00000000 c00184f4
fca0: c3805830 00000000 c3c47400 c3b1fd18 c3b1fcbc c00bbdd4 c00b9e0c 00000004
fcc0: 01da5b58 00000003 00000000 00000000 c3ab7000 00000004 00000004 c3ab7000
fce0: 0001a4a8 01da5b58 86dabaa9 86dabaa9 c3b1fd3c c001851c c0018518 c00184f4
fd00: c3805858 00000000 c02706e0 c3b1fd6c c3b1fd1c c00b75b8 c00bba94 00000000
fd20: 00000004 c3b1fd38 c3c47400 c3805830 00000004 00000000 00000000 41a1a5a0
fd40: 41a1a5a0 c02706e0 00000004 00000000 00000000 00000000 00000000 00000004
fd60: c3b1fe0c c3b1fd70 c004e818 c00b741c 00000004 00000000 00018310 c3805858
fd80: c01b4d88 c38058f0 c38c5ae0 00000001 c3b1fe78 00000000 c3b1ff18 00000000
fda0: 1b80589c 00000000 00000000 c3b1fdb8 c0089828 c00c1d4c c02706e0 00000000
fdc0: c3805858 00000001 c38058a4 c380589c 41a1a5a0 c3b1fe10 c3b1fde4 c00814d0
fde0: c00897fc 00000000 00000000 00000000 c38c5ae0 c3b1fe40 00000000 00000000
fe00: c3b1fe74 c3b1fe14 c004f060 c004e4cc 00000000 00000000 c3b1ff78 00000004
fe20: 00000000 00000000 c3805858 00000004 c3b1ff78 c3b1ff18 c3b1fe78 00000001
fe40: 00000004 00000000 00000000 c3f7fd00 c3b1fed8 c3b1fe78 00000000 00000000
fe60: c3b1e000 c3b1ff78 c3b1ff10 c3b1fe78 c004f110 c004ec24 c3f7fd00 00000000
fe80: 00000000 00000001 ffffffff c38c5ae0 c3fec3e4 00000000 c3b1e000 00000000
fea0: c004f568 c3a0dff8 c3f7fd00 00000000 00000000 beffe000 c3a0dff8 c01eb614
fec0: c3b1ff04 c3b1fed0 c005c0c0 c0024ab8 c3f7fd00 c004743c c3b1fed8 c3b1fed8
fee0: 00000000 c3fef46c beffe000 c3b1e000 c38058c0 c38058f0 00000000 c3805858
ff00: c38c5ae0 c3b1ff44 c3b1ff14 c004f270 c004f098 00000006 00018310 00000004
ff20: c38c5ae0 00000000 00000000 00000004 c3b1ff78 00018310 c3b1ff74 c3b1ff48
ff40: c0067d24 c004f220 c3b1ff54 c0067580 c38c5b04 c38c5ae0 c3b1ff78 00000000
ff60: 00000000 00000001 c3b1ffa4 c3b1ff78 c0067e08 c0067c4c 00000000 00000000
ff80: 00000000 00018310 00000006 00017d9c 00000004 c001ea24 00000000 c3b1ffa8
ffa0: c001e8a0 c0067dc8 00018310 c00251e0 00000006 00018310 00000004 00000000
ffc0: 00018310 00000006 00017d9c 0001830c 4016b074 0000b6dc 00000001 000181c4
ffe0: 00000000 befff8d4 00002678 40109a20 60000010 00000006 00000000 00000000
Backtrace:
[<c0023234>] (__bug+0x0/0x54) from [<c00b9764>] (jffs2_mark_node_obsolete+0x5fc/0x6ec)
r4 = C3CC4CF4
[<c00b9168>] (jffs2_mark_node_obsolete+0x0/0x6ec) from [<c00b9dec>] (jffs2_obsolete_node_frag+0x50/0x64)
[<c00b9d9c>] (jffs2_obsolete_node_frag+0x0/0x64) from [<c00ba11c>] (jffs2_add_full_dnode_to_inode+0x31c/0x440)
r4 = 00000004
[<c00b9e00>] (jffs2_add_full_dnode_to_inode+0x0/0x440) from [<c00bbdd4>] (jffs2_write_inode_range+0x34c/0x460)
[<c00bba88>] (jffs2_write_inode_range+0x0/0x460) from [<c00b75b8>] (jffs2_commit_write+0x1a8/0x304)
[<c00b7410>] (jffs2_commit_write+0x0/0x304) from [<c004e818>] (generic_file_buffered_write+0x35c/0x5b8)
[<c004e4c0>] (generic_file_buffered_write+0x4/0x5b8) from [<c004f060>] (__generic_file_aio_write_nolock+0x448/0x474)
[<c004ec18>] (__generic_file_aio_write_nolock+0x0/0x474) from [<c004f110>] (__generic_file_write_nolock+0x84/0xb0)
[<c004f08c>] (__generic_file_write_nolock+0x0/0xb0) from [<c004f270>] (generic_file_write+0x5c/0xec)
r8 = C38C5AE0 r7 = C3805858 r6 = 00000000 r5 = C38058F0
r4 = C38058C0
[<c004f214>] (generic_file_write+0x0/0xec) from [<c0067d24>] (vfs_write+0xe4/0x108)
[<c0067c40>] (vfs_write+0x0/0x108) from [<c0067e08>] (sys_write+0x4c/0x74)
[<c0067dbc>] (sys_write+0x0/0x74) from [<c001e8a0>] (ret_fast_syscall+0x0/0x2c)
r8 = C001EA24 r7 = 00000004 r6 = 00017D9C r5 = 00000006
r4 = 00018310
Code: 1b00434a e59f0014 eb004348 e3a03000 (e5833000)
--
Ian Campbell, Senior Design Engineer
Web: http://www.arcom.com
Arcom, Clifton Road, Direct: +44 (0)1223 403 465
Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-22 10:50 ` Ian Campbell
@ 2004-11-22 11:05 ` David Woodhouse
2004-11-22 11:42 ` Ian Campbell
0 siblings, 1 reply; 16+ messages in thread
From: David Woodhouse @ 2004-11-22 11:05 UTC (permalink / raw)
To: Ian Campbell; +Cc: linux-mtd
On Mon, 2004-11-22 at 10:50 +0000, Ian Campbell wrote:
> Gah! Looks like I spoke to soon. Even with both of these patches I still
> see the BUG_ON, I've turned off pre-empt as well.
Quick fix... I suspect the real answer is a pass after the mount has
completed which merges all already-adjacent obsolete nodes, and
disassociates them from their inode.
Index: nodemgmt.c
===================================================================
RCS file: /home/cvs/mtd/fs/jffs2/nodemgmt.c,v
retrieving revision 1.114
diff -u -p -r1.114 nodemgmt.c
--- nodemgmt.c 20 Nov 2004 16:39:59 -0000 1.114
+++ nodemgmt.c 22 Nov 2004 11:03:49 -0000
@@ -601,8 +601,9 @@ void jffs2_mark_node_obsolete(struct jff
/* Merge with the next node in the physical list, if there is one
- and if it's also obsolete. */
- if (ref->next_phys && ref_obsolete(ref->next_phys) ) {
+ and if it's also obsolete and if it doesn't belong to any inode */
+ if (ref->next_phys && ref_obsolete(ref->next_phys) &&
+ !ref->next_phys->next_in_ino) {
struct jffs2_raw_node_ref *n = ref->next_phys;
spin_lock(&c->erase_completion_lock);
--
dwmw2
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: jffs2 Oops on 2.6.10-rc2
2004-11-22 11:05 ` David Woodhouse
@ 2004-11-22 11:42 ` Ian Campbell
0 siblings, 0 replies; 16+ messages in thread
From: Ian Campbell @ 2004-11-22 11:42 UTC (permalink / raw)
To: David Woodhouse; +Cc: linux-mtd
On Mon, 2004-11-22 at 11:05 +0000, David Woodhouse wrote:
> On Mon, 2004-11-22 at 10:50 +0000, Ian Campbell wrote:
> > Gah! Looks like I spoke to soon. Even with both of these patches I still
> > see the BUG_ON, I've turned off pre-empt as well.
>
> Quick fix...
It's looking good. Many thanks!
Ian.
--
Ian Campbell, Senior Design Engineer
Web: http://www.arcom.com
Arcom, Clifton Road, Direct: +44 (0)1223 403 465
Cambridge CB1 7EA, United Kingdom Phone: +44 (0)1223 411 200
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2004-11-22 11:43 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-18 16:35 jffs2 Oops on 2.6.10-rc2 Konstantin Kletschke
2004-11-18 17:20 ` Konstantin Kletschke
2004-11-20 13:57 ` David Woodhouse
2004-11-20 14:47 ` David Woodhouse
2004-11-20 14:50 ` Konstantin Kletschke
2004-11-20 14:57 ` David Woodhouse
2004-11-20 15:13 ` Artem B. Bityuckiy
2004-11-20 16:28 ` Konstantin Kletschke
2004-11-20 16:31 ` Konstantin Kletschke
2004-11-20 16:35 ` Konstantin Kletschke
2004-11-20 16:34 ` David Woodhouse
2004-11-22 10:27 ` Ian Campbell
2004-11-22 10:50 ` Ian Campbell
2004-11-22 11:05 ` David Woodhouse
2004-11-22 11:42 ` Ian Campbell
2004-11-20 15:12 ` David Woodhouse
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox