Messages in this thread Patch in this message | | | Date | Wed, 27 Jul 2005 18:11:47 +0400 | From | "Vladimir V. Saveliev" <> | Subject | Re: Reiserfs 3.6 + quota enabled, crash on delete |
| |
Hello
Guillaume Pelat wrote: > Hi, > > I'm having a crash with reiserfs 3.6 + user quota enabled, on 2.6.11.10 > kernel (no smp), apparently when deleting files (or maybe during a > truncate operation). The problem seems to happen under high load. > When the error occurs, all the processes accessing the reiserfs > partition seems to hang. This problem happened several times on > different servers (having the same hardware configuration) during last > weeks. > > You can find the error logs below : > > ====================================================================== > ReiserFS: sda3: warning: vs-15011: reiserfs_release_objectid: tried to > free free object id (96557091) > ReiserFS: sda3: warning: PAP-5660: reiserfs_do_truncate: wrong result -1 > of search for [847141 185744 0xfffffffffffffff DIRECT] > ReiserFS: sda3: warning: clm-2100: nesting info a different FS
The attached patch should help to get rid of clm-2100 and to avoid crash.
Also, I think you should reiserfsck sda3.
> ReiserFS: sda3: warning: clm-2100: nesting info a different FS > ReiserFS: sda3: warning: clm-2100: nesting info a different FS > ReiserFS: sda3: warning: clm-2100: nesting info a different FS > REISERFS: panic (device sda3): journal-1577: handle trans id 1122409068 > != current trans id 3947596 > ------------[ cut here ]------------ > kernel BUG at fs/reiserfs/prints.c:362! > invalid operand: 0000 [#1] > CPU: 0 > EIP: 0060:[<c019785f>] Not tainted VLI > EFLAGS: 00010282 (2.6.11.6) > EIP is at reiserfs_panic+0x4f/0x80 > eax: 00000068 ebx: c02be9bf ecx: c038e8f8 edx: c02eecac > esi: f7eea000 edi: f7eea140 ebp: f3391944 esp: f339192c > ds: 007b es: 007b ss: 0068 > Process pure-ftpd (pid: 27841, threadinfo=f3390000 task=d3053530) > Stack: c02c3ee0 f7eea140 c03b3580 f7eea000 00000000 f895d000 f3391984 > c01a6d01 > f7eea000 c02c6440 42e69a6c 003c3c4c 00000002 f3391970 cdc49b40 > 00000002 > cdc49b40 f3391984 00000000 052f8dee 00000000 f2bbfe60 f3391a08 > c019ebba > Call Trace: > [<c010282f>] show_stack+0x7f/0xa0 > [<c01029d1>] show_registers+0x151/0x1c0 > [<c0102bc8>] die+0xc8/0x150 > [<c010307c>] do_invalid_op+0xbc/0xd0 > [<c01024bb>] error_code+0x2b/0x30 > [<c01a6d01>] journal_mark_dirty+0x271/0x2a0 > [<c019ebba>] prepare_for_delete_or_cut+0x54a/0x720 > [<c019fdaa>] reiserfs_cut_from_item+0xca/0x5f0 > [<c01a0668>] reiserfs_do_truncate+0x2e8/0x610 > [<c019f7ef>] reiserfs_delete_object+0x3f/0x80 > [<c018636c>] reiserfs_delete_inode+0x8c/0x110 > [<c015ed85>] generic_delete_inode+0x95/0x130 > [<c015efc6>] iput+0x56/0x80 > [<c018995a>] reiserfs_new_inode+0x13a/0x740 > [<c01847b7>] reiserfs_create+0x97/0x1b0 > [<c0153e0f>] vfs_create+0x9f/0x120 > [<c01546f9>] open_namei+0x5d9/0x630 > [<c0144bbc>] filp_open+0x3c/0x60 > [<c0144ed6>] sys_open+0x46/0x90 > [<c0102313>] syscall_call+0x7/0xb > Code: 01 00 00 89 04 24 e8 31 fd ff ff c7 04 24 e0 3e 2c c0 85 f6 89 d8 > 0f 45 c7 ba 80 35 3b c0 89 54 24 08 89 44 24 04 e8 c1 a9 f7ff <0f> 0b 6a > 01 02 ef 2b c0 c7 04 24 20 3f 2c c0 85 f6 b9 80 35 3b > ====================================================================== >
This patch adds missing calls to journal_end on error handling code paths.
fs/reiserfs/inode.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-)
diff -puN fs/reiserfs/inode.c~reiserfs-add-missing-journal_end fs/reiserfs/inode.c --- linux-2.6.11.10/fs/reiserfs/inode.c~reiserfs-add-missing-journal_end 2005-07-27 18:03:06.197544430 +0400 +++ linux-2.6.11.10-vs/fs/reiserfs/inode.c 2005-07-27 18:04:07.363047159 +0400 @@ -46,6 +46,7 @@ void reiserfs_delete_inode (struct inode reiserfs_update_inode_transaction(inode) ; if (reiserfs_delete_object (&th, inode)) { + journal_end(&th, inode->i_sb, jbegin_count); up (&inode->i_sem); goto out; } @@ -2015,8 +2016,10 @@ int reiserfs_truncate_file(struct inode either appears truncated properly or not truncated at all */ add_save_link (&th, p_s_inode, 1); error = reiserfs_do_truncate (&th, p_s_inode, page, update_timestamps) ; - if (error) + if (error) { + journal_end (&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1); goto out; + } error = journal_end (&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1); if (error) goto out; _
| |