• M
    btrfs: fix inconsonant inode information · 2f7e33d4
    Miao Xie 提交于
    When iputting the inode, We may leave the delayed nodes if they have some
    delayed items that have not been dealt with. So when the inode is read again,
    we must look up the relative delayed node, and use the information in it to
    initialize the inode. Or we will get inconsonant inode information, it may
    cause that the same directory index number is allocated again, and hit the
    following oops:
    
    [ 5447.554187] err add delayed dir index item(name: pglog_0.965_0) into the
    insertion tree of the delayed node(root id: 262, inode id: 258, errno: -17)
    [ 5447.569766] ------------[ cut here ]------------
    [ 5447.575361] kernel BUG at fs/btrfs/delayed-inode.c:1301!
    [SNIP]
    [ 5447.790721] Call Trace:
    [ 5447.793191]  [<ffffffffa0641c4e>] btrfs_insert_dir_item+0x189/0x1bb [btrfs]
    [ 5447.800156]  [<ffffffffa0651a45>] btrfs_add_link+0x12b/0x191 [btrfs]
    [ 5447.806517]  [<ffffffffa0651adc>] btrfs_add_nondir+0x31/0x58 [btrfs]
    [ 5447.812876]  [<ffffffffa0651d6a>] btrfs_create+0xf9/0x197 [btrfs]
    [ 5447.818961]  [<ffffffff8111f840>] vfs_create+0x72/0x92
    [ 5447.824090]  [<ffffffff8111fa8c>] do_last+0x22c/0x40b
    [ 5447.829133]  [<ffffffff8112076a>] path_openat+0xc0/0x2ef
    [ 5447.834438]  [<ffffffff810c58e2>] ? __perf_event_task_sched_out+0x24/0x44
    [ 5447.841216]  [<ffffffff8103ecdd>] ? perf_event_task_sched_out+0x59/0x67
    [ 5447.847846]  [<ffffffff81121a79>] do_filp_open+0x3d/0x87
    [ 5447.853156]  [<ffffffff811e126c>] ? strncpy_from_user+0x43/0x4d
    [ 5447.859072]  [<ffffffff8111f1f5>] ? getname_flags+0x2e/0x80
    [ 5447.864636]  [<ffffffff8111f179>] ? do_getname+0x14b/0x173
    [ 5447.870112]  [<ffffffff8111f1b7>] ? audit_getname+0x16/0x26
    [ 5447.875682]  [<ffffffff8112b1ab>] ? spin_lock+0xe/0x10
    [ 5447.880882]  [<ffffffff81112d39>] do_sys_open+0x69/0xae
    [ 5447.886153]  [<ffffffff81112db1>] sys_open+0x20/0x22
    [ 5447.891114]  [<ffffffff813b9aab>] system_call_fastpath+0x16/0x1b
    
    Fix it by reusing the old delayed node.
    Reported-by: NJim Schutt <jaschut@sandia.gov>
    Signed-off-by: NMiao Xie <miaox@cn.fujitsu.com>
    Tested-by: NJim Schutt <jaschut@sandia.gov>
    Signed-off-by: NChris Mason <chris.mason@oracle.com>
    2f7e33d4
inode.c 197.2 KB