From af153f3ac2e095b8e024fc536520b71c459d480c Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Wed, 11 Nov 2009 15:53:34 -0500 Subject: [PATCH] --- yaml --- r: 168555 b: refs/heads/master c: a6dbd429d8dd3382bbd9594b8d2ec74843a260d9 h: refs/heads/master i: 168553: ba624d98e3d263660b521008a896dccc9df35ce3 168551: b924c7433964ca4b9cf61c4f71d79c3304e03fc6 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/inode.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 6eda206b1105..c4de41dd0b90 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 33b258086441dd07e00133c79fcd8cbc6a76d737 +refs/heads/master: a6dbd429d8dd3382bbd9594b8d2ec74843a260d9 diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index d3d7d46a6af2..ee92801fc5db 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -5180,6 +5180,7 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) ei->logged_trans = 0; ei->outstanding_extents = 0; ei->reserved_extents = 0; + ei->root = NULL; spin_lock_init(&ei->accounting_lock); btrfs_ordered_inode_tree_init(&ei->ordered_tree); INIT_LIST_HEAD(&ei->i_orphan); @@ -5195,6 +5196,14 @@ void btrfs_destroy_inode(struct inode *inode) WARN_ON(!list_empty(&inode->i_dentry)); WARN_ON(inode->i_data.nrpages); + /* + * This can happen where we create an inode, but somebody else also + * created the same inode and we need to destroy the one we already + * created. + */ + if (!root) + goto free; + /* * Make sure we're properly removed from the ordered operation * lists. @@ -5230,6 +5239,7 @@ void btrfs_destroy_inode(struct inode *inode) } inode_tree_del(inode); btrfs_drop_extent_cache(inode, 0, (u64)-1, 0); +free: kmem_cache_free(btrfs_inode_cachep, BTRFS_I(inode)); }