aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/inode.c16
-rw-r--r--fs/coda/dir.c2
-rw-r--r--include/linux/fs.h1
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