aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/inode.c')
-rw-r--r--fs/udf/inode.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index 91d1f1d3d7a5..ddd7780d1ab1 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -1101,42 +1101,36 @@ static void __udf_read_inode(struct inode *inode)
1101 fe = (struct fileEntry *)bh->b_data; 1101 fe = (struct fileEntry *)bh->b_data;
1102 1102
1103 if (fe->icbTag.strategyType == cpu_to_le16(4096)) { 1103 if (fe->icbTag.strategyType == cpu_to_le16(4096)) {
1104 struct buffer_head *ibh = NULL, *nbh = NULL; 1104 struct buffer_head *ibh;
1105 struct indirectEntry *ie;
1106 1105
1107 ibh = udf_read_ptagged(inode->i_sb, iinfo->i_location, 1, 1106 ibh = udf_read_ptagged(inode->i_sb, iinfo->i_location, 1,
1108 &ident); 1107 &ident);
1109 if (ident == TAG_IDENT_IE) { 1108 if (ident == TAG_IDENT_IE && ibh) {
1110 if (ibh) { 1109 struct buffer_head *nbh = NULL;
1111 kernel_lb_addr loc; 1110 kernel_lb_addr loc;
1112 ie = (struct indirectEntry *)ibh->b_data; 1111 struct indirectEntry *ie;
1113 1112
1114 loc = lelb_to_cpu(ie->indirectICB.extLocation); 1113 ie = (struct indirectEntry *)ibh->b_data;
1115 1114 loc = lelb_to_cpu(ie->indirectICB.extLocation);
1116 if (ie->indirectICB.extLength && 1115
1117 (nbh = udf_read_ptagged(inode->i_sb, loc, 0, 1116 if (ie->indirectICB.extLength &&
1118 &ident))) { 1117 (nbh = udf_read_ptagged(inode->i_sb, loc, 0,
1119 if (ident == TAG_IDENT_FE || 1118 &ident))) {
1120 ident == TAG_IDENT_EFE) { 1119 if (ident == TAG_IDENT_FE ||
1121 memcpy(&iinfo->i_location, 1120 ident == TAG_IDENT_EFE) {
1122 &loc, 1121 memcpy(&iinfo->i_location,
1123 sizeof(kernel_lb_addr)); 1122 &loc,
1124 brelse(bh); 1123 sizeof(kernel_lb_addr));
1125 brelse(ibh); 1124 brelse(bh);
1126 brelse(nbh);
1127 __udf_read_inode(inode);
1128 return;
1129 } else {
1130 brelse(nbh);
1131 brelse(ibh);
1132 }
1133 } else {
1134 brelse(ibh); 1125 brelse(ibh);
1126 brelse(nbh);
1127 __udf_read_inode(inode);
1128 return;
1135 } 1129 }
1130 brelse(nbh);
1136 } 1131 }
1137 } else {
1138 brelse(ibh);
1139 } 1132 }
1133 brelse(ibh);
1140 } else if (fe->icbTag.strategyType != cpu_to_le16(4)) { 1134 } else if (fe->icbTag.strategyType != cpu_to_le16(4)) {
1141 printk(KERN_ERR "udf: unsupported strategy type: %d\n", 1135 printk(KERN_ERR "udf: unsupported strategy type: %d\n",
1142 le16_to_cpu(fe->icbTag.strategyType)); 1136 le16_to_cpu(fe->icbTag.strategyType));