diff options
Diffstat (limited to 'fs/udf/partition.c')
| -rw-r--r-- | fs/udf/partition.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/fs/udf/partition.c b/fs/udf/partition.c index a71090ea0e0..d6caf01a209 100644 --- a/fs/udf/partition.c +++ b/fs/udf/partition.c @@ -33,8 +33,8 @@ uint32_t udf_get_pblock(struct super_block *sb, uint32_t block,  	struct udf_sb_info *sbi = UDF_SB(sb);  	struct udf_part_map *map;  	if (partition >= sbi->s_partitions) { -		udf_debug("block=%d, partition=%d, offset=%d: " -			  "invalid partition\n", block, partition, offset); +		udf_debug("block=%d, partition=%d, offset=%d: invalid partition\n", +			  block, partition, offset);  		return 0xFFFFFFFF;  	}  	map = &sbi->s_partmaps[partition]; @@ -60,8 +60,8 @@ uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block,  	vdata = &map->s_type_specific.s_virtual;  	if (block > vdata->s_num_entries) { -		udf_debug("Trying to access block beyond end of VAT " -			  "(%d max %d)\n", block, vdata->s_num_entries); +		udf_debug("Trying to access block beyond end of VAT (%d max %d)\n", +			  block, vdata->s_num_entries);  		return 0xFFFFFFFF;  	} @@ -321,9 +321,14 @@ uint32_t udf_get_pblock_meta25(struct super_block *sb, uint32_t block,  	/* We shouldn't mount such media... */  	BUG_ON(!inode);  	retblk = udf_try_read_meta(inode, block, partition, offset); -	if (retblk == 0xFFFFFFFF) { -		udf_warning(sb, __func__, "error reading from METADATA, " -			"trying to read from MIRROR"); +	if (retblk == 0xFFFFFFFF && mdata->s_metadata_fe) { +		udf_warn(sb, "error reading from METADATA, trying to read from MIRROR\n"); +		if (!(mdata->s_flags & MF_MIRROR_FE_LOADED)) { +			mdata->s_mirror_fe = udf_find_metadata_inode_efe(sb, +				mdata->s_mirror_file_loc, map->s_partition_num); +			mdata->s_flags |= MF_MIRROR_FE_LOADED; +		} +  		inode = mdata->s_mirror_fe;  		if (!inode)  			return 0xFFFFFFFF;  |