diff options
Diffstat (limited to 'fs/udf/ialloc.c')
| -rw-r--r-- | fs/udf/ialloc.c | 34 | 
1 files changed, 12 insertions, 22 deletions
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 75d9304d0dc..6eaf5edf1ea 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c @@ -30,23 +30,22 @@ void udf_free_inode(struct inode *inode)  {  	struct super_block *sb = inode->i_sb;  	struct udf_sb_info *sbi = UDF_SB(sb); +	struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); -	mutex_lock(&sbi->s_alloc_mutex); -	if (sbi->s_lvid_bh) { -		struct logicalVolIntegrityDescImpUse *lvidiu = -							udf_sb_lvidiu(sbi); +	if (lvidiu) { +		mutex_lock(&sbi->s_alloc_mutex);  		if (S_ISDIR(inode->i_mode))  			le32_add_cpu(&lvidiu->numDirs, -1);  		else  			le32_add_cpu(&lvidiu->numFiles, -1);  		udf_updated_lvid(sb); +		mutex_unlock(&sbi->s_alloc_mutex);  	} -	mutex_unlock(&sbi->s_alloc_mutex);  	udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1);  } -struct inode *udf_new_inode(struct inode *dir, int mode, int *err) +struct inode *udf_new_inode(struct inode *dir, umode_t mode, int *err)  {  	struct super_block *sb = dir->i_sb;  	struct udf_sb_info *sbi = UDF_SB(sb); @@ -55,6 +54,7 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err)  	uint32_t start = UDF_I(dir)->i_location.logicalBlockNum;  	struct udf_inode_info *iinfo;  	struct udf_inode_info *dinfo = UDF_I(dir); +	struct logicalVolIntegrityDescImpUse *lvidiu;  	inode = new_inode(sb); @@ -92,28 +92,17 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err)  		return NULL;  	} -	mutex_lock(&sbi->s_alloc_mutex); -	if (sbi->s_lvid_bh) { -		struct logicalVolIntegrityDesc *lvid = -			(struct logicalVolIntegrityDesc *) -			sbi->s_lvid_bh->b_data; -		struct logicalVolIntegrityDescImpUse *lvidiu = -							udf_sb_lvidiu(sbi); -		struct logicalVolHeaderDesc *lvhd; -		uint64_t uniqueID; -		lvhd = (struct logicalVolHeaderDesc *) -				(lvid->logicalVolContentsUse); +	lvidiu = udf_sb_lvidiu(sb); +	if (lvidiu) { +		iinfo->i_unique = lvid_get_unique_id(sb); +		mutex_lock(&sbi->s_alloc_mutex);  		if (S_ISDIR(mode))  			le32_add_cpu(&lvidiu->numDirs, 1);  		else  			le32_add_cpu(&lvidiu->numFiles, 1); -		iinfo->i_unique = uniqueID = le64_to_cpu(lvhd->uniqueID); -		if (!(++uniqueID & 0x00000000FFFFFFFFUL)) -			uniqueID += 16; -		lvhd->uniqueID = cpu_to_le64(uniqueID);  		udf_updated_lvid(sb); +		mutex_unlock(&sbi->s_alloc_mutex);  	} -	mutex_unlock(&sbi->s_alloc_mutex);  	inode_init_owner(inode, dir, mode); @@ -125,6 +114,7 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err)  	iinfo->i_lenEAttr = 0;  	iinfo->i_lenAlloc = 0;  	iinfo->i_use = 0; +	iinfo->i_checkpoint = 1;  	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_AD_IN_ICB))  		iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;  	else if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))  | 
