Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

btrfs: fix warning in iput for bad-inode

iput() shouldn't be called for inodes in I_NEW state.
We need to mark inode as constructed first.

WARNING: at fs/inode.c:1309 iput+0x20b/0x210()
Call Trace:
[<ffffffff8103e7ba>] warn_slowpath_common+0x7a/0xb0
[<ffffffff8103e805>] warn_slowpath_null+0x15/0x20
[<ffffffff810eaf0b>] iput+0x20b/0x210
[<ffffffff811b96fb>] btrfs_iget+0x1eb/0x4a0
[<ffffffff811c3ad6>] btrfs_run_defrag_inodes+0x136/0x210
[<ffffffff811ad55f>] cleaner_kthread+0x17f/0x1a0
[<ffffffff81035b7d>] ? sub_preempt_count+0x9d/0xd0
[<ffffffff811ad3e0>] ? transaction_kthread+0x280/0x280
[<ffffffff8105af86>] kthread+0x96/0xa0
[<ffffffff814336d4>] kernel_thread_helper+0x4/0x10
[<ffffffff8105aef0>] ? kthread_worker_fn+0x190/0x190
[<ffffffff814336d0>] ? gs_change+0xb/0xb

Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
CC: Konstantin Khlebnikov <khlebnikov@openvz.org>
Tested-by: David Sterba <dsterba@suse.cz>
CC: Josef Bacik <josef@redhat.com>
CC: Chris Mason <chris.mason@oracle.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>

authored by

Sergei Trofimovich and committed by
Chris Mason
e0b6d65b 14c7cca7

+3 -7
+3 -7
fs/btrfs/inode.c
··· 3952 3952 struct btrfs_root *root, int *new) 3953 3953 { 3954 3954 struct inode *inode; 3955 - int bad_inode = 0; 3956 3955 3957 3956 inode = btrfs_iget_locked(s, location->objectid, root); 3958 3957 if (!inode) ··· 3967 3968 if (new) 3968 3969 *new = 1; 3969 3970 } else { 3970 - bad_inode = 1; 3971 + unlock_new_inode(inode); 3972 + iput(inode); 3973 + inode = ERR_PTR(-ESTALE); 3971 3974 } 3972 - } 3973 - 3974 - if (bad_inode) { 3975 - iput(inode); 3976 - inode = ERR_PTR(-ESTALE); 3977 3975 } 3978 3976 3979 3977 return inode;