diff options
| author | Davide Libenzi <davidel@xmailserver.org> | 2007-10-16 23:30:19 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 08:43:00 -0700 | 
| commit | 96fdc72ddfe8aa3eb1f51e78cc13babefbf26dda (patch) | |
| tree | 58038ee825096fec9f330fe187e615bb7c2e8422 /fs/anon_inodes.c | |
| parent | 5e3c3ac9db432fbdd2da92ce0f12d7912706c689 (diff) | |
anon-inodes use open coded atomic_inc for the shared inode
Since we know the shared inode count is always >0, we can avoid igrab()
and use an open coded atomic_inc().
This also fixes a bug noticed by Yan Zheng <yanzheng@21cn.com>: were checking
for an IS_ERR() return from igrab(), but it actually returns NULL on error.
Signed-off-by: Davide Libenzi <davidel@xmailserver.org>
Cc: Yan Zheng <yanzheng@21cn.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/anon_inodes.c')
| -rw-r--r-- | fs/anon_inodes.c | 25 | 
1 files changed, 12 insertions, 13 deletions
| diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index b4a75880f6fd..23321889d9b0 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -76,7 +76,6 @@ int anon_inode_getfd(int *pfd, struct inode **pinode, struct file **pfile,  {  	struct qstr this;  	struct dentry *dentry; -	struct inode *inode;  	struct file *file;  	int error, fd; @@ -86,15 +85,9 @@ int anon_inode_getfd(int *pfd, struct inode **pinode, struct file **pfile,  	if (!file)  		return -ENFILE; -	inode = igrab(anon_inode_inode); -	if (IS_ERR(inode)) { -		error = PTR_ERR(inode); -		goto err_put_filp; -	} -  	error = get_unused_fd();  	if (error < 0) -		goto err_iput; +		goto err_put_filp;  	fd = error;  	/* @@ -108,14 +101,22 @@ int anon_inode_getfd(int *pfd, struct inode **pinode, struct file **pfile,  	dentry = d_alloc(anon_inode_mnt->mnt_sb->s_root, &this);  	if (!dentry)  		goto err_put_unused_fd; + +	/* +	 * 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); +  	dentry->d_op = &anon_inodefs_dentry_operations;  	/* Do not publish this dentry inside the global dentry hash table */  	dentry->d_flags &= ~DCACHE_UNHASHED; -	d_instantiate(dentry, inode); +	d_instantiate(dentry, anon_inode_inode);  	file->f_path.mnt = mntget(anon_inode_mnt);  	file->f_path.dentry = dentry; -	file->f_mapping = inode->i_mapping; +	file->f_mapping = anon_inode_inode->i_mapping;  	file->f_pos = 0;  	file->f_flags = O_RDWR; @@ -127,14 +128,12 @@ int anon_inode_getfd(int *pfd, struct inode **pinode, struct file **pfile,  	fd_install(fd, file);  	*pfd = fd; -	*pinode = inode; +	*pinode = anon_inode_inode;  	*pfile = file;  	return 0;  err_put_unused_fd:  	put_unused_fd(fd); -err_iput: -	iput(inode);  err_put_filp:  	put_filp(file);  	return error; | 
