Now that i_count is a proper refcount, convert it to refcount_t. Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> --- fs/btrfs/inode.c | 2 +- fs/f2fs/super.c | 4 ++-- fs/inode.c | 16 ++++++++-------- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode.h | 2 +- include/linux/fs.h | 5 +++-- kernel/futex.c | 2 +- 7 files changed, 17 insertions(+), 16 deletions(-) --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3172,7 +3172,7 @@ void btrfs_add_delayed_iput(struct inode struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); struct btrfs_inode *binode = BTRFS_I(inode); - if (atomic_add_unless(&inode->i_count, -1, 2)) + if (refcount_dec_unless(&inode->i_count, 2)) return; spin_lock(&fs_info->delayed_iput_lock); --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -601,7 +601,7 @@ static int f2fs_drop_inode(struct inode if ((!inode_unhashed(inode) && inode->i_state & I_SYNC)) { if (!inode->i_nlink && !is_bad_inode(inode)) { /* to avoid evict_inode call simultaneously */ - atomic_inc(&inode->i_count); + refcount_inc(&inode->i_count); spin_unlock(&inode->i_lock); /* some remained atomic pages should discarded */ @@ -621,7 +621,7 @@ static int f2fs_drop_inode(struct inode fscrypt_put_encryption_info(inode, NULL); spin_lock(&inode->i_lock); - atomic_dec(&inode->i_count); + refcount_dec(&inode->i_count); } return 0; } --- a/fs/inode.c +++ b/fs/inode.c @@ -135,7 +135,7 @@ int inode_init_always(struct super_block inode->i_sb = sb; inode->i_blkbits = sb->s_blocksize_bits; inode->i_flags = 0; - atomic_set(&inode->i_count, 2); /* hashed and ref */ + refcount_set(&inode->i_count, 2); /* hashed and ref */ inode->i_op = &empty_iops; inode->i_fop = &no_open_fops; inode->__i_nlink = 1; @@ -387,7 +387,7 @@ static void init_once(void *foo) void __iget(struct inode *inode) { lockdep_assert_held(&inode->i_lock); - WARN_ON(!atomic_inc_not_zero(&inode->i_count)); + refcount_inc(&inode->i_count); /* must not be 0 */ } /* @@ -395,7 +395,7 @@ void __iget(struct inode *inode) */ void ihold(struct inode *inode) { - WARN_ON(atomic_inc_return(&inode->i_count) < 3); + refcount_inc(&inode->i_count); } EXPORT_SYMBOL(ihold); @@ -818,7 +818,7 @@ static struct inode *find_inode(struct s continue; if (!test(inode, data)) continue; - if (atomic_inc_not_zero(&inode->i_count)) + if (refcount_inc_not_zero(&inode->i_count)) goto out_unlock; goto slow; } @@ -875,7 +875,7 @@ static struct inode *find_inode_fast(str continue; if (inode->i_sb != sb) continue; - if (atomic_inc_not_zero(&inode->i_count)) + if (refcount_inc_not_zero(&inode->i_count)) goto out_unlock; goto slow; } @@ -1538,7 +1538,7 @@ void iput(struct inode *inode) BUG_ON(inode->i_state & I_CLEAR); retry: - if (atomic_add_unless(&inode->i_count, -1, 2)) + if (refcount_dec_unless(&inode->i_count, 2)) return; spin_lock(&inode->i_lock); @@ -1551,7 +1551,7 @@ void iput(struct inode *inode) goto retry; } - atomic_dec(&inode->i_count); /* 2 -> 1 */ + refcount_dec(&inode->i_count); /* 2 -> 1 */ WARN_ON(inode->i_state & I_NEW); /* @@ -1578,7 +1578,7 @@ void iput(struct inode *inode) * continue to take the inode out, otherwise someone got a ref * while we weren't looking. */ - if (atomic_cmpxchg(&inode->i_count, 1, 0) != 1) { + if (!refcount_dec_if_one(&inode->i_count)) { spin_unlock(&inode->i_lock); return; } --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1563,7 +1563,7 @@ xfs_itruncate_extents( int done = 0; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - ASSERT(!atomic_read(&VFS_I(ip)->i_count) || + ASSERT(!refcount_read(&VFS_I(ip)->i_count) || xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(new_size <= XFS_ISIZE(ip)); ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES); --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -475,7 +475,7 @@ static inline void xfs_setup_existing_in #define IHOLD(ip) \ do { \ - ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ + ASSERT(refcount_read(&VFS_I(ip)->i_count) > 0) ; \ ihold(VFS_I(ip)); \ trace_xfs_ihold(ip, _THIS_IP_); \ } while (0) --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -23,6 +23,7 @@ #include <linux/fiemap.h> #include <linux/rculist_bl.h> #include <linux/atomic.h> +#include <linux/refcount.h> #include <linux/shrinker.h> #include <linux/migrate_mode.h> #include <linux/uidgid.h> @@ -622,7 +623,7 @@ struct inode { struct rcu_head i_rcu; }; u64 i_version; - atomic_t i_count; + refcount_t i_count; atomic_t i_dio_count; atomic_t i_writecount; #ifdef CONFIG_IMA @@ -2713,7 +2714,7 @@ extern unsigned int get_next_ino(void); static inline int i_count(struct inode *inode) { - int i_count = atomic_read(&inode->i_count); + int i_count = refcount_read(&inode->i_count); /* * In order to preserve the 'old' usage-count semantics, remove the --- a/kernel/futex.c +++ b/kernel/futex.c @@ -676,7 +676,7 @@ get_futex_key(u32 __user *uaddr, int fsh * cases, therefore a successful atomic_inc return below will * guarantee that get_futex_key() will still imply smp_mb(); (B). */ - if (WARN_ON_ONCE(!atomic_inc_not_zero(&inode->i_count))) { + if (WARN_ON_ONCE(!refcount_inc_not_zero(&inode->i_count))) { rcu_read_unlock(); put_page(page);