diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-21 13:36:41 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-21 13:36:41 -0700 | 
| commit | e2a0883e4071237d09b604a342c28b96b44a04b3 (patch) | |
| tree | aa56f4d376b5eb1c32358c19c2669c2a94e0e1fd /fs/configfs/inode.c | |
| parent | 3a990a52f9f25f45469e272017a31e7a3fda60ed (diff) | |
| parent | 07c0c5d8b8c122b2f2df9ee574ac3083daefc981 (diff) | |
| download | olio-linux-3.10-e2a0883e4071237d09b604a342c28b96b44a04b3.tar.xz olio-linux-3.10-e2a0883e4071237d09b604a342c28b96b44a04b3.zip  | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs pile 1 from Al Viro:
 "This is _not_ all; in particular, Miklos' and Jan's stuff is not there
  yet."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (64 commits)
  ext4: initialization of ext4_li_mtx needs to be done earlier
  debugfs-related mode_t whack-a-mole
  hfsplus: add an ioctl to bless files
  hfsplus: change finder_info to u32
  hfsplus: initialise userflags
  qnx4: new helper - try_extent()
  qnx4: get rid of qnx4_bread/qnx4_getblk
  take removal of PF_FORKNOEXEC to flush_old_exec()
  trim includes in inode.c
  um: uml_dup_mmap() relies on ->mmap_sem being held, but activate_mm() doesn't hold it
  um: embed ->stub_pages[] into mmu_context
  gadgetfs: list_for_each_safe() misuse
  ocfs2: fix leaks on failure exits in module_init
  ecryptfs: make register_filesystem() the last potential failure exit
  ntfs: forgets to unregister sysctls on register_filesystem() failure
  logfs: missing cleanup on register_filesystem() failure
  jfs: mising cleanup on register_filesystem() failure
  make configfs_pin_fs() return root dentry on success
  configfs: configfs_create_dir() has parent dentry in dentry->d_parent
  configfs: sanitize configfs_create()
  ...
Diffstat (limited to 'fs/configfs/inode.c')
| -rw-r--r-- | fs/configfs/inode.c | 62 | 
1 files changed, 30 insertions, 32 deletions
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c index 3ee36d41886..0074362d9f7 100644 --- a/fs/configfs/inode.c +++ b/fs/configfs/inode.c @@ -44,8 +44,6 @@  static struct lock_class_key default_group_class[MAX_LOCK_DEPTH];  #endif -extern struct super_block * configfs_sb; -  static const struct address_space_operations configfs_aops = {  	.readpage	= simple_readpage,  	.write_begin	= simple_write_begin, @@ -132,9 +130,10 @@ static inline void set_inode_attr(struct inode * inode, struct iattr * iattr)  	inode->i_ctime = iattr->ia_ctime;  } -struct inode *configfs_new_inode(umode_t mode, struct configfs_dirent * sd) +struct inode *configfs_new_inode(umode_t mode, struct configfs_dirent *sd, +				 struct super_block *s)  { -	struct inode * inode = new_inode(configfs_sb); +	struct inode * inode = new_inode(s);  	if (inode) {  		inode->i_ino = get_next_ino();  		inode->i_mapping->a_ops = &configfs_aops; @@ -188,36 +187,35 @@ static void configfs_set_inode_lock_class(struct configfs_dirent *sd,  int configfs_create(struct dentry * dentry, umode_t mode, int (*init)(struct inode *))  {  	int error = 0; -	struct inode * inode = NULL; -	if (dentry) { -		if (!dentry->d_inode) { -			struct configfs_dirent *sd = dentry->d_fsdata; -			if ((inode = configfs_new_inode(mode, sd))) { -				if (dentry->d_parent && dentry->d_parent->d_inode) { -					struct inode *p_inode = dentry->d_parent->d_inode; -					p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME; -				} -				configfs_set_inode_lock_class(sd, inode); -				goto Proceed; -			} -			else -				error = -ENOMEM; -		} else -			error = -EEXIST; -	} else -		error = -ENOENT; -	goto Done; +	struct inode *inode = NULL; +	struct configfs_dirent *sd; +	struct inode *p_inode; + +	if (!dentry) +		return -ENOENT; + +	if (dentry->d_inode) +		return -EEXIST; - Proceed: -	if (init) +	sd = dentry->d_fsdata; +	inode = configfs_new_inode(mode, sd, dentry->d_sb); +	if (!inode) +		return -ENOMEM; + +	p_inode = dentry->d_parent->d_inode; +	p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME; +	configfs_set_inode_lock_class(sd, inode); + +	if (init) {  		error = init(inode); -	if (!error) { -		d_instantiate(dentry, inode); -		if (S_ISDIR(mode) || S_ISLNK(mode)) -			dget(dentry);  /* pin link and directory dentries in core */ -	} else -		iput(inode); - Done: +		if (error) { +			iput(inode); +			return error; +		} +	} +	d_instantiate(dentry, inode); +	if (S_ISDIR(mode) || S_ISLNK(mode)) +		dget(dentry);  /* pin link and directory dentries in core */  	return error;  }  |