diff options
| -rw-r--r-- | fs/btrfs/inode.c | 16 | ||||
| -rw-r--r-- | fs/coda/dir.c | 2 | ||||
| -rw-r--r-- | include/linux/fs.h | 1 |
3 files changed, 15 insertions, 4 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 |
diff --git a/fs/coda/dir.c b/fs/coda/dir.c index ee3410542b72..4d3bbd8514ac 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c | |||
| @@ -613,7 +613,7 @@ static int coda_dentry_revalidate(struct dentry *de, struct nameidata *nd) | |||
| 613 | if (cii->c_flags & C_FLUSH) | 613 | if (cii->c_flags & C_FLUSH) |
| 614 | coda_flag_inode_children(inode, C_FLUSH); | 614 | coda_flag_inode_children(inode, C_FLUSH); |
| 615 | 615 | ||
| 616 | if (de->d_count > 1) | 616 | if (atomic_read(&de->d_count) > 1) |
| 617 | /* pretend it's valid, but don't change the flags */ | 617 | /* pretend it's valid, but don't change the flags */ |
| 618 | goto out; | 618 | goto out; |
| 619 | 619 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index 94b8fa3f486e..4981e6ee3ba5 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -8,7 +8,6 @@ | |||
| 8 | 8 | ||
| 9 | #include <linux/limits.h> | 9 | #include <linux/limits.h> |
| 10 | #include <linux/ioctl.h> | 10 | #include <linux/ioctl.h> |
| 11 | #include <asm/atomic.h> | ||
| 12 | 11 | ||
| 13 | /* | 12 | /* |
| 14 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change | 13 | * It's silly to have NR_OPEN bigger than NR_FILE, but you can change |
