diff options
Diffstat (limited to 'fs/udf/ialloc.c')
| -rw-r--r-- | fs/udf/ialloc.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 6eaf5edf1ea1..e77db621ec89 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c @@ -45,7 +45,7 @@ void udf_free_inode(struct inode *inode)  	udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1);  } -struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err) +struct inode *udf_new_inode(struct inode *dir, umode_t mode)  {  	struct super_block *sb = dir->i_sb;  	struct udf_sb_info *sbi = UDF_SB(sb); @@ -55,14 +55,12 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)  	struct udf_inode_info *iinfo;  	struct udf_inode_info *dinfo = UDF_I(dir);  	struct logicalVolIntegrityDescImpUse *lvidiu; +	int err;  	inode = new_inode(sb); -	if (!inode) { -		*err = -ENOMEM; -		return NULL; -	} -	*err = -ENOSPC; +	if (!inode) +		return ERR_PTR(-ENOMEM);  	iinfo = UDF_I(inode);  	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { @@ -80,21 +78,22 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)  	}  	if (!iinfo->i_ext.i_data) {  		iput(inode); -		*err = -ENOMEM; -		return NULL; +		return ERR_PTR(-ENOMEM);  	} +	err = -ENOSPC;  	block = udf_new_block(dir->i_sb, NULL,  			      dinfo->i_location.partitionReferenceNum, -			      start, err); -	if (*err) { +			      start, &err); +	if (err) {  		iput(inode); -		return NULL; +		return ERR_PTR(err);  	}  	lvidiu = udf_sb_lvidiu(sb);  	if (lvidiu) {  		iinfo->i_unique = lvid_get_unique_id(sb); +		inode->i_generation = iinfo->i_unique;  		mutex_lock(&sbi->s_alloc_mutex);  		if (S_ISDIR(mode))  			le32_add_cpu(&lvidiu->numDirs, 1); @@ -123,9 +122,12 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)  		iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;  	inode->i_mtime = inode->i_atime = inode->i_ctime =  		iinfo->i_crtime = current_fs_time(inode->i_sb); -	insert_inode_hash(inode); +	if (unlikely(insert_inode_locked(inode) < 0)) { +		make_bad_inode(inode); +		iput(inode); +		return ERR_PTR(-EIO); +	}  	mark_inode_dirty(inode); -	*err = 0;  	return inode;  }  |