diff options
Diffstat (limited to 'fs/udf/super.c')
| -rw-r--r-- | fs/udf/super.c | 71 | 
1 files changed, 42 insertions, 29 deletions
diff --git a/fs/udf/super.c b/fs/udf/super.c index 3286db047a40..5401fc33f5cc 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -63,7 +63,7 @@  #include "udf_i.h"  #include <linux/init.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h>  #define VDS_POS_PRIMARY_VOL_DESC	0  #define VDS_POS_UNALLOC_SPACE_DESC	1 @@ -961,12 +961,14 @@ struct inode *udf_find_metadata_inode_efe(struct super_block *sb,  	metadata_fe = udf_iget(sb, &addr); -	if (metadata_fe == NULL) +	if (IS_ERR(metadata_fe)) {  		udf_warn(sb, "metadata inode efe not found\n"); -	else if (UDF_I(metadata_fe)->i_alloc_type != ICBTAG_FLAG_AD_SHORT) { +		return metadata_fe; +	} +	if (UDF_I(metadata_fe)->i_alloc_type != ICBTAG_FLAG_AD_SHORT) {  		udf_warn(sb, "metadata inode efe does not have short allocation descriptors!\n");  		iput(metadata_fe); -		metadata_fe = NULL; +		return ERR_PTR(-EIO);  	}  	return metadata_fe; @@ -978,6 +980,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition)  	struct udf_part_map *map;  	struct udf_meta_data *mdata;  	struct kernel_lb_addr addr; +	struct inode *fe;  	map = &sbi->s_partmaps[partition];  	mdata = &map->s_type_specific.s_metadata; @@ -986,22 +989,24 @@ static int udf_load_metadata_files(struct super_block *sb, int partition)  	udf_debug("Metadata file location: block = %d part = %d\n",  		  mdata->s_meta_file_loc, map->s_partition_num); -	mdata->s_metadata_fe = udf_find_metadata_inode_efe(sb, -		mdata->s_meta_file_loc, map->s_partition_num); - -	if (mdata->s_metadata_fe == NULL) { +	fe = udf_find_metadata_inode_efe(sb, mdata->s_meta_file_loc, +					 map->s_partition_num); +	if (IS_ERR(fe)) {  		/* mirror file entry */  		udf_debug("Mirror metadata file location: block = %d part = %d\n",  			  mdata->s_mirror_file_loc, map->s_partition_num); -		mdata->s_mirror_fe = udf_find_metadata_inode_efe(sb, -			mdata->s_mirror_file_loc, map->s_partition_num); +		fe = udf_find_metadata_inode_efe(sb, mdata->s_mirror_file_loc, +						 map->s_partition_num); -		if (mdata->s_mirror_fe == NULL) { +		if (IS_ERR(fe)) {  			udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n"); -			return -EIO; +			return PTR_ERR(fe);  		} -	} +		mdata->s_mirror_fe = fe; +	} else +		mdata->s_metadata_fe = fe; +  	/*  	 * bitmap file entry @@ -1015,15 +1020,16 @@ static int udf_load_metadata_files(struct super_block *sb, int partition)  		udf_debug("Bitmap file location: block = %d part = %d\n",  			  addr.logicalBlockNum, addr.partitionReferenceNum); -		mdata->s_bitmap_fe = udf_iget(sb, &addr); -		if (mdata->s_bitmap_fe == NULL) { +		fe = udf_iget(sb, &addr); +		if (IS_ERR(fe)) {  			if (sb->s_flags & MS_RDONLY)  				udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n");  			else {  				udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n"); -				return -EIO; +				return PTR_ERR(fe);  			} -		} +		} else +			mdata->s_bitmap_fe = fe;  	}  	udf_debug("udf_load_metadata_files Ok\n"); @@ -1111,13 +1117,15 @@ static int udf_fill_partdesc_info(struct super_block *sb,  				phd->unallocSpaceTable.extPosition),  			.partitionReferenceNum = p_index,  		}; +		struct inode *inode; -		map->s_uspace.s_table = udf_iget(sb, &loc); -		if (!map->s_uspace.s_table) { +		inode = udf_iget(sb, &loc); +		if (IS_ERR(inode)) {  			udf_debug("cannot load unallocSpaceTable (part %d)\n",  				  p_index); -			return -EIO; +			return PTR_ERR(inode);  		} +		map->s_uspace.s_table = inode;  		map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE;  		udf_debug("unallocSpaceTable (part %d) @ %ld\n",  			  p_index, map->s_uspace.s_table->i_ino); @@ -1144,14 +1152,15 @@ static int udf_fill_partdesc_info(struct super_block *sb,  				phd->freedSpaceTable.extPosition),  			.partitionReferenceNum = p_index,  		}; +		struct inode *inode; -		map->s_fspace.s_table = udf_iget(sb, &loc); -		if (!map->s_fspace.s_table) { +		inode = udf_iget(sb, &loc); +		if (IS_ERR(inode)) {  			udf_debug("cannot load freedSpaceTable (part %d)\n",  				  p_index); -			return -EIO; +			return PTR_ERR(inode);  		} - +		map->s_fspace.s_table = inode;  		map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE;  		udf_debug("freedSpaceTable (part %d) @ %ld\n",  			  p_index, map->s_fspace.s_table->i_ino); @@ -1178,6 +1187,7 @@ static void udf_find_vat_block(struct super_block *sb, int p_index,  	struct udf_part_map *map = &sbi->s_partmaps[p_index];  	sector_t vat_block;  	struct kernel_lb_addr ino; +	struct inode *inode;  	/*  	 * VAT file entry is in the last recorded block. Some broken disks have @@ -1186,10 +1196,13 @@ static void udf_find_vat_block(struct super_block *sb, int p_index,  	ino.partitionReferenceNum = type1_index;  	for (vat_block = start_block;  	     vat_block >= map->s_partition_root && -	     vat_block >= start_block - 3 && -	     !sbi->s_vat_inode; vat_block--) { +	     vat_block >= start_block - 3; vat_block--) {  		ino.logicalBlockNum = vat_block - map->s_partition_root; -		sbi->s_vat_inode = udf_iget(sb, &ino); +		inode = udf_iget(sb, &ino); +		if (!IS_ERR(inode)) { +			sbi->s_vat_inode = inode; +			break; +		}  	}  } @@ -2205,10 +2218,10 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)  	/* assign inodes by physical block number */  	/* perhaps it's not extensible enough, but for now ... */  	inode = udf_iget(sb, &rootdir); -	if (!inode) { +	if (IS_ERR(inode)) {  		udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n",  		       rootdir.logicalBlockNum, rootdir.partitionReferenceNum); -		ret = -EIO; +		ret = PTR_ERR(inode);  		goto error_out;  	}  |