From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Stroetmann Subject: Re: [PATCH 06/20] fs: Clean up inode reference counting Date: Tue, 19 Oct 2010 01:53:13 +0200 Message-ID: <4CBCDDE9.6010402@ontolinux.com> References: <1287382856-29529-1-git-send-email-david@fromorbit.com> <1287382856-29529-7-git-send-email-david@fromorbit.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Cc: linux-fsdevel To: Dave Chinner Return-path: Received: from moutng.kundenserver.de ([212.227.126.187]:55977 "EHLO moutng.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932155Ab0JRXzA (ORCPT ); Mon, 18 Oct 2010 19:55:00 -0400 In-Reply-To: <1287382856-29529-7-git-send-email-david@fromorbit.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Just only typos On the 18.10.2010 08:20, Dave Chinner wrote: > From: Dave Chinner > > Lots of filesystem code open codes the act of getting a reference to > an inode. Factor the open coded inode lock, increment, unlock into > a function iref(). This removes most direct external references to > the inode reference count. > > Originally based on a patch from Nick Piggin. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig > --- > fs/9p/vfs_inode.c | 5 +++-- > fs/affs/inode.c | 2 +- > fs/afs/dir.c | 2 +- > fs/anon_inodes.c | 7 +------ > fs/bfs/dir.c | 2 +- > fs/block_dev.c | 13 ++++++------- > fs/btrfs/inode.c | 2 +- > fs/coda/dir.c | 2 +- > fs/drop_caches.c | 2 +- > fs/exofs/inode.c | 2 +- > fs/exofs/namei.c | 2 +- > fs/ext2/namei.c | 2 +- > fs/ext3/namei.c | 2 +- > fs/ext4/namei.c | 2 +- > fs/fs-writeback.c | 7 +++---- > fs/gfs2/ops_inode.c | 2 +- > fs/hfsplus/dir.c | 2 +- > fs/inode.c | 34 ++++++++++++++++++++++------------ > fs/jffs2/dir.c | 4 ++-- > fs/jfs/jfs_txnmgr.c | 2 +- > fs/jfs/namei.c | 2 +- > fs/libfs.c | 2 +- > fs/logfs/dir.c | 2 +- > fs/minix/namei.c | 2 +- > fs/namei.c | 2 +- > fs/nfs/dir.c | 2 +- > fs/nfs/getroot.c | 2 +- > fs/nfs/write.c | 2 +- > fs/nilfs2/namei.c | 2 +- > fs/notify/inode_mark.c | 8 ++++---- > fs/ntfs/super.c | 4 ++-- > fs/ocfs2/namei.c | 2 +- > fs/quota/dquot.c | 2 +- > fs/reiserfs/namei.c | 2 +- > fs/sysv/namei.c | 2 +- > fs/ubifs/dir.c | 2 +- > fs/udf/namei.c | 2 +- > fs/ufs/namei.c | 2 +- > fs/xfs/linux-2.6/xfs_iops.c | 2 +- > fs/xfs/xfs_inode.h | 2 +- > include/linux/fs.h | 2 +- > ipc/mqueue.c | 2 +- > kernel/futex.c | 2 +- > mm/shmem.c | 2 +- > net/socket.c | 2 +- > 45 files changed, 80 insertions(+), 76 deletions(-) > > diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c > index 9e670d5..1f76624 100644 > --- a/fs/9p/vfs_inode.c > +++ b/fs/9p/vfs_inode.c > @@ -1789,9 +1789,10 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir, > kfree(st); > } else { > /* Caching disabled. No need to get upto date stat info. > - * This dentry will be released immediately. So, just i_count++ > + * This dentry will be released immediately. So, just take > + * a reference. > */ > - atomic_inc(&old_dentry->d_inode->i_count); > + iref(old_dentry->d_inode); > } > > dentry->d_op = old_dentry->d_op; > diff --git a/fs/affs/inode.c b/fs/affs/inode.c > index 3a0fdec..2100852 100644 > --- a/fs/affs/inode.c > +++ b/fs/affs/inode.c > @@ -388,7 +388,7 @@ affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s3 > affs_adjust_checksum(inode_bh, block - be32_to_cpu(chain)); > mark_buffer_dirty_inode(inode_bh, inode); > inode->i_nlink = 2; > - atomic_inc(&inode->i_count); > + iref(inode); > } > affs_fix_checksum(sb, bh); > mark_buffer_dirty_inode(bh, inode); > diff --git a/fs/afs/dir.c b/fs/afs/dir.c > index 0d38c09..87d8c03 100644 > --- a/fs/afs/dir.c > +++ b/fs/afs/dir.c > @@ -1045,7 +1045,7 @@ static int afs_link(struct dentry *from, struct inode *dir, > if (ret< 0) > goto link_error; > > - atomic_inc(&vnode->vfs_inode.i_count); > + iref(&vnode->vfs_inode); > d_instantiate(dentry,&vnode->vfs_inode); > key_put(key); > _leave(" = 0"); > diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c > index e4b75d6..451be78 100644 > --- a/fs/anon_inodes.c > +++ b/fs/anon_inodes.c > @@ -109,12 +109,7 @@ struct file *anon_inode_getfile(const char *name, > goto err_module; > > path.mnt = mntget(anon_inode_mnt); > - /* > - * We know the anon_inode inode count is always greater than zero, > - * so we can avoid doing an igrab() and we can use an open-coded > - * atomic_inc(). > - */ > - atomic_inc(&anon_inode_inode->i_count); > + iref(anon_inode_inode); > > path.dentry->d_op =&anon_inodefs_dentry_operations; > d_instantiate(path.dentry, anon_inode_inode); > diff --git a/fs/bfs/dir.c b/fs/bfs/dir.c > index d967e05..6e93a37 100644 > --- a/fs/bfs/dir.c > +++ b/fs/bfs/dir.c > @@ -176,7 +176,7 @@ static int bfs_link(struct dentry *old, struct inode *dir, > inc_nlink(inode); > inode->i_ctime = CURRENT_TIME_SEC; > mark_inode_dirty(inode); > - atomic_inc(&inode->i_count); > + iref(inode); > d_instantiate(new, inode); > mutex_unlock(&info->bfs_lock); > return 0; > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 63b1c4c..11ad53d 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -565,7 +565,7 @@ EXPORT_SYMBOL(bdget); > */ > struct block_device *bdgrab(struct block_device *bdev) > { > - atomic_inc(&bdev->bd_inode->i_count); > + iref(bdev->bd_inode); > return bdev; > } > > @@ -595,7 +595,7 @@ static struct block_device *bd_acquire(struct inode *inode) > spin_lock(&bdev_lock); > bdev = inode->i_bdev; > if (bdev) { > - atomic_inc(&bdev->bd_inode->i_count); > + bdgrab(bdev); > spin_unlock(&bdev_lock); > return bdev; > } > @@ -606,12 +606,11 @@ static struct block_device *bd_acquire(struct inode *inode) > spin_lock(&bdev_lock); > if (!inode->i_bdev) { > /* > - * We take an additional bd_inode->i_count for inode, > - * and it's released in clear_inode() of inode. > - * So, we can access it via ->i_mapping always > - * without igrab(). > + * We take an additional bdev reference here so > + * we can access it via ->i_mapping always > + * without first needing to grab a reference. > */ > - atomic_inc(&bdev->bd_inode->i_count); > + bdgrab(bdev); > inode->i_bdev = bdev; > inode->i_mapping = bdev->bd_inode->i_mapping; > list_add(&inode->i_devices,&bdev->bd_inodes); > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > index c038644..80e28bf 100644 > --- a/fs/btrfs/inode.c > +++ b/fs/btrfs/inode.c > @@ -4758,7 +4758,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, > } > > btrfs_set_trans_block_group(trans, dir); > - atomic_inc(&inode->i_count); > + iref(inode); > > err = btrfs_add_nondir(trans, dentry, inode, 1, index); > > diff --git a/fs/coda/dir.c b/fs/coda/dir.c > index ccd98b0..ac8b913 100644 > --- a/fs/coda/dir.c > +++ b/fs/coda/dir.c > @@ -303,7 +303,7 @@ static int coda_link(struct dentry *source_de, struct inode *dir_inode, > } > > coda_dir_update_mtime(dir_inode); > - atomic_inc(&inode->i_count); > + iref(inode); > d_instantiate(de, inode); > inc_nlink(inode); > > diff --git a/fs/drop_caches.c b/fs/drop_caches.c > index 2195c21..c2721fa 100644 > --- a/fs/drop_caches.c > +++ b/fs/drop_caches.c > @@ -22,7 +22,7 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused) > continue; > if (inode->i_mapping->nrpages == 0) > continue; > - __iget(inode); > + atomic_inc(&inode->i_count); > spin_unlock(&inode_lock); > invalidate_mapping_pages(inode->i_mapping, 0, -1); > iput(toput_inode); > diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c > index eb7368e..b631ff3 100644 > --- a/fs/exofs/inode.c > +++ b/fs/exofs/inode.c > @@ -1154,7 +1154,7 @@ struct inode *exofs_new_inode(struct inode *dir, int mode) > /* increment the refcount so that the inode will still be around when we > * reach the callback > */ > - atomic_inc(&inode->i_count); > + iref(inode); > > ios->done = create_done; > ios->private = inode; > diff --git a/fs/exofs/namei.c b/fs/exofs/namei.c > index b7dd0c2..f2a30a0 100644 > --- a/fs/exofs/namei.c > +++ b/fs/exofs/namei.c > @@ -153,7 +153,7 @@ static int exofs_link(struct dentry *old_dentry, struct inode *dir, > > inode->i_ctime = CURRENT_TIME; > inode_inc_link_count(inode); > - atomic_inc(&inode->i_count); > + iref(inode); > > return exofs_add_nondir(dentry, inode); > } > diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c > index 71efb0e..b15435f 100644 > --- a/fs/ext2/namei.c > +++ b/fs/ext2/namei.c > @@ -206,7 +206,7 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir, > > inode->i_ctime = CURRENT_TIME_SEC; > inode_inc_link_count(inode); > - atomic_inc(&inode->i_count); > + iref(inode); > > err = ext2_add_link(dentry, inode); > if (!err) { > diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c > index 2b35ddb..6c7a5d6 100644 > --- a/fs/ext3/namei.c > +++ b/fs/ext3/namei.c > @@ -2260,7 +2260,7 @@ retry: > > inode->i_ctime = CURRENT_TIME_SEC; > inc_nlink(inode); > - atomic_inc(&inode->i_count); > + iref(inode); > > err = ext3_add_entry(handle, dentry, inode); > if (!err) { > diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c > index 314c0d3..a406a85 100644 > --- a/fs/ext4/namei.c > +++ b/fs/ext4/namei.c > @@ -2312,7 +2312,7 @@ retry: > > inode->i_ctime = ext4_current_time(inode); > ext4_inc_count(handle, inode); > - atomic_inc(&inode->i_count); > + iref(inode); > > err = ext4_add_entry(handle, dentry, inode); > if (!err) { > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c > index 92d73b6..595dfc6 100644 > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -298,8 +298,7 @@ static void inode_wait_for_writeback(struct inode *inode) > > /* > * Write out an inode's dirty pages. Called under inode_lock. Either the Don't know exactly: Write out an inode's dirty page or Write out on inode's dirty pages > - * caller has ref on the inode (either via __iget or via syscall against an fd) > - * or the inode has I_WILL_FREE set (via generic_forget_inode) > + * caller has a reference on the inode or the inode has I_WILL_FREE set. > * > * If `wait' is set, wait on the writeout. > * [...]