diff options
Diffstat (limited to 'fs/anon_inodes.c')
| -rw-r--r-- | fs/anon_inodes.c | 109 | 
1 files changed, 56 insertions, 53 deletions
| diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index f11e43ed907d..28d39fb84ae3 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -39,19 +39,6 @@ static const struct dentry_operations anon_inodefs_dentry_operations = {  	.d_dname	= anon_inodefs_dname,  }; -static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type, -				int flags, const char *dev_name, void *data) -{ -	return mount_pseudo(fs_type, "anon_inode:", NULL, -			&anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC); -} - -static struct file_system_type anon_inode_fs_type = { -	.name		= "anon_inodefs", -	.mount		= anon_inodefs_mount, -	.kill_sb	= kill_anon_super, -}; -  /*   * nop .set_page_dirty method so that people can use .page_mkwrite on   * anon inodes. @@ -65,6 +52,62 @@ static const struct address_space_operations anon_aops = {  	.set_page_dirty = anon_set_page_dirty,  }; +/* + * A single inode exists for all anon_inode files. Contrary to pipes, + * anon_inode inodes have no associated per-instance data, so we need + * only allocate one of them. + */ +static struct inode *anon_inode_mkinode(struct super_block *s) +{ +	struct inode *inode = new_inode_pseudo(s); + +	if (!inode) +		return ERR_PTR(-ENOMEM); + +	inode->i_ino = get_next_ino(); +	inode->i_fop = &anon_inode_fops; + +	inode->i_mapping->a_ops = &anon_aops; + +	/* +	 * Mark the inode dirty from the very beginning, +	 * that way it will never be moved to the dirty +	 * list because mark_inode_dirty() will think +	 * that it already _is_ on the dirty list. +	 */ +	inode->i_state = I_DIRTY; +	inode->i_mode = S_IRUSR | S_IWUSR; +	inode->i_uid = current_fsuid(); +	inode->i_gid = current_fsgid(); +	inode->i_flags |= S_PRIVATE; +	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; +	return inode; +} + +static struct dentry *anon_inodefs_mount(struct file_system_type *fs_type, +				int flags, const char *dev_name, void *data) +{ +	struct dentry *root; +	root = mount_pseudo(fs_type, "anon_inode:", NULL, +			&anon_inodefs_dentry_operations, ANON_INODE_FS_MAGIC); +	if (!IS_ERR(root)) { +		struct super_block *s = root->d_sb; +		anon_inode_inode = anon_inode_mkinode(s); +		if (IS_ERR(anon_inode_inode)) { +			dput(root); +			deactivate_locked_super(s); +			root = ERR_CAST(anon_inode_inode); +		} +	} +	return root; +} + +static struct file_system_type anon_inode_fs_type = { +	.name		= "anon_inodefs", +	.mount		= anon_inodefs_mount, +	.kill_sb	= kill_anon_super, +}; +  /**   * anon_inode_getfile - creates a new file instance by hooking it up to an   *                      anonymous inode, and a dentry that describe the "class" @@ -180,38 +223,6 @@ err_put_unused_fd:  }  EXPORT_SYMBOL_GPL(anon_inode_getfd); -/* - * A single inode exists for all anon_inode files. Contrary to pipes, - * anon_inode inodes have no associated per-instance data, so we need - * only allocate one of them. - */ -static struct inode *anon_inode_mkinode(void) -{ -	struct inode *inode = new_inode_pseudo(anon_inode_mnt->mnt_sb); - -	if (!inode) -		return ERR_PTR(-ENOMEM); - -	inode->i_ino = get_next_ino(); -	inode->i_fop = &anon_inode_fops; - -	inode->i_mapping->a_ops = &anon_aops; - -	/* -	 * Mark the inode dirty from the very beginning, -	 * that way it will never be moved to the dirty -	 * list because mark_inode_dirty() will think -	 * that it already _is_ on the dirty list. -	 */ -	inode->i_state = I_DIRTY; -	inode->i_mode = S_IRUSR | S_IWUSR; -	inode->i_uid = current_fsuid(); -	inode->i_gid = current_fsgid(); -	inode->i_flags |= S_PRIVATE; -	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; -	return inode; -} -  static int __init anon_inode_init(void)  {  	int error; @@ -224,16 +235,8 @@ static int __init anon_inode_init(void)  		error = PTR_ERR(anon_inode_mnt);  		goto err_unregister_filesystem;  	} -	anon_inode_inode = anon_inode_mkinode(); -	if (IS_ERR(anon_inode_inode)) { -		error = PTR_ERR(anon_inode_inode); -		goto err_mntput; -	} -  	return 0; -err_mntput: -	kern_unmount(anon_inode_mnt);  err_unregister_filesystem:  	unregister_filesystem(&anon_inode_fs_type);  err_exit: | 
