diff options
Diffstat (limited to 'fs/udf')
| -rw-r--r-- | fs/udf/inode.c | 14 | ||||
| -rw-r--r-- | fs/udf/super.c | 3 | 
2 files changed, 11 insertions, 6 deletions
| diff --git a/fs/udf/inode.c b/fs/udf/inode.c index df88b957ccf0..cbae1ed0b7c1 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -587,7 +587,6 @@ out:  static sector_t inode_getblk(struct inode *inode, sector_t block,  			     int *err, int *new)  { -	static sector_t last_block;  	struct kernel_long_ad laarr[EXTENT_MERGE_SIZE];  	struct extent_position prev_epos, cur_epos, next_epos;  	int count = 0, startnum = 0, endnum = 0; @@ -601,6 +600,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,  	struct udf_inode_info *iinfo = UDF_I(inode);  	int goal = 0, pgoal = iinfo->i_location.logicalBlockNum;  	int lastblock = 0; +	bool isBeyondEOF;  	*err = 0;  	*new = 0; @@ -676,11 +676,10 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,  		return newblock;  	} -	last_block = block;  	/* Are we beyond EOF? */  	if (etype == -1) {  		int ret; - +		isBeyondEOF = 1;  		if (count) {  			if (c)  				laarr[0] = laarr[1]; @@ -718,11 +717,11 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,  			memset(&laarr[c].extLocation, 0x00,  				sizeof(struct kernel_lb_addr));  			count++; -			endnum++;  		}  		endnum = c + 1;  		lastblock = 1;  	} else { +		isBeyondEOF = 0;  		endnum = startnum = ((count > 2) ? 2 : count);  		/* if the current extent is in position 0, @@ -765,10 +764,13 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,  				goal, err);  		if (!newblocknum) {  			brelse(prev_epos.bh); +			brelse(cur_epos.bh); +			brelse(next_epos.bh);  			*err = -ENOSPC;  			return 0;  		} -		iinfo->i_lenExtents += inode->i_sb->s_blocksize; +		if (isBeyondEOF) +			iinfo->i_lenExtents += inode->i_sb->s_blocksize;  	}  	/* if the extent the requsted block is located in contains multiple @@ -795,6 +797,8 @@ static sector_t inode_getblk(struct inode *inode, sector_t block,  	udf_update_extents(inode, laarr, startnum, endnum, &prev_epos);  	brelse(prev_epos.bh); +	brelse(cur_epos.bh); +	brelse(next_epos.bh);  	newblock = udf_get_pblock(inode->i_sb, newblocknum,  				iinfo->i_location.partitionReferenceNum, 0); diff --git a/fs/udf/super.c b/fs/udf/super.c index d44fb568abe1..e9be396a558d 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -307,7 +307,8 @@ static void udf_sb_free_partitions(struct super_block *sb)  {  	struct udf_sb_info *sbi = UDF_SB(sb);  	int i; - +	if (sbi->s_partmaps == NULL) +		return;  	for (i = 0; i < sbi->s_partitions; i++)  		udf_free_partition(&sbi->s_partmaps[i]);  	kfree(sbi->s_partmaps); |