Bug in btrfs_rename (kernel BUG at fs/btrfs/inode.c:5595!)
I was running v2.6.33-rc2-187-g08d869a and everything was ok. Today I
decided to update the kernel (to v2.6.33-rc4) and a minute or two after logging into the gnome desktop this kernel bug appeared in dmesg. I then went back to the old kernel but the bug didn't disappear, not even after running btrfsck on the filesystem.
tom
------------[ cut here ]------------ kernel BUG at fs/btrfs/inode.c:5595!
invalid opcode: 0000 [#1] PREEMPT SMP
last sysfs file: /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq CPU 1
Pid: 2462, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6 #12 776295G/776295G
RIP: 0010:[<ffffffff8132e518>] [<ffffffff8132e518>] btrfs_rename+0x4c8/0x590 RSP: 0018:ffff88007a17dc78 EFLAGS: 00010282 RAX: 00000000ffffffef RBX: 0000000025fa67f8 RCX: ffff8800258b91b0 RDX: ffff880001d11c80 RSI: ffff8800258b9090 RDI: ffff8800258b9090 RBP: ffff88007a17dd38 R08: ffff880000000000 R09: 0000160000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 000000004b4e1863 R13: ffff880071086060 R14: 0000000000000000 R15: ffff88007105b300 FS: 00007f468759e700(0000) GS:ffff880001d00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000006d9c90 CR3: 000000007b15e000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process gconfd-2 (pid: 2462, threadinfo ffff88007a17c000, task ffff88007c3e5840) Stack: 00000000000000fb ffff88007c3e5840 00000a897c3e5840 00000a8a00000a00 <0> 010000af7a17dcb8 ffff88000ba0e000 ffff880071086438 ffff88007219d000 <0> ffff88007219d000 ffff8800701d41a0 ffff8800288e2d80 ffff880071086060 Call Trace: [<ffffffff8112b56a>] vfs_rename+0x3da/0x420 [<ffffffff8112d07e>] sys_renameat+0x23e/0x270 [<ffffffff8139529b>] ? _atomic_dec_and_lock+0x6b/0x90 [<ffffffff8113ac14>] ? mntput_no_expire+0x24/0xf0 [<ffffffff8111f448>] ? sys_fchmodat+0x78/0x100 [<ffffffff8112a19c>] ? path_put+0x2c/0x40 [<ffffffff8112d0c6>] sys_rename+0x16/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Code: 00 00 48 81 c7 b8 1a 00 00 e8 85 da d6 ff e9 56 fd ff ff 49 8b 77 10 48 8b bd 68 ff ff ff e8 80 fa ff ff 85 c0 0f 84 03 ff ff ff <0f> 0b eb fe 48 8b 75 80 48 8b bd 68 ff ff ff e8 24 15 01 00 e9 RIP [<ffffffff8132e518>] btrfs_rename+0x4c8/0x590 RSP <ffff88007a17dc78> ---[ end trace 613e6e60575556d3 ]---
Quoted 6 lines · Tomas Carnecky
I was running v2.6.33-rc2-187-g08d869a and everything was ok. Today I
decided to update the kernel (to v2.6.33-rc4) and a minute or two after logging into the gnome desktop this kernel bug appeared in dmesg. I then went back to the old kernel but the bug didn't disappear, not even after running btrfsck on the filesystem.
Ok will you please run with this patch? It shouldn't panic your box, since it seems ret is -EEXIST. Just watch your logs for
OH NO, ORPHAN ENTRY ALREADY EXISTS FOR <number>
and then look up and find all occurances of
Btrfs: orphan add <number>
with the stack trace and send it back to me so I can verify that nothing heinous is happening. I assume we're just racing with unlink/rename so all that needs to be done is to take that BUG_ON out, but it would be nice to know for sure. Thanks,
Josef
fs/btrfs/inode.c +8 -1
@@ -2096,6 +2096,13 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)*/ ret =btrfs_insert_orphan_item (trans, root, inode->i_ino); +printk (KERN_ERR "Btrfs: orphan add %llu\n" , (unsigned long long )inode->i_ino); +dump_stack (); +if (ret) { +printk (KERN_ERR "OH NO, ORPHAN ENTRY ALREADY EXISTS FOR %llu\n" , + (unsigned long long )inode->i_ino); + } +return ret; }
@@ -5592,7 +5599,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,BUG_ON (ret);if (new_inode->i_nlink ==0 ) { ret =btrfs_orphan_add (trans, new_dentry->d_inode); -BUG_ON (ret); +BUG_ON (ret && ret != -EEXIST ); } }
Quoted 12 lines · Josef Bacik
Quoted 6 lines · Tomas Carnecky
I was running v2.6.33-rc2-187-g08d869a and everything was ok. Today I
decided to update the kernel (to v2.6.33-rc4) and a minute or two after logging into the gnome desktop this kernel bug appeared in dmesg. I then went back to the old kernel but the bug didn't disappear, not even after running btrfsck on the filesystem.Ok will you please run with this patch? It shouldn't panic your box, since it seems ret is
-EEXIST. Just watch your logs forOH NO, ORPHAN ENTRY ALREADY EXISTS FOR<number>
Quoted 7 lines
and then look up and find all occurances of
Btrfs: orphan add<number>
with the stack trace and send it back to me so I can verify that nothing heinous is happening. I assume we're just racing with unlink/rename so all that needs to be done is to take that
BUG_ONout, but it would be nice to know for sure.
Btrfs: orphan add 3021394
Pid: 2029, comm: gdm Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15
Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8139aa65>] ? __up_write+0xe5/0x150 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021395 Pid: 2029, comm: gdm Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8139aa65>] ? __up_write+0xe5/0x150 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021384 Pid: 2029, comm: gdm Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8109de67>] ? __put_cred+0x37/0x50 [<ffffffff8109e0a2>] ? commit_creds+0xb2/0x120 [<ffffffff81090670>] ? sys_setresuid+0x150/0x160 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021385 Pid: 2345, comm: gdm Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e540>] btrfs_rename+0x4c0/0x590 [<ffffffff8112b56a>] vfs_rename+0x3da/0x420 [<ffffffff8112d07e>] sys_renameat+0x23e/0x270 [<ffffffff810fd6f8>] ? handle_mm_fault+0x188/0x840 [<ffffffff8109bf89>] ? up_read+0x9/0x10 [<ffffffff8105b071>] ? do_page_fault+0x141/0x2e0 [<ffffffff8112d0c6>] sys_rename+0x16/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 1891 Pid: 2357, comm: dbus-launch Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132ef33>] btrfs_setattr+0xf3/0x270 [<ffffffff81137b64>] notify_change+0x104/0x2e0 [<ffffffff8111f8ff>] do_truncate+0x5f/0x90 [<ffffffff8112a03c>] ? get_write_access+0x3c/0x60 [<ffffffff8112e4da>] do_filp_open+0x99a/0xf00 [<ffffffff8112a67d>] ? __lookup_hash+0xed/0x150 [<ffffffff81138a92>] ? alloc_fd+0xf2/0x140 [<ffffffff8111e8e4>] do_sys_open+0x64/0x140 [<ffffffff81036e3c>] ? math_state_restore+0x2c/0x50 [<ffffffff8111e9eb>] sys_open+0x1b/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021399 Pid: 2345, comm: gnome-session Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8139aa65>] ? __up_write+0xe5/0x150 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021400 Pid: 2368, comm: gconf-sanity-ch Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff81121d0d>] ? fput+0x1d/0x30 [<ffffffff8111e73d>] ? filp_close+0x4d/0x80 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b CE: hpet increasing min_delta_ns to 15000 nsec Btrfs: orphan add 3021401 Pid: 2374, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8109bf89>] ? up_read+0x9/0x10 [<ffffffff8105b071>] ? do_page_fault+0x141/0x2e0 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021402 Pid: 2429, comm: gpg Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8109bf89>] ? up_read+0x9/0x10 [<ffffffff8105b071>] ? do_page_fault+0x141/0x2e0 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021403 Pid: 2436, comm: gpg Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8109bf89>] ? up_read+0x9/0x10 [<ffffffff8105b071>] ? do_page_fault+0x141/0x2e0 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021404 Pid: 2374, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff81121d0d>] ? fput+0x1d/0x30 [<ffffffff8111e73d>] ? filp_close+0x4d/0x80 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021392 Pid: 2374, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff810c0600>] ? call_rcu+0x10/0x20 [<ffffffff8109de67>] ? __put_cred+0x37/0x50 [<ffffffff8111f84a>] ? sys_faccessat+0x19a/0x1d0 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021396 Pid: 2522, comm: xauth Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8139aa65>] ? __up_write+0xe5/0x150 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021406 Pid: 2522, comm: xauth Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8139aa65>] ? __up_write+0xe5/0x150 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 11796 Pid: 2445, comm: nautilus Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132ef33>] btrfs_setattr+0xf3/0x270 [<ffffffff81137b64>] notify_change+0x104/0x2e0 [<ffffffff81134d9a>] ? __d_lookup+0xfa/0x140 [<ffffffff8111f8ff>] do_truncate+0x5f/0x90 [<ffffffff8112a03c>] ? get_write_access+0x3c/0x60 [<ffffffff8112e4da>] do_filp_open+0x99a/0xf00 [<ffffffff811324e0>] ? pollwake+0x0/0x60 [<ffffffff81097580>] ? autoremove_wake_function+0x0/0x40 [<ffffffff81138a92>] ? alloc_fd+0xf2/0x140 [<ffffffff8111e8e4>] do_sys_open+0x64/0x140 [<ffffffff8111e9eb>] sys_open+0x1b/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b Btrfs: orphan add 3021266 Pid: 2374, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e540>] btrfs_rename+0x4c0/0x590 [<ffffffff8112b56a>] vfs_rename+0x3da/0x420 [<ffffffff8112d07e>] sys_renameat+0x23e/0x270 [<ffffffff813952cb>] ? _atomic_dec_and_lock+0x6b/0x90 [<ffffffff8113ac14>] ? mntput_no_expire+0x24/0xf0 [<ffffffff8111f448>] ? sys_fchmodat+0x78/0x100 [<ffffffff8112a19c>] ? path_put+0x2c/0x40 [<ffffffff8112d0c6>] sys_rename+0x16/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b OH NO, ORPHAN ENTRY ALREADY EXISTS FOR 3021266 Btrfs: orphan add 3021267 Pid: 2374, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e540>] btrfs_rename+0x4c0/0x590 [<ffffffff8112b56a>] vfs_rename+0x3da/0x420 [<ffffffff8112d07e>] sys_renameat+0x23e/0x270 [<ffffffff813952cb>] ? _atomic_dec_and_lock+0x6b/0x90 [<ffffffff8113ac14>] ? mntput_no_expire+0x24/0xf0 [<ffffffff8111f448>] ? sys_fchmodat+0x78/0x100 [<ffffffff8112a19c>] ? path_put+0x2c/0x40 [<ffffffff8112d0c6>] sys_rename+0x16/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b OH NO, ORPHAN ENTRY ALREADY EXISTS FOR 3021267 Btrfs: orphan add 3021268 Pid: 2374, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e540>] btrfs_rename+0x4c0/0x590 [<ffffffff8112b56a>] vfs_rename+0x3da/0x420 [<ffffffff8112d07e>] sys_renameat+0x23e/0x270 [<ffffffff813952cb>] ? _atomic_dec_and_lock+0x6b/0x90 [<ffffffff8113ac14>] ? mntput_no_expire+0x24/0xf0 [<ffffffff8111f448>] ? sys_fchmodat+0x78/0x100 [<ffffffff8112a19c>] ? path_put+0x2c/0x40 [<ffffffff8112d0c6>] sys_rename+0x16/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b OH NO, ORPHAN ENTRY ALREADY EXISTS FOR 3021268 Btrfs: orphan add 3021269 Pid: 2374, comm: gconfd-2 Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e540>] btrfs_rename+0x4c0/0x590 [<ffffffff8112b56a>] vfs_rename+0x3da/0x420 [<ffffffff8112d07e>] sys_renameat+0x23e/0x270 [<ffffffff813952cb>] ? _atomic_dec_and_lock+0x6b/0x90 [<ffffffff8113ac14>] ? mntput_no_expire+0x24/0xf0 [<ffffffff8111f448>] ? sys_fchmodat+0x78/0x100 [<ffffffff8112a19c>] ? path_put+0x2c/0x40 [<ffffffff8112d0c6>] sys_rename+0x16/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b OH NO, ORPHAN ENTRY ALREADY EXISTS FOR 3021269 Btrfs: orphan add 3021271 Pid: 2502, comm: gvfsd-metadata Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e540>] btrfs_rename+0x4c0/0x590 [<ffffffff8112b56a>] vfs_rename+0x3da/0x420 [<ffffffff8112d07e>] sys_renameat+0x23e/0x270 [<ffffffff810fd6f8>] ? handle_mm_fault+0x188/0x840 [<ffffffff8111e983>] ? do_sys_open+0x103/0x140 [<ffffffff8112d0c6>] sys_rename+0x16/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b OH NO, ORPHAN ENTRY ALREADY EXISTS FOR 3021271 Btrfs: orphan add 3021272 Pid: 2502, comm: gvfsd-metadata Not tainted 2.6.33-rc2-00202-g63ebcc6-dirty #15 Call Trace: [<ffffffff8132e05b>] btrfs_orphan_add+0xcb/0xf0 [<ffffffff8132e8ab>] btrfs_unlink+0xfb/0x120 [<ffffffff81129e10>] ? inode_permission+0x70/0x90 [<ffffffff8112b093>] vfs_unlink+0x83/0xf0 [<ffffffff8112a710>] ? lookup_hash+0x30/0x40 [<ffffffff8112d253>] do_unlinkat+0x183/0x1c0 [<ffffffff8109bf89>] ? up_read+0x9/0x10 [<ffffffff8105b071>] ? do_page_fault+0x141/0x2e0 [<ffffffff8112d2a1>] sys_unlink+0x11/0x20 [<ffffffff81035e6b>] system_call_fastpath+0x16/0x1b
OH NO, ORPHAN ENTRY ALREADY EXISTS FOR 3021272
Quoted 13 lines · Tomas Carnecky
Quoted 12 lines · Josef Bacik
Quoted 6 lines · Tomas Carnecky
I was running v2.6.33-rc2-187-g08d869a and everything was ok. Today I
decided to update the kernel (to v2.6.33-rc4) and a minute or two after logging into the gnome desktop this kernel bug appeared in dmesg. I then went back to the old kernel but the bug didn't disappear, not even after running btrfsck on the filesystem.Ok will you please run with this patch? It shouldn't panic your box, since it seems ret is
-EEXIST. Just watch your logs forOH NO, ORPHAN ENTRY ALREADY EXISTS FOR<number>
Quoted 8 lines
Quoted 7 lines
and then look up and find all occurances of
Btrfs: orphan add<number>
with the stack trace and send it back to me so I can verify that nothing heinous is happening. I assume we're just racing with unlink/rename so all that needs to be done is to take that
BUG_ONout, but it would be nice to know for sure.
Ok will you try this patch? I've not built it, so sorry if it doesn't compile :). Look for the "OH NO" messages again. If they show up then the problem is still there, if they go away the problem is fixed. I tried to reproduce this locally but I can't seem to do it, so you are my only hope :).
By the way, this replaces the last patch I sent you, so unapply the previous patch and apply this one instead. Thanks,
Josef
fs/btrfs/inode.c +25 -25
@@ -2096,6 +2096,13 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)*/ ret =btrfs_insert_orphan_item (trans, root, inode->i_ino); +printk (KERN_ERR "Btrfs: orphan add %llu\n" , (unsigned long long )inode->i_ino); +dump_stack (); +if (ret) { +printk (KERN_ERR "OH NO, ORPHAN ENTRY ALREADY EXISTS FOR %llu\n" , + (unsigned long long )inode->i_ino); + } +return ret; }
@@ -3293,10 +3300,10 @@ static int btrfs_setattr_size(struct inode *inode, struct iattr *attr)unsigned long nr;int ret; -if (attr->ia_size == inode->i_size) +if (attr->ia_size ==i_size_read (inode))return 0 ; -if (attr->ia_size > inode->i_size) { +if (attr->ia_size >i_size_read (inode)) {unsigned long limit; limit = current->signal->rlim[RLIMIT_FSIZE ].rlim_cur;if (attr->ia_size > inode->i_sb->s_maxbytes)
@@ -3305,24 +3312,7 @@ static int btrfs_setattr_size(struct inode *inode, struct iattr *attr)send_sig (SIGXFSZ , current,0 );return -EFBIG ; } - } - - ret =btrfs_reserve_metadata_space (root,1 ); -if (ret) -return ret; - - trans =btrfs_start_transaction (root,1 ); -btrfs_set_trans_block_group (trans, inode); - - ret =btrfs_orphan_add (trans, inode); -BUG_ON (ret); - - nr = trans->blocks_used; -btrfs_end_transaction (trans, root); -btrfs_unreserve_metadata_space (root,1 ); -btrfs_btree_balance_dirty (root, nr); -if (attr->ia_size > inode->i_size) { ret =btrfs_cont_expand (inode, attr->ia_size);if (ret) {btrfs_truncate (inode);
@@ -3345,6 +3335,21 @@ static int btrfs_setattr_size(struct inode *inode, struct iattr *attr)btrfs_end_transaction (trans, root);btrfs_btree_balance_dirty (root, nr);return 0 ; + }else if (attr->ia_size <i_size_read (inode)) { + ret =btrfs_reserve_metadata_space (root,1 ); +if (ret) +return ret; + + trans =btrfs_start_transaction (root,1 ); +btrfs_set_trans_block_group (trans, inode); + + ret =btrfs_orphan_add (trans, inode); +BUG_ON (ret); + + nr = trans->blocks_used; +btrfs_end_transaction (trans, root); +btrfs_unreserve_metadata_space (root,1 ); +btrfs_btree_balance_dirty (root, nr); }/*
@@ -3355,10 +3360,6 @@ static int btrfs_setattr_size(struct inode *inode, struct iattr *attr)if (attr->ia_size ==0 )BTRFS_I (inode)->ordered_data_close =1 ; -/* we don't support swapfiles, so vmtruncate shouldn't fail */ - ret =vmtruncate (inode, attr->ia_size); -BUG_ON (ret); -return 0 ; }
@@ -3376,7 +3377,6 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr)if (err)return err; } - attr->ia_valid &= ~ATTR_SIZE ;if (attr->ia_valid) err =inode_setattr (inode, attr);
@@ -5592,7 +5592,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,BUG_ON (ret);if (new_inode->i_nlink ==0 ) { ret =btrfs_orphan_add (trans, new_dentry->d_inode); -BUG_ON (ret); +BUG_ON (ret && ret != -EEXIST ); } }
Quoted 23 lines · Josef Bacik
Quoted 13 lines · Tomas Carnecky
Quoted 12 lines · Josef Bacik
Quoted 6 lines · Tomas Carnecky
I was running v2.6.33-rc2-187-g08d869a and everything was ok. Today I
decided to update the kernel (to v2.6.33-rc4) and a minute or two after logging into the gnome desktop this kernel bug appeared in dmesg. I then went back to the old kernel but the bug didn't disappear, not even after running btrfsck on the filesystem.Ok will you please run with this patch? It shouldn't panic your box, since it seems ret is
-EEXIST. Just watch your logs forOH NO, ORPHAN ENTRY ALREADY EXISTS FOR<number>
Quoted 8 lines
Quoted 7 lines
and then look up and find all occurances of
Btrfs: orphan add<number>
with the stack trace and send it back to me so I can verify that nothing heinous is happening. I assume we're just racing with unlink/rename so all that needs to be done is to take that
BUG_ONout, but it would be nice to know for sure.
Quoted 8 lines
Ok will you try this patch? I've not built it, so sorry if it doesn't compile :). Look for the "OH NO" messages again. If they show up then the problem is still there, if they go away the problem is fixed. I tried to reproduce this locally but I can't seem to do it, so you are my only hope :).
By the way, this replaces the last patch I sent you, so unapply the previous patch and apply this one instead. Thanks,
Ok here's the final version of the patch I'm going to post. This replaces the other patches that I sent you, so un-apply the last one you applied and apply this one instead. Run this for a day and let me know if you have any problems. If no problems I'll go ahead and post it. Thanks,
Josef
fs/btrfs/inode.c +16 -26
@@ -3305,24 +3305,7 @@ static int btrfs_setattr_size(struct inode *inode, struct iattr *attr)send_sig (SIGXFSZ , current,0 );return -EFBIG ; } - } - - ret =btrfs_reserve_metadata_space (root,1 ); -if (ret) -return ret; - - trans =btrfs_start_transaction (root,1 ); -btrfs_set_trans_block_group (trans, inode); - - ret =btrfs_orphan_add (trans, inode); -BUG_ON (ret); - - nr = trans->blocks_used; -btrfs_end_transaction (trans, root); -btrfs_unreserve_metadata_space (root,1 ); -btrfs_btree_balance_dirty (root, nr); -if (attr->ia_size > inode->i_size) { ret =btrfs_cont_expand (inode, attr->ia_size);if (ret) {btrfs_truncate (inode);
@@ -3337,14 +3320,26 @@ static int btrfs_setattr_size(struct inode *inode, struct iattr *attr) ret =btrfs_update_inode (trans, root, inode);BUG_ON (ret); -if (inode->i_nlink >0 ) { - ret =btrfs_orphan_del (trans, inode); -BUG_ON (ret); - } + nr = trans->blocks_used;btrfs_end_transaction (trans, root);btrfs_btree_balance_dirty (root, nr);return 0 ; + }else if (attr->ia_size <i_size_read (inode)) { + ret =btrfs_reserve_metadata_space (root,1 ); +if (ret) +return ret; + + trans =btrfs_start_transaction (root,1 ); +btrfs_set_trans_block_group (trans, inode); + + ret =btrfs_orphan_add (trans, inode); +BUG_ON (ret); + + nr = trans->blocks_used; +btrfs_end_transaction (trans, root); +btrfs_unreserve_metadata_space (root,1 ); +btrfs_btree_balance_dirty (root, nr); }/*
@@ -3355,10 +3350,6 @@ static int btrfs_setattr_size(struct inode *inode, struct iattr *attr)if (attr->ia_size ==0 )BTRFS_I (inode)->ordered_data_close =1 ; -/* we don't support swapfiles, so vmtruncate shouldn't fail */ - ret =vmtruncate (inode, attr->ia_size); -BUG_ON (ret); -return 0 ; }
@@ -3376,7 +3367,6 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr)if (err)return err; } - attr->ia_valid &= ~ATTR_SIZE ;if (attr->ia_valid) err =inode_setattr (inode, attr);
Quoted 5 lines · Josef Bacik
Quoted 4 lines · Josef Bacik
Quoted 3 lines · Tomas Carnecky
Quoted 2 lines · Josef Bacik
Quoted 1 line · Tomas Carnecky
=A0 I was running v2.6.33-rc2-187-g08d869a and everything was ok=
=2E Today I
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
decided to update the kernel (to v2.6.33-rc4) and a minute or tw=
o after
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
logging into the gnome desktop this kernel bug appeared in dmesg=
=2E I then
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
went back to the old kernel but the bug didn't disappear, not ev=
en after
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 2 lines
running btrfsck on the filesystem.
Ok will you please run with this patch? =A0It shouldn't panic you=
r box, since it
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
seems ret is
-EEXIST. =A0Just watch your logs forOH NO, ORPHAN ENTRY ALREADY EXISTS FOR<number>
and then look up and find all occurances of
Btrfs: orphan add<number>
with the stack trace and send it back to me so I can verify that =
nothing heinous
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
is happening. =A0I assume we're just racing with unlink/rename so=
all that needs
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
to be done is to take that
BUG_ONout, but it would be nice to kn=
ow for sure.
Quoted 3 lines
Quoted 3 lines
Quoted 1 line
Ok will you try this patch? =A0I've not built it, so sorry if it doe=
sn't compile
Quoted 1 line
Quoted 1 line
:). =A0Look for the "OH NO" messages again. =A0If they show up then =
the problem is
Quoted 1 line
Quoted 1 line
still there, if they go away the problem is fixed. =A0I tried to rep=
roduce this
Quoted 3 lines
Quoted 3 lines
locally but I can't seem to do it, so you are my only hope :).
By the way, this replaces the last patch I sent you, so unapply the =
previous
Quoted 4 lines
Quoted 2 lines
patch and apply this one instead. =A0Thanks,
Ok here's the final version of the patch I'm going to post. =A0This r=
eplaces the
Quoted 1 line
other patches that I sent you, so un-apply the last one you applied a=
nd apply
Quoted 1 line
this one instead. =A0Run this for a day and let me know if you have a=
ny problems.
fs/btrfs/inode.c static int btrfs_setattr_size(struct inode *in=
Quoted 10 lines
If no problems I'll go ahead and post it. =A0Thanks,
Josef
fs/btrfs/inode.c +0
-0@@ -3305,24 +3305,7 @@ static int btrfs_setattr_size(struct inode *in=
ode, struct iattr *attr)
Quoted 1 line
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0send_sig(SIGXFSZ, curr=
ent, 0);
fs/btrfs/inode.c static int btrfs_setattr_size(struct inode *i=
Quoted 25 lines
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return
-EFBIG; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
- =A0 =A0 =A0 }fs/btrfs/inode.c +0
-16- - =A0 =A0 =A0 ret =3D btrfs_reserve_metadata_space(root, 1); - =A0 =A0 =A0 if (ret) - =A0 =A0 =A0 =A0 =A0 =A0 =A0 return ret; - - =A0 =A0 =A0 trans =3D btrfs_start_transaction(root, 1); - =A0 =A0 =A0 btrfs_set_trans_block_group(trans, inode); - - =A0 =A0 =A0 ret =3D btrfs_orphan_add(trans, inode); - =A0 =A0 =A0 BUG_ON(ret); - - =A0 =A0 =A0 nr =3D trans->blocks_used; - =A0 =A0 =A0 btrfs_end_transaction(trans, root); - =A0 =A0 =A0 btrfs_unreserve_metadata_space(root, 1); - =A0 =A0 =A0 btrfs_btree_balance_dirty(root, nr); - =A0 =A0 =A0 if (attr->ia_size > inode->i_size) {=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ret =3D
btrfs_cont_expand(inode, attr-= ia_size);
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (ret) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0btrfs_truncate(inode);fs/btrfs/inode.c +0
-0@@ -3337,14 +3320,26 @@ static int btrfs_setattr_size(struct inode *i=
node, struct iattr *attr)
Quoted 2 lines
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ret =3D btrfs_update_inode(trans, root=
, inode);
Quoted 3 lines
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BUG_ON(ret);
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (inode->i_nlink> 0) {
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ret =3D btrfs_orphan_de=
l(trans, inode);
Quoted 9 lines
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0
BUG_ON(ret);
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
+
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0nr =3Dtrans->blocks_used; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0btrfs_end_transaction(trans, root); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0btrfs_btree_balance_dirty(root, nr); =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return 0;
+ =A0 =A0 =A0 } else if (attr->ia_size<i_size_read(inode)) {
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 ret =3D btrfs_reserve_metadata_space(ro=
ot, 1);
Quoted 4 lines
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (ret)
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return ret;
+
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 trans =3D btrfs_start_transaction(root,=
1);
Quoted 1 line
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 btrfs_set_trans_block_group(trans, inod=
e);
fs/btrfs/inode.c
Quoted 7 lines
fs/btrfs/inode.c +7
-0+ + =A0 =A0 =A0 =A0 =A0 =A0 =A0 ret =3D btrfs_orphan_add(trans, inode); + =A0 =A0 =A0 =A0 =A0 =A0 =A0 BUG_ON(ret); + + =A0 =A0 =A0 =A0 =A0 =A0 =A0 nr =3D trans->blocks_used; + =A0 =A0 =A0 =A0 =A0 =A0 =A0 btrfs_end_transaction(trans, root); + =A0 =A0 =A0 =A0 =A0 =A0 =A0 btrfs_unreserve_metadata_space(root, 1)=
;
fs/btrfs/inode.c static int btrfs_setattr_size(struct inode *in=
Quoted 5 lines
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0
btrfs_btree_balance_dirty(root, nr); =A0 =A0 =A0 =A0}=A0 =A0 =A0 =A0/*
fs/btrfs/inode.c +0
-0@@ -3355,10 +3350,6 @@ static int btrfs_setattr_size(struct inode *in=
ode, struct iattr *attr)
Quoted 2 lines
fs/btrfs/inode.c +0
-0=A0 =A0 =A0 =A0if (attr->ia_size =3D=3D 0)=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BTRFS_I(inode)->ordered_data_close =3D=
1;
Quoted 2 lines
- =A0 =A0 =A0 /* we don't support swapfiles, so vmtruncate shouldn't =
fail */
fs/btrfs/inode.c static int btrfs_setattr(struct dentry *dentry,=
Quoted 7 lines
- =A0 =A0 =A0 ret =3D
vmtruncate(inode, attr->ia_size);
- =A0 =A0 =A0BUG_ON(ret);
-
=A0 =A0 =A0 =A0return 0;
=A0}fs/btrfs/inode.c +0
-0@@ -3376,7 +3367,6 @@ static int btrfs_setattr(struct dentry *dentry,=
struct iattr *attr)
fs/btrfs/inode.c static int btrfs_setattr(struct dentry *dentry,=
Quoted 8 lines
fs/btrfs/inode.c +0
-2=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (err) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return err; =A0 =A0 =A0 =A0} - =A0 =A0 =A0 attr->ia_valid &=3D ~ATTR_SIZE; =A0 =A0 =A0 =A0if (attr->ia_valid) =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0err =3D inode_setattr(inode, attr); --
It looks like a ENOSPC related problem, btrfs_truncate doesn't remove t= he orphan
item if it fails to finish its operation. so I don't think this patch fixes the problem
Regards
Yan, Zheng
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" = in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 3 lines · Zheng
It looks like a ENOSPC related problem,
btrfs_truncatedoesn't remove the orphan item if it fails to finish its operation. so I don't think this patch fixes the problem
Around the time when it happened, the filesystem was used only to ~55% (31G of 56G).
tom