diff options
author | Jan Kara <jack@suse.cz> | 2013-07-25 13:10:59 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2013-07-31 16:14:50 -0400 |
commit | d759bfa4e7919b89357de50a2e23817079889195 (patch) | |
tree | 77704442d642f3bef53ff230050e31271bc86cad /fs | |
parent | 17b7f7cf58926844e1dd40f5eb5348d481deca6a (diff) |
udf: Standardize return values in mount sequence
Change all function used in filesystem discovery during mount to user
standard kernel return values - -errno on error, 0 on success instead
of 1 on failure and 0 on success. This allows us to pass error number
(not just failure / success) so we can abort device scanning earlier
in case of errors like EIO or ENOMEM . Also we will be able to return
EROFS in case writeable mount is requested but writing isn't supported.
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/udf/super.c | 300 |
1 files changed, 183 insertions, 117 deletions
diff --git a/fs/udf/super.c b/fs/udf/super.c index 9ac4057a86c9..c68da0dac2c5 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -843,27 +843,38 @@ static int udf_find_fileset(struct super_block *sb, | |||
843 | return 1; | 843 | return 1; |
844 | } | 844 | } |
845 | 845 | ||
846 | /* | ||
847 | * Load primary Volume Descriptor Sequence | ||
848 | * | ||
849 | * Return <0 on error, 0 on success. -EAGAIN is special meaning next sequence | ||
850 | * should be tried. | ||
851 | */ | ||
846 | static int udf_load_pvoldesc(struct super_block *sb, sector_t block) | 852 | static int udf_load_pvoldesc(struct super_block *sb, sector_t block) |
847 | { | 853 | { |
848 | struct primaryVolDesc *pvoldesc; | 854 | struct primaryVolDesc *pvoldesc; |
849 | struct ustr *instr, *outstr; | 855 | struct ustr *instr, *outstr; |
850 | struct buffer_head *bh; | 856 | struct buffer_head *bh; |
851 | uint16_t ident; | 857 | uint16_t ident; |
852 | int ret = 1; | 858 | int ret = -ENOMEM; |
853 | 859 | ||
854 | instr = kmalloc(sizeof(struct ustr), GFP_NOFS); | 860 | instr = kmalloc(sizeof(struct ustr), GFP_NOFS); |
855 | if (!instr) | 861 | if (!instr) |
856 | return 1; | 862 | return -ENOMEM; |
857 | 863 | ||
858 | outstr = kmalloc(sizeof(struct ustr), GFP_NOFS); | 864 | outstr = kmalloc(sizeof(struct ustr), GFP_NOFS); |
859 | if (!outstr) | 865 | if (!outstr) |
860 | goto out1; | 866 | goto out1; |
861 | 867 | ||
862 | bh = udf_read_tagged(sb, block, block, &ident); | 868 | bh = udf_read_tagged(sb, block, block, &ident); |
863 | if (!bh) | 869 | if (!bh) { |
870 | ret = -EAGAIN; | ||
864 | goto out2; | 871 | goto out2; |
872 | } | ||
865 | 873 | ||
866 | BUG_ON(ident != TAG_IDENT_PVD); | 874 | if (ident != TAG_IDENT_PVD) { |
875 | ret = -EIO; | ||
876 | goto out_bh; | ||
877 | } | ||
867 | 878 | ||
868 | pvoldesc = (struct primaryVolDesc *)bh->b_data; | 879 | pvoldesc = (struct primaryVolDesc *)bh->b_data; |
869 | 880 | ||
@@ -889,8 +900,9 @@ static int udf_load_pvoldesc(struct super_block *sb, sector_t block) | |||
889 | if (udf_CS0toUTF8(outstr, instr)) | 900 | if (udf_CS0toUTF8(outstr, instr)) |
890 | udf_debug("volSetIdent[] = '%s'\n", outstr->u_name); | 901 | udf_debug("volSetIdent[] = '%s'\n", outstr->u_name); |
891 | 902 | ||
892 | brelse(bh); | ||
893 | ret = 0; | 903 | ret = 0; |
904 | out_bh: | ||
905 | brelse(bh); | ||
894 | out2: | 906 | out2: |
895 | kfree(outstr); | 907 | kfree(outstr); |
896 | out1: | 908 | out1: |
@@ -947,7 +959,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
947 | 959 | ||
948 | if (mdata->s_mirror_fe == NULL) { | 960 | if (mdata->s_mirror_fe == NULL) { |
949 | udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n"); | 961 | udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n"); |
950 | goto error_exit; | 962 | return -EIO; |
951 | } | 963 | } |
952 | } | 964 | } |
953 | 965 | ||
@@ -964,23 +976,18 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
964 | addr.logicalBlockNum, addr.partitionReferenceNum); | 976 | addr.logicalBlockNum, addr.partitionReferenceNum); |
965 | 977 | ||
966 | mdata->s_bitmap_fe = udf_iget(sb, &addr); | 978 | mdata->s_bitmap_fe = udf_iget(sb, &addr); |
967 | |||
968 | if (mdata->s_bitmap_fe == NULL) { | 979 | if (mdata->s_bitmap_fe == NULL) { |
969 | if (sb->s_flags & MS_RDONLY) | 980 | if (sb->s_flags & MS_RDONLY) |
970 | udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n"); | 981 | udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n"); |
971 | else { | 982 | else { |
972 | udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n"); | 983 | udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n"); |
973 | goto error_exit; | 984 | return -EIO; |
974 | } | 985 | } |
975 | } | 986 | } |
976 | } | 987 | } |
977 | 988 | ||
978 | udf_debug("udf_load_metadata_files Ok\n"); | 989 | udf_debug("udf_load_metadata_files Ok\n"); |
979 | |||
980 | return 0; | 990 | return 0; |
981 | |||
982 | error_exit: | ||
983 | return 1; | ||
984 | } | 991 | } |
985 | 992 | ||
986 | static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh, | 993 | static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh, |
@@ -1069,7 +1076,7 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
1069 | if (!map->s_uspace.s_table) { | 1076 | if (!map->s_uspace.s_table) { |
1070 | udf_debug("cannot load unallocSpaceTable (part %d)\n", | 1077 | udf_debug("cannot load unallocSpaceTable (part %d)\n", |
1071 | p_index); | 1078 | p_index); |
1072 | return 1; | 1079 | return -EIO; |
1073 | } | 1080 | } |
1074 | map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE; | 1081 | map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE; |
1075 | udf_debug("unallocSpaceTable (part %d) @ %ld\n", | 1082 | udf_debug("unallocSpaceTable (part %d) @ %ld\n", |
@@ -1079,7 +1086,7 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
1079 | if (phd->unallocSpaceBitmap.extLength) { | 1086 | if (phd->unallocSpaceBitmap.extLength) { |
1080 | struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index); | 1087 | struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index); |
1081 | if (!bitmap) | 1088 | if (!bitmap) |
1082 | return 1; | 1089 | return -ENOMEM; |
1083 | map->s_uspace.s_bitmap = bitmap; | 1090 | map->s_uspace.s_bitmap = bitmap; |
1084 | bitmap->s_extPosition = le32_to_cpu( | 1091 | bitmap->s_extPosition = le32_to_cpu( |
1085 | phd->unallocSpaceBitmap.extPosition); | 1092 | phd->unallocSpaceBitmap.extPosition); |
@@ -1102,7 +1109,7 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
1102 | if (!map->s_fspace.s_table) { | 1109 | if (!map->s_fspace.s_table) { |
1103 | udf_debug("cannot load freedSpaceTable (part %d)\n", | 1110 | udf_debug("cannot load freedSpaceTable (part %d)\n", |
1104 | p_index); | 1111 | p_index); |
1105 | return 1; | 1112 | return -EIO; |
1106 | } | 1113 | } |
1107 | 1114 | ||
1108 | map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE; | 1115 | map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE; |
@@ -1113,7 +1120,7 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
1113 | if (phd->freedSpaceBitmap.extLength) { | 1120 | if (phd->freedSpaceBitmap.extLength) { |
1114 | struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index); | 1121 | struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index); |
1115 | if (!bitmap) | 1122 | if (!bitmap) |
1116 | return 1; | 1123 | return -ENOMEM; |
1117 | map->s_fspace.s_bitmap = bitmap; | 1124 | map->s_fspace.s_bitmap = bitmap; |
1118 | bitmap->s_extPosition = le32_to_cpu( | 1125 | bitmap->s_extPosition = le32_to_cpu( |
1119 | phd->freedSpaceBitmap.extPosition); | 1126 | phd->freedSpaceBitmap.extPosition); |
@@ -1165,7 +1172,7 @@ static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) | |||
1165 | udf_find_vat_block(sb, p_index, type1_index, blocks - 1); | 1172 | udf_find_vat_block(sb, p_index, type1_index, blocks - 1); |
1166 | } | 1173 | } |
1167 | if (!sbi->s_vat_inode) | 1174 | if (!sbi->s_vat_inode) |
1168 | return 1; | 1175 | return -EIO; |
1169 | 1176 | ||
1170 | if (map->s_partition_type == UDF_VIRTUAL_MAP15) { | 1177 | if (map->s_partition_type == UDF_VIRTUAL_MAP15) { |
1171 | map->s_type_specific.s_virtual.s_start_offset = 0; | 1178 | map->s_type_specific.s_virtual.s_start_offset = 0; |
@@ -1177,7 +1184,7 @@ static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) | |||
1177 | pos = udf_block_map(sbi->s_vat_inode, 0); | 1184 | pos = udf_block_map(sbi->s_vat_inode, 0); |
1178 | bh = sb_bread(sb, pos); | 1185 | bh = sb_bread(sb, pos); |
1179 | if (!bh) | 1186 | if (!bh) |
1180 | return 1; | 1187 | return -EIO; |
1181 | vat20 = (struct virtualAllocationTable20 *)bh->b_data; | 1188 | vat20 = (struct virtualAllocationTable20 *)bh->b_data; |
1182 | } else { | 1189 | } else { |
1183 | vat20 = (struct virtualAllocationTable20 *) | 1190 | vat20 = (struct virtualAllocationTable20 *) |
@@ -1195,6 +1202,12 @@ static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) | |||
1195 | return 0; | 1202 | return 0; |
1196 | } | 1203 | } |
1197 | 1204 | ||
1205 | /* | ||
1206 | * Load partition descriptor block | ||
1207 | * | ||
1208 | * Returns <0 on error, 0 on success, -EAGAIN is special - try next descriptor | ||
1209 | * sequence. | ||
1210 | */ | ||
1198 | static int udf_load_partdesc(struct super_block *sb, sector_t block) | 1211 | static int udf_load_partdesc(struct super_block *sb, sector_t block) |
1199 | { | 1212 | { |
1200 | struct buffer_head *bh; | 1213 | struct buffer_head *bh; |
@@ -1204,13 +1217,15 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block) | |||
1204 | int i, type1_idx; | 1217 | int i, type1_idx; |
1205 | uint16_t partitionNumber; | 1218 | uint16_t partitionNumber; |
1206 | uint16_t ident; | 1219 | uint16_t ident; |
1207 | int ret = 0; | 1220 | int ret; |
1208 | 1221 | ||
1209 | bh = udf_read_tagged(sb, block, block, &ident); | 1222 | bh = udf_read_tagged(sb, block, block, &ident); |
1210 | if (!bh) | 1223 | if (!bh) |
1211 | return 1; | 1224 | return -EAGAIN; |
1212 | if (ident != TAG_IDENT_PD) | 1225 | if (ident != TAG_IDENT_PD) { |
1226 | ret = 0; | ||
1213 | goto out_bh; | 1227 | goto out_bh; |
1228 | } | ||
1214 | 1229 | ||
1215 | p = (struct partitionDesc *)bh->b_data; | 1230 | p = (struct partitionDesc *)bh->b_data; |
1216 | partitionNumber = le16_to_cpu(p->partitionNumber); | 1231 | partitionNumber = le16_to_cpu(p->partitionNumber); |
@@ -1229,10 +1244,13 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block) | |||
1229 | if (i >= sbi->s_partitions) { | 1244 | if (i >= sbi->s_partitions) { |
1230 | udf_debug("Partition (%d) not found in partition map\n", | 1245 | udf_debug("Partition (%d) not found in partition map\n", |
1231 | partitionNumber); | 1246 | partitionNumber); |
1247 | ret = 0; | ||
1232 | goto out_bh; | 1248 | goto out_bh; |
1233 | } | 1249 | } |
1234 | 1250 | ||
1235 | ret = udf_fill_partdesc_info(sb, p, i); | 1251 | ret = udf_fill_partdesc_info(sb, p, i); |
1252 | if (ret < 0) | ||
1253 | goto out_bh; | ||
1236 | 1254 | ||
1237 | /* | 1255 | /* |
1238 | * Now rescan for VIRTUAL or METADATA partitions when SPARABLE and | 1256 | * Now rescan for VIRTUAL or METADATA partitions when SPARABLE and |
@@ -1249,23 +1267,25 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block) | |||
1249 | break; | 1267 | break; |
1250 | } | 1268 | } |
1251 | 1269 | ||
1252 | if (i >= sbi->s_partitions) | 1270 | if (i >= sbi->s_partitions) { |
1271 | ret = 0; | ||
1253 | goto out_bh; | 1272 | goto out_bh; |
1273 | } | ||
1254 | 1274 | ||
1255 | ret = udf_fill_partdesc_info(sb, p, i); | 1275 | ret = udf_fill_partdesc_info(sb, p, i); |
1256 | if (ret) | 1276 | if (ret < 0) |
1257 | goto out_bh; | 1277 | goto out_bh; |
1258 | 1278 | ||
1259 | if (map->s_partition_type == UDF_METADATA_MAP25) { | 1279 | if (map->s_partition_type == UDF_METADATA_MAP25) { |
1260 | ret = udf_load_metadata_files(sb, i); | 1280 | ret = udf_load_metadata_files(sb, i); |
1261 | if (ret) { | 1281 | if (ret < 0) { |
1262 | udf_err(sb, "error loading MetaData partition map %d\n", | 1282 | udf_err(sb, "error loading MetaData partition map %d\n", |
1263 | i); | 1283 | i); |
1264 | goto out_bh; | 1284 | goto out_bh; |
1265 | } | 1285 | } |
1266 | } else { | 1286 | } else { |
1267 | ret = udf_load_vat(sb, i, type1_idx); | 1287 | ret = udf_load_vat(sb, i, type1_idx); |
1268 | if (ret) | 1288 | if (ret < 0) |
1269 | goto out_bh; | 1289 | goto out_bh; |
1270 | /* | 1290 | /* |
1271 | * Mark filesystem read-only if we have a partition with | 1291 | * Mark filesystem read-only if we have a partition with |
@@ -1275,6 +1295,7 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block) | |||
1275 | sb->s_flags |= MS_RDONLY; | 1295 | sb->s_flags |= MS_RDONLY; |
1276 | pr_notice("Filesystem marked read-only because writing to pseudooverwrite partition is not implemented\n"); | 1296 | pr_notice("Filesystem marked read-only because writing to pseudooverwrite partition is not implemented\n"); |
1277 | } | 1297 | } |
1298 | ret = 0; | ||
1278 | out_bh: | 1299 | out_bh: |
1279 | /* In case loading failed, we handle cleanup in udf_fill_super */ | 1300 | /* In case loading failed, we handle cleanup in udf_fill_super */ |
1280 | brelse(bh); | 1301 | brelse(bh); |
@@ -1340,11 +1361,11 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
1340 | uint16_t ident; | 1361 | uint16_t ident; |
1341 | struct buffer_head *bh; | 1362 | struct buffer_head *bh; |
1342 | unsigned int table_len; | 1363 | unsigned int table_len; |
1343 | int ret = 0; | 1364 | int ret; |
1344 | 1365 | ||
1345 | bh = udf_read_tagged(sb, block, block, &ident); | 1366 | bh = udf_read_tagged(sb, block, block, &ident); |
1346 | if (!bh) | 1367 | if (!bh) |
1347 | return 1; | 1368 | return -EAGAIN; |
1348 | BUG_ON(ident != TAG_IDENT_LVD); | 1369 | BUG_ON(ident != TAG_IDENT_LVD); |
1349 | lvd = (struct logicalVolDesc *)bh->b_data; | 1370 | lvd = (struct logicalVolDesc *)bh->b_data; |
1350 | table_len = le32_to_cpu(lvd->mapTableLength); | 1371 | table_len = le32_to_cpu(lvd->mapTableLength); |
@@ -1352,7 +1373,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
1352 | udf_err(sb, "error loading logical volume descriptor: " | 1373 | udf_err(sb, "error loading logical volume descriptor: " |
1353 | "Partition table too long (%u > %lu)\n", table_len, | 1374 | "Partition table too long (%u > %lu)\n", table_len, |
1354 | sb->s_blocksize - sizeof(*lvd)); | 1375 | sb->s_blocksize - sizeof(*lvd)); |
1355 | ret = 1; | 1376 | ret = -EIO; |
1356 | goto out_bh; | 1377 | goto out_bh; |
1357 | } | 1378 | } |
1358 | 1379 | ||
@@ -1396,11 +1417,10 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
1396 | } else if (!strncmp(upm2->partIdent.ident, | 1417 | } else if (!strncmp(upm2->partIdent.ident, |
1397 | UDF_ID_SPARABLE, | 1418 | UDF_ID_SPARABLE, |
1398 | strlen(UDF_ID_SPARABLE))) { | 1419 | strlen(UDF_ID_SPARABLE))) { |
1399 | if (udf_load_sparable_map(sb, map, | 1420 | ret = udf_load_sparable_map(sb, map, |
1400 | (struct sparablePartitionMap *)gpm) < 0) { | 1421 | (struct sparablePartitionMap *)gpm); |
1401 | ret = 1; | 1422 | if (ret < 0) |
1402 | goto out_bh; | 1423 | goto out_bh; |
1403 | } | ||
1404 | } else if (!strncmp(upm2->partIdent.ident, | 1424 | } else if (!strncmp(upm2->partIdent.ident, |
1405 | UDF_ID_METADATA, | 1425 | UDF_ID_METADATA, |
1406 | strlen(UDF_ID_METADATA))) { | 1426 | strlen(UDF_ID_METADATA))) { |
@@ -1465,7 +1485,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
1465 | } | 1485 | } |
1466 | if (lvd->integritySeqExt.extLength) | 1486 | if (lvd->integritySeqExt.extLength) |
1467 | udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt)); | 1487 | udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt)); |
1468 | 1488 | ret = 0; | |
1469 | out_bh: | 1489 | out_bh: |
1470 | brelse(bh); | 1490 | brelse(bh); |
1471 | return ret; | 1491 | return ret; |
@@ -1503,22 +1523,18 @@ static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_ | |||
1503 | } | 1523 | } |
1504 | 1524 | ||
1505 | /* | 1525 | /* |
1506 | * udf_process_sequence | 1526 | * Process a main/reserve volume descriptor sequence. |
1507 | * | 1527 | * @block First block of first extent of the sequence. |
1508 | * PURPOSE | 1528 | * @lastblock Lastblock of first extent of the sequence. |
1509 | * Process a main/reserve volume descriptor sequence. | 1529 | * @fileset There we store extent containing root fileset |
1510 | * | 1530 | * |
1511 | * PRE-CONDITIONS | 1531 | * Returns <0 on error, 0 on success. -EAGAIN is special - try next descriptor |
1512 | * sb Pointer to _locked_ superblock. | 1532 | * sequence |
1513 | * block First block of first extent of the sequence. | ||
1514 | * lastblock Lastblock of first extent of the sequence. | ||
1515 | * | ||
1516 | * HISTORY | ||
1517 | * July 1, 1997 - Andrew E. Mileski | ||
1518 | * Written, tested, and released. | ||
1519 | */ | 1533 | */ |
1520 | static noinline int udf_process_sequence(struct super_block *sb, long block, | 1534 | static noinline int udf_process_sequence( |
1521 | long lastblock, struct kernel_lb_addr *fileset) | 1535 | struct super_block *sb, |
1536 | sector_t block, sector_t lastblock, | ||
1537 | struct kernel_lb_addr *fileset) | ||
1522 | { | 1538 | { |
1523 | struct buffer_head *bh = NULL; | 1539 | struct buffer_head *bh = NULL; |
1524 | struct udf_vds_record vds[VDS_POS_LENGTH]; | 1540 | struct udf_vds_record vds[VDS_POS_LENGTH]; |
@@ -1529,6 +1545,7 @@ static noinline int udf_process_sequence(struct super_block *sb, long block, | |||
1529 | uint32_t vdsn; | 1545 | uint32_t vdsn; |
1530 | uint16_t ident; | 1546 | uint16_t ident; |
1531 | long next_s = 0, next_e = 0; | 1547 | long next_s = 0, next_e = 0; |
1548 | int ret; | ||
1532 | 1549 | ||
1533 | memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH); | 1550 | memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH); |
1534 | 1551 | ||
@@ -1543,7 +1560,7 @@ static noinline int udf_process_sequence(struct super_block *sb, long block, | |||
1543 | udf_err(sb, | 1560 | udf_err(sb, |
1544 | "Block %llu of volume descriptor sequence is corrupted or we could not read it\n", | 1561 | "Block %llu of volume descriptor sequence is corrupted or we could not read it\n", |
1545 | (unsigned long long)block); | 1562 | (unsigned long long)block); |
1546 | return 1; | 1563 | return -EAGAIN; |
1547 | } | 1564 | } |
1548 | 1565 | ||
1549 | /* Process each descriptor (ISO 13346 3/8.3-8.4) */ | 1566 | /* Process each descriptor (ISO 13346 3/8.3-8.4) */ |
@@ -1616,14 +1633,19 @@ static noinline int udf_process_sequence(struct super_block *sb, long block, | |||
1616 | */ | 1633 | */ |
1617 | if (!vds[VDS_POS_PRIMARY_VOL_DESC].block) { | 1634 | if (!vds[VDS_POS_PRIMARY_VOL_DESC].block) { |
1618 | udf_err(sb, "Primary Volume Descriptor not found!\n"); | 1635 | udf_err(sb, "Primary Volume Descriptor not found!\n"); |
1619 | return 1; | 1636 | return -EAGAIN; |
1637 | } | ||
1638 | ret = udf_load_pvoldesc(sb, vds[VDS_POS_PRIMARY_VOL_DESC].block); | ||
1639 | if (ret < 0) | ||
1640 | return ret; | ||
1641 | |||
1642 | if (vds[VDS_POS_LOGICAL_VOL_DESC].block) { | ||
1643 | ret = udf_load_logicalvol(sb, | ||
1644 | vds[VDS_POS_LOGICAL_VOL_DESC].block, | ||
1645 | fileset); | ||
1646 | if (ret < 0) | ||
1647 | return ret; | ||
1620 | } | 1648 | } |
1621 | if (udf_load_pvoldesc(sb, vds[VDS_POS_PRIMARY_VOL_DESC].block)) | ||
1622 | return 1; | ||
1623 | |||
1624 | if (vds[VDS_POS_LOGICAL_VOL_DESC].block && udf_load_logicalvol(sb, | ||
1625 | vds[VDS_POS_LOGICAL_VOL_DESC].block, fileset)) | ||
1626 | return 1; | ||
1627 | 1649 | ||
1628 | if (vds[VDS_POS_PARTITION_DESC].block) { | 1650 | if (vds[VDS_POS_PARTITION_DESC].block) { |
1629 | /* | 1651 | /* |
@@ -1632,19 +1654,27 @@ static noinline int udf_process_sequence(struct super_block *sb, long block, | |||
1632 | */ | 1654 | */ |
1633 | for (block = vds[VDS_POS_PARTITION_DESC].block; | 1655 | for (block = vds[VDS_POS_PARTITION_DESC].block; |
1634 | block < vds[VDS_POS_TERMINATING_DESC].block; | 1656 | block < vds[VDS_POS_TERMINATING_DESC].block; |
1635 | block++) | 1657 | block++) { |
1636 | if (udf_load_partdesc(sb, block)) | 1658 | ret = udf_load_partdesc(sb, block); |
1637 | return 1; | 1659 | if (ret < 0) |
1660 | return ret; | ||
1661 | } | ||
1638 | } | 1662 | } |
1639 | 1663 | ||
1640 | return 0; | 1664 | return 0; |
1641 | } | 1665 | } |
1642 | 1666 | ||
1667 | /* | ||
1668 | * Load Volume Descriptor Sequence described by anchor in bh | ||
1669 | * | ||
1670 | * Returns <0 on error, 0 on success | ||
1671 | */ | ||
1643 | static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh, | 1672 | static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh, |
1644 | struct kernel_lb_addr *fileset) | 1673 | struct kernel_lb_addr *fileset) |
1645 | { | 1674 | { |
1646 | struct anchorVolDescPtr *anchor; | 1675 | struct anchorVolDescPtr *anchor; |
1647 | long main_s, main_e, reserve_s, reserve_e; | 1676 | sector_t main_s, main_e, reserve_s, reserve_e; |
1677 | int ret; | ||
1648 | 1678 | ||
1649 | anchor = (struct anchorVolDescPtr *)bh->b_data; | 1679 | anchor = (struct anchorVolDescPtr *)bh->b_data; |
1650 | 1680 | ||
@@ -1662,18 +1692,26 @@ static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh, | |||
1662 | 1692 | ||
1663 | /* Process the main & reserve sequences */ | 1693 | /* Process the main & reserve sequences */ |
1664 | /* responsible for finding the PartitionDesc(s) */ | 1694 | /* responsible for finding the PartitionDesc(s) */ |
1665 | if (!udf_process_sequence(sb, main_s, main_e, fileset)) | 1695 | ret = udf_process_sequence(sb, main_s, main_e, fileset); |
1666 | return 1; | 1696 | if (ret != -EAGAIN) |
1667 | udf_sb_free_partitions(sb); | 1697 | return ret; |
1668 | if (!udf_process_sequence(sb, reserve_s, reserve_e, fileset)) | ||
1669 | return 1; | ||
1670 | udf_sb_free_partitions(sb); | 1698 | udf_sb_free_partitions(sb); |
1671 | return 0; | 1699 | ret = udf_process_sequence(sb, reserve_s, reserve_e, fileset); |
1700 | if (ret < 0) { | ||
1701 | udf_sb_free_partitions(sb); | ||
1702 | /* No sequence was OK, return -EIO */ | ||
1703 | if (ret == -EAGAIN) | ||
1704 | ret = -EIO; | ||
1705 | } | ||
1706 | return ret; | ||
1672 | } | 1707 | } |
1673 | 1708 | ||
1674 | /* | 1709 | /* |
1675 | * Check whether there is an anchor block in the given block and | 1710 | * Check whether there is an anchor block in the given block and |
1676 | * load Volume Descriptor Sequence if so. | 1711 | * load Volume Descriptor Sequence if so. |
1712 | * | ||
1713 | * Returns <0 on error, 0 on success, -EAGAIN is special - try next anchor | ||
1714 | * block | ||
1677 | */ | 1715 | */ |
1678 | static int udf_check_anchor_block(struct super_block *sb, sector_t block, | 1716 | static int udf_check_anchor_block(struct super_block *sb, sector_t block, |
1679 | struct kernel_lb_addr *fileset) | 1717 | struct kernel_lb_addr *fileset) |
@@ -1685,33 +1723,40 @@ static int udf_check_anchor_block(struct super_block *sb, sector_t block, | |||
1685 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && | 1723 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && |
1686 | udf_fixed_to_variable(block) >= | 1724 | udf_fixed_to_variable(block) >= |
1687 | sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) | 1725 | sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) |
1688 | return 0; | 1726 | return -EAGAIN; |
1689 | 1727 | ||
1690 | bh = udf_read_tagged(sb, block, block, &ident); | 1728 | bh = udf_read_tagged(sb, block, block, &ident); |
1691 | if (!bh) | 1729 | if (!bh) |
1692 | return 0; | 1730 | return -EAGAIN; |
1693 | if (ident != TAG_IDENT_AVDP) { | 1731 | if (ident != TAG_IDENT_AVDP) { |
1694 | brelse(bh); | 1732 | brelse(bh); |
1695 | return 0; | 1733 | return -EAGAIN; |
1696 | } | 1734 | } |
1697 | ret = udf_load_sequence(sb, bh, fileset); | 1735 | ret = udf_load_sequence(sb, bh, fileset); |
1698 | brelse(bh); | 1736 | brelse(bh); |
1699 | return ret; | 1737 | return ret; |
1700 | } | 1738 | } |
1701 | 1739 | ||
1702 | /* Search for an anchor volume descriptor pointer */ | 1740 | /* |
1703 | static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock, | 1741 | * Search for an anchor volume descriptor pointer. |
1704 | struct kernel_lb_addr *fileset) | 1742 | * |
1743 | * Returns < 0 on error, 0 on success. -EAGAIN is special - try next set | ||
1744 | * of anchors. | ||
1745 | */ | ||
1746 | static int udf_scan_anchors(struct super_block *sb, sector_t *lastblock, | ||
1747 | struct kernel_lb_addr *fileset) | ||
1705 | { | 1748 | { |
1706 | sector_t last[6]; | 1749 | sector_t last[6]; |
1707 | int i; | 1750 | int i; |
1708 | struct udf_sb_info *sbi = UDF_SB(sb); | 1751 | struct udf_sb_info *sbi = UDF_SB(sb); |
1709 | int last_count = 0; | 1752 | int last_count = 0; |
1753 | int ret; | ||
1710 | 1754 | ||
1711 | /* First try user provided anchor */ | 1755 | /* First try user provided anchor */ |
1712 | if (sbi->s_anchor) { | 1756 | if (sbi->s_anchor) { |
1713 | if (udf_check_anchor_block(sb, sbi->s_anchor, fileset)) | 1757 | ret = udf_check_anchor_block(sb, sbi->s_anchor, fileset); |
1714 | return lastblock; | 1758 | if (ret != -EAGAIN) |
1759 | return ret; | ||
1715 | } | 1760 | } |
1716 | /* | 1761 | /* |
1717 | * according to spec, anchor is in either: | 1762 | * according to spec, anchor is in either: |
@@ -1720,39 +1765,46 @@ static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock, | |||
1720 | * lastblock | 1765 | * lastblock |
1721 | * however, if the disc isn't closed, it could be 512. | 1766 | * however, if the disc isn't closed, it could be 512. |
1722 | */ | 1767 | */ |
1723 | if (udf_check_anchor_block(sb, sbi->s_session + 256, fileset)) | 1768 | ret = udf_check_anchor_block(sb, sbi->s_session + 256, fileset); |
1724 | return lastblock; | 1769 | if (ret != -EAGAIN) |
1770 | return ret; | ||
1725 | /* | 1771 | /* |
1726 | * The trouble is which block is the last one. Drives often misreport | 1772 | * The trouble is which block is the last one. Drives often misreport |
1727 | * this so we try various possibilities. | 1773 | * this so we try various possibilities. |
1728 | */ | 1774 | */ |
1729 | last[last_count++] = lastblock; | 1775 | last[last_count++] = *lastblock; |
1730 | if (lastblock >= 1) | 1776 | if (*lastblock >= 1) |
1731 | last[last_count++] = lastblock - 1; | 1777 | last[last_count++] = *lastblock - 1; |
1732 | last[last_count++] = lastblock + 1; | 1778 | last[last_count++] = *lastblock + 1; |
1733 | if (lastblock >= 2) | 1779 | if (*lastblock >= 2) |
1734 | last[last_count++] = lastblock - 2; | 1780 | last[last_count++] = *lastblock - 2; |
1735 | if (lastblock >= 150) | 1781 | if (*lastblock >= 150) |
1736 | last[last_count++] = lastblock - 150; | 1782 | last[last_count++] = *lastblock - 150; |
1737 | if (lastblock >= 152) | 1783 | if (*lastblock >= 152) |
1738 | last[last_count++] = lastblock - 152; | 1784 | last[last_count++] = *lastblock - 152; |
1739 | 1785 | ||
1740 | for (i = 0; i < last_count; i++) { | 1786 | for (i = 0; i < last_count; i++) { |
1741 | if (last[i] >= sb->s_bdev->bd_inode->i_size >> | 1787 | if (last[i] >= sb->s_bdev->bd_inode->i_size >> |
1742 | sb->s_blocksize_bits) | 1788 | sb->s_blocksize_bits) |
1743 | continue; | 1789 | continue; |
1744 | if (udf_check_anchor_block(sb, last[i], fileset)) | 1790 | ret = udf_check_anchor_block(sb, last[i], fileset); |
1745 | return last[i]; | 1791 | if (ret != -EAGAIN) { |
1792 | if (!ret) | ||
1793 | *lastblock = last[i]; | ||
1794 | return ret; | ||
1795 | } | ||
1746 | if (last[i] < 256) | 1796 | if (last[i] < 256) |
1747 | continue; | 1797 | continue; |
1748 | if (udf_check_anchor_block(sb, last[i] - 256, fileset)) | 1798 | ret = udf_check_anchor_block(sb, last[i] - 256, fileset); |
1749 | return last[i]; | 1799 | if (ret != -EAGAIN) { |
1800 | if (!ret) | ||
1801 | *lastblock = last[i]; | ||
1802 | return ret; | ||
1803 | } | ||
1750 | } | 1804 | } |
1751 | 1805 | ||
1752 | /* Finally try block 512 in case media is open */ | 1806 | /* Finally try block 512 in case media is open */ |
1753 | if (udf_check_anchor_block(sb, sbi->s_session + 512, fileset)) | 1807 | return udf_check_anchor_block(sb, sbi->s_session + 512, fileset); |
1754 | return last[0]; | ||
1755 | return 0; | ||
1756 | } | 1808 | } |
1757 | 1809 | ||
1758 | /* | 1810 | /* |
@@ -1760,54 +1812,59 @@ static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock, | |||
1760 | * area specified by it. The function expects sbi->s_lastblock to be the last | 1812 | * area specified by it. The function expects sbi->s_lastblock to be the last |
1761 | * block on the media. | 1813 | * block on the media. |
1762 | * | 1814 | * |
1763 | * Return 1 if ok, 0 if not found. | 1815 | * Return <0 on error, 0 if anchor found. -EAGAIN is special meaning anchor |
1764 | * | 1816 | * was not found. |
1765 | */ | 1817 | */ |
1766 | static int udf_find_anchor(struct super_block *sb, | 1818 | static int udf_find_anchor(struct super_block *sb, |
1767 | struct kernel_lb_addr *fileset) | 1819 | struct kernel_lb_addr *fileset) |
1768 | { | 1820 | { |
1769 | sector_t lastblock; | ||
1770 | struct udf_sb_info *sbi = UDF_SB(sb); | 1821 | struct udf_sb_info *sbi = UDF_SB(sb); |
1822 | sector_t lastblock = sbi->s_last_block; | ||
1823 | int ret; | ||
1771 | 1824 | ||
1772 | lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset); | 1825 | ret = udf_scan_anchors(sb, &lastblock, fileset); |
1773 | if (lastblock) | 1826 | if (ret != -EAGAIN) |
1774 | goto out; | 1827 | goto out; |
1775 | 1828 | ||
1776 | /* No anchor found? Try VARCONV conversion of block numbers */ | 1829 | /* No anchor found? Try VARCONV conversion of block numbers */ |
1777 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | 1830 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); |
1831 | lastblock = udf_variable_to_fixed(sbi->s_last_block); | ||
1778 | /* Firstly, we try to not convert number of the last block */ | 1832 | /* Firstly, we try to not convert number of the last block */ |
1779 | lastblock = udf_scan_anchors(sb, | 1833 | ret = udf_scan_anchors(sb, &lastblock, fileset); |
1780 | udf_variable_to_fixed(sbi->s_last_block), | 1834 | if (ret != -EAGAIN) |
1781 | fileset); | ||
1782 | if (lastblock) | ||
1783 | goto out; | 1835 | goto out; |
1784 | 1836 | ||
1837 | lastblock = sbi->s_last_block; | ||
1785 | /* Secondly, we try with converted number of the last block */ | 1838 | /* Secondly, we try with converted number of the last block */ |
1786 | lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset); | 1839 | ret = udf_scan_anchors(sb, &lastblock, fileset); |
1787 | if (!lastblock) { | 1840 | if (ret < 0) { |
1788 | /* VARCONV didn't help. Clear it. */ | 1841 | /* VARCONV didn't help. Clear it. */ |
1789 | UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); | 1842 | UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); |
1790 | return 0; | ||
1791 | } | 1843 | } |
1792 | out: | 1844 | out: |
1793 | sbi->s_last_block = lastblock; | 1845 | if (ret == 0) |
1794 | return 1; | 1846 | sbi->s_last_block = lastblock; |
1847 | return ret; | ||
1795 | } | 1848 | } |
1796 | 1849 | ||
1797 | /* | 1850 | /* |
1798 | * Check Volume Structure Descriptor, find Anchor block and load Volume | 1851 | * Check Volume Structure Descriptor, find Anchor block and load Volume |
1799 | * Descriptor Sequence | 1852 | * Descriptor Sequence. |
1853 | * | ||
1854 | * Returns < 0 on error, 0 on success. -EAGAIN is special meaning anchor | ||
1855 | * block was not found. | ||
1800 | */ | 1856 | */ |
1801 | static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt, | 1857 | static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt, |
1802 | int silent, struct kernel_lb_addr *fileset) | 1858 | int silent, struct kernel_lb_addr *fileset) |
1803 | { | 1859 | { |
1804 | struct udf_sb_info *sbi = UDF_SB(sb); | 1860 | struct udf_sb_info *sbi = UDF_SB(sb); |
1805 | loff_t nsr_off; | 1861 | loff_t nsr_off; |
1862 | int ret; | ||
1806 | 1863 | ||
1807 | if (!sb_set_blocksize(sb, uopt->blocksize)) { | 1864 | if (!sb_set_blocksize(sb, uopt->blocksize)) { |
1808 | if (!silent) | 1865 | if (!silent) |
1809 | udf_warn(sb, "Bad block size\n"); | 1866 | udf_warn(sb, "Bad block size\n"); |
1810 | return 0; | 1867 | return -EINVAL; |
1811 | } | 1868 | } |
1812 | sbi->s_last_block = uopt->lastblock; | 1869 | sbi->s_last_block = uopt->lastblock; |
1813 | if (!uopt->novrs) { | 1870 | if (!uopt->novrs) { |
@@ -1828,12 +1885,13 @@ static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt, | |||
1828 | 1885 | ||
1829 | /* Look for anchor block and load Volume Descriptor Sequence */ | 1886 | /* Look for anchor block and load Volume Descriptor Sequence */ |
1830 | sbi->s_anchor = uopt->anchor; | 1887 | sbi->s_anchor = uopt->anchor; |
1831 | if (!udf_find_anchor(sb, fileset)) { | 1888 | ret = udf_find_anchor(sb, fileset); |
1832 | if (!silent) | 1889 | if (ret < 0) { |
1890 | if (!silent && ret == -EAGAIN) | ||
1833 | udf_warn(sb, "No anchor found\n"); | 1891 | udf_warn(sb, "No anchor found\n"); |
1834 | return 0; | 1892 | return ret; |
1835 | } | 1893 | } |
1836 | return 1; | 1894 | return 0; |
1837 | } | 1895 | } |
1838 | 1896 | ||
1839 | static void udf_open_lvid(struct super_block *sb) | 1897 | static void udf_open_lvid(struct super_block *sb) |
@@ -1939,7 +1997,7 @@ u64 lvid_get_unique_id(struct super_block *sb) | |||
1939 | 1997 | ||
1940 | static int udf_fill_super(struct super_block *sb, void *options, int silent) | 1998 | static int udf_fill_super(struct super_block *sb, void *options, int silent) |
1941 | { | 1999 | { |
1942 | int ret; | 2000 | int ret = -EINVAL; |
1943 | struct inode *inode = NULL; | 2001 | struct inode *inode = NULL; |
1944 | struct udf_options uopt; | 2002 | struct udf_options uopt; |
1945 | struct kernel_lb_addr rootdir, fileset; | 2003 | struct kernel_lb_addr rootdir, fileset; |
@@ -2011,7 +2069,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2011 | } else { | 2069 | } else { |
2012 | uopt.blocksize = bdev_logical_block_size(sb->s_bdev); | 2070 | uopt.blocksize = bdev_logical_block_size(sb->s_bdev); |
2013 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); | 2071 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); |
2014 | if (!ret && uopt.blocksize != UDF_DEFAULT_BLOCKSIZE) { | 2072 | if (ret == -EAGAIN && uopt.blocksize != UDF_DEFAULT_BLOCKSIZE) { |
2015 | if (!silent) | 2073 | if (!silent) |
2016 | pr_notice("Rescanning with blocksize %d\n", | 2074 | pr_notice("Rescanning with blocksize %d\n", |
2017 | UDF_DEFAULT_BLOCKSIZE); | 2075 | UDF_DEFAULT_BLOCKSIZE); |
@@ -2021,8 +2079,11 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2021 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); | 2079 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); |
2022 | } | 2080 | } |
2023 | } | 2081 | } |
2024 | if (!ret) { | 2082 | if (ret < 0) { |
2025 | udf_warn(sb, "No partition found (1)\n"); | 2083 | if (ret == -EAGAIN) { |
2084 | udf_warn(sb, "No partition found (1)\n"); | ||
2085 | ret = -EINVAL; | ||
2086 | } | ||
2026 | goto error_out; | 2087 | goto error_out; |
2027 | } | 2088 | } |
2028 | 2089 | ||
@@ -2040,6 +2101,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2040 | udf_err(sb, "minUDFReadRev=%x (max is %x)\n", | 2101 | udf_err(sb, "minUDFReadRev=%x (max is %x)\n", |
2041 | le16_to_cpu(lvidiu->minUDFReadRev), | 2102 | le16_to_cpu(lvidiu->minUDFReadRev), |
2042 | UDF_MAX_READ_VERSION); | 2103 | UDF_MAX_READ_VERSION); |
2104 | ret = -EINVAL; | ||
2043 | goto error_out; | 2105 | goto error_out; |
2044 | } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION) | 2106 | } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION) |
2045 | sb->s_flags |= MS_RDONLY; | 2107 | sb->s_flags |= MS_RDONLY; |
@@ -2054,6 +2116,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2054 | 2116 | ||
2055 | if (!sbi->s_partitions) { | 2117 | if (!sbi->s_partitions) { |
2056 | udf_warn(sb, "No partition found (2)\n"); | 2118 | udf_warn(sb, "No partition found (2)\n"); |
2119 | ret = -EINVAL; | ||
2057 | goto error_out; | 2120 | goto error_out; |
2058 | } | 2121 | } |
2059 | 2122 | ||
@@ -2065,6 +2128,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2065 | 2128 | ||
2066 | if (udf_find_fileset(sb, &fileset, &rootdir)) { | 2129 | if (udf_find_fileset(sb, &fileset, &rootdir)) { |
2067 | udf_warn(sb, "No fileset found\n"); | 2130 | udf_warn(sb, "No fileset found\n"); |
2131 | ret = -EINVAL; | ||
2068 | goto error_out; | 2132 | goto error_out; |
2069 | } | 2133 | } |
2070 | 2134 | ||
@@ -2086,6 +2150,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2086 | if (!inode) { | 2150 | if (!inode) { |
2087 | udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n", | 2151 | udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n", |
2088 | rootdir.logicalBlockNum, rootdir.partitionReferenceNum); | 2152 | rootdir.logicalBlockNum, rootdir.partitionReferenceNum); |
2153 | ret = -EIO; | ||
2089 | goto error_out; | 2154 | goto error_out; |
2090 | } | 2155 | } |
2091 | 2156 | ||
@@ -2093,6 +2158,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2093 | sb->s_root = d_make_root(inode); | 2158 | sb->s_root = d_make_root(inode); |
2094 | if (!sb->s_root) { | 2159 | if (!sb->s_root) { |
2095 | udf_err(sb, "Couldn't allocate root dentry\n"); | 2160 | udf_err(sb, "Couldn't allocate root dentry\n"); |
2161 | ret = -ENOMEM; | ||
2096 | goto error_out; | 2162 | goto error_out; |
2097 | } | 2163 | } |
2098 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 2164 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
@@ -2113,7 +2179,7 @@ error_out: | |||
2113 | kfree(sbi); | 2179 | kfree(sbi); |
2114 | sb->s_fs_info = NULL; | 2180 | sb->s_fs_info = NULL; |
2115 | 2181 | ||
2116 | return -EINVAL; | 2182 | return ret; |
2117 | } | 2183 | } |
2118 | 2184 | ||
2119 | void _udf_err(struct super_block *sb, const char *function, | 2185 | void _udf_err(struct super_block *sb, const char *function, |