diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 9dcc771ff485..3288f3a2899e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -1991,8 +1991,14 @@ void btrfs_add_delayed_iput(struct inode *inode) | |||
| 1991 | struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; | 1991 | struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; |
| 1992 | struct delayed_iput *delayed; | 1992 | struct delayed_iput *delayed; |
| 1993 | 1993 | ||
| 1994 | if (atomic_add_unless(&inode->i_count, -1, 1)) | 1994 | spin_lock(&inode->i_lock); |
| 1995 | if (inode->i_count == 1) { | ||
| 1996 | spin_unlock(&inode->i_lock); | ||
| 1995 | return; | 1997 | return; |
| 1998 | } | ||
| 1999 | inode->i_count--; | ||
| 2000 | spin_unlock(&inode->i_lock); | ||
| 2001 | |||
| 1996 | 2002 | ||
| 1997 | delayed = kmalloc(sizeof(*delayed), GFP_NOFS | __GFP_NOFAIL); | 2003 | delayed = kmalloc(sizeof(*delayed), GFP_NOFS | __GFP_NOFAIL); |
| 1998 | delayed->inode = inode; | 2004 | delayed->inode = inode; |
| @@ -3600,8 +3606,14 @@ again: | |||
| 3600 | objectid = entry->vfs_inode.i_ino + 1; | 3606 | objectid = entry->vfs_inode.i_ino + 1; |
| 3601 | inode = igrab(&entry->vfs_inode); | 3607 | inode = igrab(&entry->vfs_inode); |
| 3602 | if (inode) { | 3608 | if (inode) { |
| 3609 | int count; | ||
| 3603 | spin_unlock(&root->inode_lock); | 3610 | spin_unlock(&root->inode_lock); |
| 3604 | if (atomic_read(&inode->i_count) > 1) | 3611 | |
| 3612 | spin_lock(&inode->i_lock); | ||
| 3613 | count = inode->i_count; | ||
| 3614 | spin_unlock(&inode->i_lock); | ||
| 3615 | |||
| 3616 | if (count > 1) | ||
| 3605 | d_prune_aliases(inode); | 3617 | d_prune_aliases(inode); |
| 3606 | /* | 3618 | /* |
| 3607 | * btrfs_drop_inode will remove it from | 3619 | * btrfs_drop_inode will remove it from |
