diff options
Diffstat (limited to 'fs/udf/inode.c')
-rw-r--r-- | fs/udf/inode.c | 213 |
1 files changed, 110 insertions, 103 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 30ebde490f7f..e7533f785636 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -55,15 +55,15 @@ static int udf_alloc_i_data(struct inode *inode, size_t size); | |||
55 | static struct buffer_head *inode_getblk(struct inode *, sector_t, int *, | 55 | static struct buffer_head *inode_getblk(struct inode *, sector_t, int *, |
56 | sector_t *, int *); | 56 | sector_t *, int *); |
57 | static int8_t udf_insert_aext(struct inode *, struct extent_position, | 57 | static int8_t udf_insert_aext(struct inode *, struct extent_position, |
58 | kernel_lb_addr, uint32_t); | 58 | struct kernel_lb_addr, uint32_t); |
59 | static void udf_split_extents(struct inode *, int *, int, int, | 59 | static void udf_split_extents(struct inode *, int *, int, int, |
60 | kernel_long_ad[EXTENT_MERGE_SIZE], int *); | 60 | struct kernel_long_ad[EXTENT_MERGE_SIZE], int *); |
61 | static void udf_prealloc_extents(struct inode *, int, int, | 61 | static void udf_prealloc_extents(struct inode *, int, int, |
62 | kernel_long_ad[EXTENT_MERGE_SIZE], int *); | 62 | struct kernel_long_ad[EXTENT_MERGE_SIZE], int *); |
63 | static void udf_merge_extents(struct inode *, | 63 | static void udf_merge_extents(struct inode *, |
64 | kernel_long_ad[EXTENT_MERGE_SIZE], int *); | 64 | struct kernel_long_ad[EXTENT_MERGE_SIZE], int *); |
65 | static void udf_update_extents(struct inode *, | 65 | static void udf_update_extents(struct inode *, |
66 | kernel_long_ad[EXTENT_MERGE_SIZE], int, int, | 66 | struct kernel_long_ad[EXTENT_MERGE_SIZE], int, int, |
67 | struct extent_position *); | 67 | struct extent_position *); |
68 | static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int); | 68 | static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int); |
69 | 69 | ||
@@ -200,7 +200,7 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block, | |||
200 | { | 200 | { |
201 | int newblock; | 201 | int newblock; |
202 | struct buffer_head *dbh = NULL; | 202 | struct buffer_head *dbh = NULL; |
203 | kernel_lb_addr eloc; | 203 | struct kernel_lb_addr eloc; |
204 | uint32_t elen; | 204 | uint32_t elen; |
205 | uint8_t alloctype; | 205 | uint8_t alloctype; |
206 | struct extent_position epos; | 206 | struct extent_position epos; |
@@ -281,7 +281,7 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block, | |||
281 | epos.bh = NULL; | 281 | epos.bh = NULL; |
282 | epos.block = iinfo->i_location; | 282 | epos.block = iinfo->i_location; |
283 | epos.offset = udf_file_entry_alloc_offset(inode); | 283 | epos.offset = udf_file_entry_alloc_offset(inode); |
284 | udf_add_aext(inode, &epos, eloc, elen, 0); | 284 | udf_add_aext(inode, &epos, &eloc, elen, 0); |
285 | /* UniqueID stuff */ | 285 | /* UniqueID stuff */ |
286 | 286 | ||
287 | brelse(epos.bh); | 287 | brelse(epos.bh); |
@@ -359,12 +359,12 @@ static struct buffer_head *udf_getblk(struct inode *inode, long block, | |||
359 | 359 | ||
360 | /* Extend the file by 'blocks' blocks, return the number of extents added */ | 360 | /* Extend the file by 'blocks' blocks, return the number of extents added */ |
361 | int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | 361 | int udf_extend_file(struct inode *inode, struct extent_position *last_pos, |
362 | kernel_long_ad *last_ext, sector_t blocks) | 362 | struct kernel_long_ad *last_ext, sector_t blocks) |
363 | { | 363 | { |
364 | sector_t add; | 364 | sector_t add; |
365 | int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); | 365 | int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); |
366 | struct super_block *sb = inode->i_sb; | 366 | struct super_block *sb = inode->i_sb; |
367 | kernel_lb_addr prealloc_loc = {}; | 367 | struct kernel_lb_addr prealloc_loc = {}; |
368 | int prealloc_len = 0; | 368 | int prealloc_len = 0; |
369 | struct udf_inode_info *iinfo; | 369 | struct udf_inode_info *iinfo; |
370 | 370 | ||
@@ -411,11 +411,11 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
411 | } | 411 | } |
412 | 412 | ||
413 | if (fake) { | 413 | if (fake) { |
414 | udf_add_aext(inode, last_pos, last_ext->extLocation, | 414 | udf_add_aext(inode, last_pos, &last_ext->extLocation, |
415 | last_ext->extLength, 1); | 415 | last_ext->extLength, 1); |
416 | count++; | 416 | count++; |
417 | } else | 417 | } else |
418 | udf_write_aext(inode, last_pos, last_ext->extLocation, | 418 | udf_write_aext(inode, last_pos, &last_ext->extLocation, |
419 | last_ext->extLength, 1); | 419 | last_ext->extLength, 1); |
420 | 420 | ||
421 | /* Managed to do everything necessary? */ | 421 | /* Managed to do everything necessary? */ |
@@ -432,7 +432,7 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
432 | /* Create enough extents to cover the whole hole */ | 432 | /* Create enough extents to cover the whole hole */ |
433 | while (blocks > add) { | 433 | while (blocks > add) { |
434 | blocks -= add; | 434 | blocks -= add; |
435 | if (udf_add_aext(inode, last_pos, last_ext->extLocation, | 435 | if (udf_add_aext(inode, last_pos, &last_ext->extLocation, |
436 | last_ext->extLength, 1) == -1) | 436 | last_ext->extLength, 1) == -1) |
437 | return -1; | 437 | return -1; |
438 | count++; | 438 | count++; |
@@ -440,7 +440,7 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
440 | if (blocks) { | 440 | if (blocks) { |
441 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | | 441 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
442 | (blocks << sb->s_blocksize_bits); | 442 | (blocks << sb->s_blocksize_bits); |
443 | if (udf_add_aext(inode, last_pos, last_ext->extLocation, | 443 | if (udf_add_aext(inode, last_pos, &last_ext->extLocation, |
444 | last_ext->extLength, 1) == -1) | 444 | last_ext->extLength, 1) == -1) |
445 | return -1; | 445 | return -1; |
446 | count++; | 446 | count++; |
@@ -449,7 +449,7 @@ int udf_extend_file(struct inode *inode, struct extent_position *last_pos, | |||
449 | out: | 449 | out: |
450 | /* Do we have some preallocated blocks saved? */ | 450 | /* Do we have some preallocated blocks saved? */ |
451 | if (prealloc_len) { | 451 | if (prealloc_len) { |
452 | if (udf_add_aext(inode, last_pos, prealloc_loc, | 452 | if (udf_add_aext(inode, last_pos, &prealloc_loc, |
453 | prealloc_len, 1) == -1) | 453 | prealloc_len, 1) == -1) |
454 | return -1; | 454 | return -1; |
455 | last_ext->extLocation = prealloc_loc; | 455 | last_ext->extLocation = prealloc_loc; |
@@ -459,9 +459,9 @@ out: | |||
459 | 459 | ||
460 | /* last_pos should point to the last written extent... */ | 460 | /* last_pos should point to the last written extent... */ |
461 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 461 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
462 | last_pos->offset -= sizeof(short_ad); | 462 | last_pos->offset -= sizeof(struct short_ad); |
463 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 463 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
464 | last_pos->offset -= sizeof(long_ad); | 464 | last_pos->offset -= sizeof(struct long_ad); |
465 | else | 465 | else |
466 | return -1; | 466 | return -1; |
467 | 467 | ||
@@ -473,11 +473,11 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
473 | { | 473 | { |
474 | static sector_t last_block; | 474 | static sector_t last_block; |
475 | struct buffer_head *result = NULL; | 475 | struct buffer_head *result = NULL; |
476 | kernel_long_ad laarr[EXTENT_MERGE_SIZE]; | 476 | struct kernel_long_ad laarr[EXTENT_MERGE_SIZE]; |
477 | struct extent_position prev_epos, cur_epos, next_epos; | 477 | struct extent_position prev_epos, cur_epos, next_epos; |
478 | int count = 0, startnum = 0, endnum = 0; | 478 | int count = 0, startnum = 0, endnum = 0; |
479 | uint32_t elen = 0, tmpelen; | 479 | uint32_t elen = 0, tmpelen; |
480 | kernel_lb_addr eloc, tmpeloc; | 480 | struct kernel_lb_addr eloc, tmpeloc; |
481 | int c = 1; | 481 | int c = 1; |
482 | loff_t lbcount = 0, b_off = 0; | 482 | loff_t lbcount = 0, b_off = 0; |
483 | uint32_t newblocknum, newblock; | 483 | uint32_t newblocknum, newblock; |
@@ -550,12 +550,12 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
550 | elen = EXT_RECORDED_ALLOCATED | | 550 | elen = EXT_RECORDED_ALLOCATED | |
551 | ((elen + inode->i_sb->s_blocksize - 1) & | 551 | ((elen + inode->i_sb->s_blocksize - 1) & |
552 | ~(inode->i_sb->s_blocksize - 1)); | 552 | ~(inode->i_sb->s_blocksize - 1)); |
553 | etype = udf_write_aext(inode, &cur_epos, eloc, elen, 1); | 553 | etype = udf_write_aext(inode, &cur_epos, &eloc, elen, 1); |
554 | } | 554 | } |
555 | brelse(prev_epos.bh); | 555 | brelse(prev_epos.bh); |
556 | brelse(cur_epos.bh); | 556 | brelse(cur_epos.bh); |
557 | brelse(next_epos.bh); | 557 | brelse(next_epos.bh); |
558 | newblock = udf_get_lb_pblock(inode->i_sb, eloc, offset); | 558 | newblock = udf_get_lb_pblock(inode->i_sb, &eloc, offset); |
559 | *phys = newblock; | 559 | *phys = newblock; |
560 | return NULL; | 560 | return NULL; |
561 | } | 561 | } |
@@ -572,7 +572,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
572 | } else { | 572 | } else { |
573 | /* Create a fake extent when there's not one */ | 573 | /* Create a fake extent when there's not one */ |
574 | memset(&laarr[0].extLocation, 0x00, | 574 | memset(&laarr[0].extLocation, 0x00, |
575 | sizeof(kernel_lb_addr)); | 575 | sizeof(struct kernel_lb_addr)); |
576 | laarr[0].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; | 576 | laarr[0].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED; |
577 | /* Will udf_extend_file() create real extent from | 577 | /* Will udf_extend_file() create real extent from |
578 | a fake one? */ | 578 | a fake one? */ |
@@ -602,7 +602,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
602 | laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | | 602 | laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
603 | inode->i_sb->s_blocksize; | 603 | inode->i_sb->s_blocksize; |
604 | memset(&laarr[c].extLocation, 0x00, | 604 | memset(&laarr[c].extLocation, 0x00, |
605 | sizeof(kernel_lb_addr)); | 605 | sizeof(struct kernel_lb_addr)); |
606 | count++; | 606 | count++; |
607 | endnum++; | 607 | endnum++; |
608 | } | 608 | } |
@@ -699,7 +699,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block, | |||
699 | 699 | ||
700 | static void udf_split_extents(struct inode *inode, int *c, int offset, | 700 | static void udf_split_extents(struct inode *inode, int *c, int offset, |
701 | int newblocknum, | 701 | int newblocknum, |
702 | kernel_long_ad laarr[EXTENT_MERGE_SIZE], | 702 | struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], |
703 | int *endnum) | 703 | int *endnum) |
704 | { | 704 | { |
705 | unsigned long blocksize = inode->i_sb->s_blocksize; | 705 | unsigned long blocksize = inode->i_sb->s_blocksize; |
@@ -726,7 +726,7 @@ static void udf_split_extents(struct inode *inode, int *c, int offset, | |||
726 | if (offset) { | 726 | if (offset) { |
727 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { | 727 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
728 | udf_free_blocks(inode->i_sb, inode, | 728 | udf_free_blocks(inode->i_sb, inode, |
729 | laarr[curr].extLocation, | 729 | &laarr[curr].extLocation, |
730 | 0, offset); | 730 | 0, offset); |
731 | laarr[curr].extLength = | 731 | laarr[curr].extLength = |
732 | EXT_NOT_RECORDED_NOT_ALLOCATED | | 732 | EXT_NOT_RECORDED_NOT_ALLOCATED | |
@@ -763,7 +763,7 @@ static void udf_split_extents(struct inode *inode, int *c, int offset, | |||
763 | } | 763 | } |
764 | 764 | ||
765 | static void udf_prealloc_extents(struct inode *inode, int c, int lastblock, | 765 | static void udf_prealloc_extents(struct inode *inode, int c, int lastblock, |
766 | kernel_long_ad laarr[EXTENT_MERGE_SIZE], | 766 | struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], |
767 | int *endnum) | 767 | int *endnum) |
768 | { | 768 | { |
769 | int start, length = 0, currlength = 0, i; | 769 | int start, length = 0, currlength = 0, i; |
@@ -817,7 +817,7 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock, | |||
817 | inode->i_sb->s_blocksize_bits); | 817 | inode->i_sb->s_blocksize_bits); |
818 | else { | 818 | else { |
819 | memmove(&laarr[c + 2], &laarr[c + 1], | 819 | memmove(&laarr[c + 2], &laarr[c + 1], |
820 | sizeof(long_ad) * (*endnum - (c + 1))); | 820 | sizeof(struct long_ad) * (*endnum - (c + 1))); |
821 | (*endnum)++; | 821 | (*endnum)++; |
822 | laarr[c + 1].extLocation.logicalBlockNum = next; | 822 | laarr[c + 1].extLocation.logicalBlockNum = next; |
823 | laarr[c + 1].extLocation.partitionReferenceNum = | 823 | laarr[c + 1].extLocation.partitionReferenceNum = |
@@ -846,7 +846,7 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock, | |||
846 | if (*endnum > (i + 1)) | 846 | if (*endnum > (i + 1)) |
847 | memmove(&laarr[i], | 847 | memmove(&laarr[i], |
848 | &laarr[i + 1], | 848 | &laarr[i + 1], |
849 | sizeof(long_ad) * | 849 | sizeof(struct long_ad) * |
850 | (*endnum - (i + 1))); | 850 | (*endnum - (i + 1))); |
851 | i--; | 851 | i--; |
852 | (*endnum)--; | 852 | (*endnum)--; |
@@ -859,7 +859,7 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock, | |||
859 | } | 859 | } |
860 | 860 | ||
861 | static void udf_merge_extents(struct inode *inode, | 861 | static void udf_merge_extents(struct inode *inode, |
862 | kernel_long_ad laarr[EXTENT_MERGE_SIZE], | 862 | struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], |
863 | int *endnum) | 863 | int *endnum) |
864 | { | 864 | { |
865 | int i; | 865 | int i; |
@@ -867,8 +867,8 @@ static void udf_merge_extents(struct inode *inode, | |||
867 | unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; | 867 | unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; |
868 | 868 | ||
869 | for (i = 0; i < (*endnum - 1); i++) { | 869 | for (i = 0; i < (*endnum - 1); i++) { |
870 | kernel_long_ad *li /*l[i]*/ = &laarr[i]; | 870 | struct kernel_long_ad *li /*l[i]*/ = &laarr[i]; |
871 | kernel_long_ad *lip1 /*l[i plus 1]*/ = &laarr[i + 1]; | 871 | struct kernel_long_ad *lip1 /*l[i plus 1]*/ = &laarr[i + 1]; |
872 | 872 | ||
873 | if (((li->extLength >> 30) == (lip1->extLength >> 30)) && | 873 | if (((li->extLength >> 30) == (lip1->extLength >> 30)) && |
874 | (((li->extLength >> 30) == | 874 | (((li->extLength >> 30) == |
@@ -902,7 +902,7 @@ static void udf_merge_extents(struct inode *inode, | |||
902 | blocksize - 1) & ~(blocksize - 1)); | 902 | blocksize - 1) & ~(blocksize - 1)); |
903 | if (*endnum > (i + 2)) | 903 | if (*endnum > (i + 2)) |
904 | memmove(&laarr[i + 1], &laarr[i + 2], | 904 | memmove(&laarr[i + 1], &laarr[i + 2], |
905 | sizeof(long_ad) * | 905 | sizeof(struct long_ad) * |
906 | (*endnum - (i + 2))); | 906 | (*endnum - (i + 2))); |
907 | i--; | 907 | i--; |
908 | (*endnum)--; | 908 | (*endnum)--; |
@@ -911,7 +911,7 @@ static void udf_merge_extents(struct inode *inode, | |||
911 | (EXT_NOT_RECORDED_ALLOCATED >> 30)) && | 911 | (EXT_NOT_RECORDED_ALLOCATED >> 30)) && |
912 | ((lip1->extLength >> 30) == | 912 | ((lip1->extLength >> 30) == |
913 | (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))) { | 913 | (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))) { |
914 | udf_free_blocks(inode->i_sb, inode, li->extLocation, 0, | 914 | udf_free_blocks(inode->i_sb, inode, &li->extLocation, 0, |
915 | ((li->extLength & | 915 | ((li->extLength & |
916 | UDF_EXTENT_LENGTH_MASK) + | 916 | UDF_EXTENT_LENGTH_MASK) + |
917 | blocksize - 1) >> blocksize_bits); | 917 | blocksize - 1) >> blocksize_bits); |
@@ -937,7 +937,7 @@ static void udf_merge_extents(struct inode *inode, | |||
937 | blocksize - 1) & ~(blocksize - 1)); | 937 | blocksize - 1) & ~(blocksize - 1)); |
938 | if (*endnum > (i + 2)) | 938 | if (*endnum > (i + 2)) |
939 | memmove(&laarr[i + 1], &laarr[i + 2], | 939 | memmove(&laarr[i + 1], &laarr[i + 2], |
940 | sizeof(long_ad) * | 940 | sizeof(struct long_ad) * |
941 | (*endnum - (i + 2))); | 941 | (*endnum - (i + 2))); |
942 | i--; | 942 | i--; |
943 | (*endnum)--; | 943 | (*endnum)--; |
@@ -945,7 +945,7 @@ static void udf_merge_extents(struct inode *inode, | |||
945 | } else if ((li->extLength >> 30) == | 945 | } else if ((li->extLength >> 30) == |
946 | (EXT_NOT_RECORDED_ALLOCATED >> 30)) { | 946 | (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
947 | udf_free_blocks(inode->i_sb, inode, | 947 | udf_free_blocks(inode->i_sb, inode, |
948 | li->extLocation, 0, | 948 | &li->extLocation, 0, |
949 | ((li->extLength & | 949 | ((li->extLength & |
950 | UDF_EXTENT_LENGTH_MASK) + | 950 | UDF_EXTENT_LENGTH_MASK) + |
951 | blocksize - 1) >> blocksize_bits); | 951 | blocksize - 1) >> blocksize_bits); |
@@ -959,12 +959,12 @@ static void udf_merge_extents(struct inode *inode, | |||
959 | } | 959 | } |
960 | 960 | ||
961 | static void udf_update_extents(struct inode *inode, | 961 | static void udf_update_extents(struct inode *inode, |
962 | kernel_long_ad laarr[EXTENT_MERGE_SIZE], | 962 | struct kernel_long_ad laarr[EXTENT_MERGE_SIZE], |
963 | int startnum, int endnum, | 963 | int startnum, int endnum, |
964 | struct extent_position *epos) | 964 | struct extent_position *epos) |
965 | { | 965 | { |
966 | int start = 0, i; | 966 | int start = 0, i; |
967 | kernel_lb_addr tmploc; | 967 | struct kernel_lb_addr tmploc; |
968 | uint32_t tmplen; | 968 | uint32_t tmplen; |
969 | 969 | ||
970 | if (startnum > endnum) { | 970 | if (startnum > endnum) { |
@@ -983,7 +983,7 @@ static void udf_update_extents(struct inode *inode, | |||
983 | 983 | ||
984 | for (i = start; i < endnum; i++) { | 984 | for (i = start; i < endnum; i++) { |
985 | udf_next_aext(inode, epos, &tmploc, &tmplen, 0); | 985 | udf_next_aext(inode, epos, &tmploc, &tmplen, 0); |
986 | udf_write_aext(inode, epos, laarr[i].extLocation, | 986 | udf_write_aext(inode, epos, &laarr[i].extLocation, |
987 | laarr[i].extLength, 1); | 987 | laarr[i].extLength, 1); |
988 | } | 988 | } |
989 | } | 989 | } |
@@ -1076,7 +1076,7 @@ static void __udf_read_inode(struct inode *inode) | |||
1076 | * i_nlink = 1 | 1076 | * i_nlink = 1 |
1077 | * i_op = NULL; | 1077 | * i_op = NULL; |
1078 | */ | 1078 | */ |
1079 | bh = udf_read_ptagged(inode->i_sb, iinfo->i_location, 0, &ident); | 1079 | bh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 0, &ident); |
1080 | if (!bh) { | 1080 | if (!bh) { |
1081 | printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n", | 1081 | printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n", |
1082 | inode->i_ino); | 1082 | inode->i_ino); |
@@ -1098,24 +1098,24 @@ static void __udf_read_inode(struct inode *inode) | |||
1098 | if (fe->icbTag.strategyType == cpu_to_le16(4096)) { | 1098 | if (fe->icbTag.strategyType == cpu_to_le16(4096)) { |
1099 | struct buffer_head *ibh; | 1099 | struct buffer_head *ibh; |
1100 | 1100 | ||
1101 | ibh = udf_read_ptagged(inode->i_sb, iinfo->i_location, 1, | 1101 | ibh = udf_read_ptagged(inode->i_sb, &iinfo->i_location, 1, |
1102 | &ident); | 1102 | &ident); |
1103 | if (ident == TAG_IDENT_IE && ibh) { | 1103 | if (ident == TAG_IDENT_IE && ibh) { |
1104 | struct buffer_head *nbh = NULL; | 1104 | struct buffer_head *nbh = NULL; |
1105 | kernel_lb_addr loc; | 1105 | struct kernel_lb_addr loc; |
1106 | struct indirectEntry *ie; | 1106 | struct indirectEntry *ie; |
1107 | 1107 | ||
1108 | ie = (struct indirectEntry *)ibh->b_data; | 1108 | ie = (struct indirectEntry *)ibh->b_data; |
1109 | loc = lelb_to_cpu(ie->indirectICB.extLocation); | 1109 | loc = lelb_to_cpu(ie->indirectICB.extLocation); |
1110 | 1110 | ||
1111 | if (ie->indirectICB.extLength && | 1111 | if (ie->indirectICB.extLength && |
1112 | (nbh = udf_read_ptagged(inode->i_sb, loc, 0, | 1112 | (nbh = udf_read_ptagged(inode->i_sb, &loc, 0, |
1113 | &ident))) { | 1113 | &ident))) { |
1114 | if (ident == TAG_IDENT_FE || | 1114 | if (ident == TAG_IDENT_FE || |
1115 | ident == TAG_IDENT_EFE) { | 1115 | ident == TAG_IDENT_EFE) { |
1116 | memcpy(&iinfo->i_location, | 1116 | memcpy(&iinfo->i_location, |
1117 | &loc, | 1117 | &loc, |
1118 | sizeof(kernel_lb_addr)); | 1118 | sizeof(struct kernel_lb_addr)); |
1119 | brelse(bh); | 1119 | brelse(bh); |
1120 | brelse(ibh); | 1120 | brelse(ibh); |
1121 | brelse(nbh); | 1121 | brelse(nbh); |
@@ -1222,8 +1222,15 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
1222 | inode->i_size = le64_to_cpu(fe->informationLength); | 1222 | inode->i_size = le64_to_cpu(fe->informationLength); |
1223 | iinfo->i_lenExtents = inode->i_size; | 1223 | iinfo->i_lenExtents = inode->i_size; |
1224 | 1224 | ||
1225 | inode->i_mode = udf_convert_permissions(fe); | 1225 | if (fe->icbTag.fileType != ICBTAG_FILE_TYPE_DIRECTORY && |
1226 | inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask; | 1226 | sbi->s_fmode != UDF_INVALID_MODE) |
1227 | inode->i_mode = sbi->s_fmode; | ||
1228 | else if (fe->icbTag.fileType == ICBTAG_FILE_TYPE_DIRECTORY && | ||
1229 | sbi->s_dmode != UDF_INVALID_MODE) | ||
1230 | inode->i_mode = sbi->s_dmode; | ||
1231 | else | ||
1232 | inode->i_mode = udf_convert_permissions(fe); | ||
1233 | inode->i_mode &= ~sbi->s_umask; | ||
1227 | 1234 | ||
1228 | if (iinfo->i_efe == 0) { | 1235 | if (iinfo->i_efe == 0) { |
1229 | inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << | 1236 | inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << |
@@ -1396,7 +1403,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
1396 | 1403 | ||
1397 | bh = udf_tread(inode->i_sb, | 1404 | bh = udf_tread(inode->i_sb, |
1398 | udf_get_lb_pblock(inode->i_sb, | 1405 | udf_get_lb_pblock(inode->i_sb, |
1399 | iinfo->i_location, 0)); | 1406 | &iinfo->i_location, 0)); |
1400 | if (!bh) { | 1407 | if (!bh) { |
1401 | udf_debug("bread failure\n"); | 1408 | udf_debug("bread failure\n"); |
1402 | return -EIO; | 1409 | return -EIO; |
@@ -1416,13 +1423,13 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
1416 | iinfo->i_ext.i_data, inode->i_sb->s_blocksize - | 1423 | iinfo->i_ext.i_data, inode->i_sb->s_blocksize - |
1417 | sizeof(struct unallocSpaceEntry)); | 1424 | sizeof(struct unallocSpaceEntry)); |
1418 | crclen = sizeof(struct unallocSpaceEntry) + | 1425 | crclen = sizeof(struct unallocSpaceEntry) + |
1419 | iinfo->i_lenAlloc - sizeof(tag); | 1426 | iinfo->i_lenAlloc - sizeof(struct tag); |
1420 | use->descTag.tagLocation = cpu_to_le32( | 1427 | use->descTag.tagLocation = cpu_to_le32( |
1421 | iinfo->i_location. | 1428 | iinfo->i_location. |
1422 | logicalBlockNum); | 1429 | logicalBlockNum); |
1423 | use->descTag.descCRCLength = cpu_to_le16(crclen); | 1430 | use->descTag.descCRCLength = cpu_to_le16(crclen); |
1424 | use->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)use + | 1431 | use->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)use + |
1425 | sizeof(tag), | 1432 | sizeof(struct tag), |
1426 | crclen)); | 1433 | crclen)); |
1427 | use->descTag.tagChecksum = udf_tag_checksum(&use->descTag); | 1434 | use->descTag.tagChecksum = udf_tag_checksum(&use->descTag); |
1428 | 1435 | ||
@@ -1459,23 +1466,23 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
1459 | fe->informationLength = cpu_to_le64(inode->i_size); | 1466 | fe->informationLength = cpu_to_le64(inode->i_size); |
1460 | 1467 | ||
1461 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { | 1468 | if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { |
1462 | regid *eid; | 1469 | struct regid *eid; |
1463 | struct deviceSpec *dsea = | 1470 | struct deviceSpec *dsea = |
1464 | (struct deviceSpec *)udf_get_extendedattr(inode, 12, 1); | 1471 | (struct deviceSpec *)udf_get_extendedattr(inode, 12, 1); |
1465 | if (!dsea) { | 1472 | if (!dsea) { |
1466 | dsea = (struct deviceSpec *) | 1473 | dsea = (struct deviceSpec *) |
1467 | udf_add_extendedattr(inode, | 1474 | udf_add_extendedattr(inode, |
1468 | sizeof(struct deviceSpec) + | 1475 | sizeof(struct deviceSpec) + |
1469 | sizeof(regid), 12, 0x3); | 1476 | sizeof(struct regid), 12, 0x3); |
1470 | dsea->attrType = cpu_to_le32(12); | 1477 | dsea->attrType = cpu_to_le32(12); |
1471 | dsea->attrSubtype = 1; | 1478 | dsea->attrSubtype = 1; |
1472 | dsea->attrLength = cpu_to_le32( | 1479 | dsea->attrLength = cpu_to_le32( |
1473 | sizeof(struct deviceSpec) + | 1480 | sizeof(struct deviceSpec) + |
1474 | sizeof(regid)); | 1481 | sizeof(struct regid)); |
1475 | dsea->impUseLength = cpu_to_le32(sizeof(regid)); | 1482 | dsea->impUseLength = cpu_to_le32(sizeof(struct regid)); |
1476 | } | 1483 | } |
1477 | eid = (regid *)dsea->impUse; | 1484 | eid = (struct regid *)dsea->impUse; |
1478 | memset(eid, 0, sizeof(regid)); | 1485 | memset(eid, 0, sizeof(struct regid)); |
1479 | strcpy(eid->ident, UDF_ID_DEVELOPER); | 1486 | strcpy(eid->ident, UDF_ID_DEVELOPER); |
1480 | eid->identSuffix[0] = UDF_OS_CLASS_UNIX; | 1487 | eid->identSuffix[0] = UDF_OS_CLASS_UNIX; |
1481 | eid->identSuffix[1] = UDF_OS_ID_LINUX; | 1488 | eid->identSuffix[1] = UDF_OS_ID_LINUX; |
@@ -1494,7 +1501,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
1494 | udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime); | 1501 | udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime); |
1495 | udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime); | 1502 | udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime); |
1496 | udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime); | 1503 | udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime); |
1497 | memset(&(fe->impIdent), 0, sizeof(regid)); | 1504 | memset(&(fe->impIdent), 0, sizeof(struct regid)); |
1498 | strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER); | 1505 | strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER); |
1499 | fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | 1506 | fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; |
1500 | fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1507 | fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; |
@@ -1533,7 +1540,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
1533 | udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime); | 1540 | udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime); |
1534 | udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime); | 1541 | udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime); |
1535 | 1542 | ||
1536 | memset(&(efe->impIdent), 0, sizeof(regid)); | 1543 | memset(&(efe->impIdent), 0, sizeof(struct regid)); |
1537 | strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER); | 1544 | strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER); |
1538 | efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | 1545 | efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; |
1539 | efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1546 | efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; |
@@ -1584,9 +1591,9 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
1584 | fe->descTag.tagLocation = cpu_to_le32( | 1591 | fe->descTag.tagLocation = cpu_to_le32( |
1585 | iinfo->i_location.logicalBlockNum); | 1592 | iinfo->i_location.logicalBlockNum); |
1586 | crclen += iinfo->i_lenEAttr + iinfo->i_lenAlloc - | 1593 | crclen += iinfo->i_lenEAttr + iinfo->i_lenAlloc - |
1587 | sizeof(tag); | 1594 | sizeof(struct tag); |
1588 | fe->descTag.descCRCLength = cpu_to_le16(crclen); | 1595 | fe->descTag.descCRCLength = cpu_to_le16(crclen); |
1589 | fe->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)fe + sizeof(tag), | 1596 | fe->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)fe + sizeof(struct tag), |
1590 | crclen)); | 1597 | crclen)); |
1591 | fe->descTag.tagChecksum = udf_tag_checksum(&fe->descTag); | 1598 | fe->descTag.tagChecksum = udf_tag_checksum(&fe->descTag); |
1592 | 1599 | ||
@@ -1606,7 +1613,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
1606 | return err; | 1613 | return err; |
1607 | } | 1614 | } |
1608 | 1615 | ||
1609 | struct inode *udf_iget(struct super_block *sb, kernel_lb_addr ino) | 1616 | struct inode *udf_iget(struct super_block *sb, struct kernel_lb_addr *ino) |
1610 | { | 1617 | { |
1611 | unsigned long block = udf_get_lb_pblock(sb, ino, 0); | 1618 | unsigned long block = udf_get_lb_pblock(sb, ino, 0); |
1612 | struct inode *inode = iget_locked(sb, block); | 1619 | struct inode *inode = iget_locked(sb, block); |
@@ -1615,7 +1622,7 @@ struct inode *udf_iget(struct super_block *sb, kernel_lb_addr ino) | |||
1615 | return NULL; | 1622 | return NULL; |
1616 | 1623 | ||
1617 | if (inode->i_state & I_NEW) { | 1624 | if (inode->i_state & I_NEW) { |
1618 | memcpy(&UDF_I(inode)->i_location, &ino, sizeof(kernel_lb_addr)); | 1625 | memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr)); |
1619 | __udf_read_inode(inode); | 1626 | __udf_read_inode(inode); |
1620 | unlock_new_inode(inode); | 1627 | unlock_new_inode(inode); |
1621 | } | 1628 | } |
@@ -1623,10 +1630,10 @@ struct inode *udf_iget(struct super_block *sb, kernel_lb_addr ino) | |||
1623 | if (is_bad_inode(inode)) | 1630 | if (is_bad_inode(inode)) |
1624 | goto out_iput; | 1631 | goto out_iput; |
1625 | 1632 | ||
1626 | if (ino.logicalBlockNum >= UDF_SB(sb)-> | 1633 | if (ino->logicalBlockNum >= UDF_SB(sb)-> |
1627 | s_partmaps[ino.partitionReferenceNum].s_partition_len) { | 1634 | s_partmaps[ino->partitionReferenceNum].s_partition_len) { |
1628 | udf_debug("block=%d, partition=%d out of range\n", | 1635 | udf_debug("block=%d, partition=%d out of range\n", |
1629 | ino.logicalBlockNum, ino.partitionReferenceNum); | 1636 | ino->logicalBlockNum, ino->partitionReferenceNum); |
1630 | make_bad_inode(inode); | 1637 | make_bad_inode(inode); |
1631 | goto out_iput; | 1638 | goto out_iput; |
1632 | } | 1639 | } |
@@ -1639,11 +1646,11 @@ struct inode *udf_iget(struct super_block *sb, kernel_lb_addr ino) | |||
1639 | } | 1646 | } |
1640 | 1647 | ||
1641 | int8_t udf_add_aext(struct inode *inode, struct extent_position *epos, | 1648 | int8_t udf_add_aext(struct inode *inode, struct extent_position *epos, |
1642 | kernel_lb_addr eloc, uint32_t elen, int inc) | 1649 | struct kernel_lb_addr *eloc, uint32_t elen, int inc) |
1643 | { | 1650 | { |
1644 | int adsize; | 1651 | int adsize; |
1645 | short_ad *sad = NULL; | 1652 | struct short_ad *sad = NULL; |
1646 | long_ad *lad = NULL; | 1653 | struct long_ad *lad = NULL; |
1647 | struct allocExtDesc *aed; | 1654 | struct allocExtDesc *aed; |
1648 | int8_t etype; | 1655 | int8_t etype; |
1649 | uint8_t *ptr; | 1656 | uint8_t *ptr; |
@@ -1657,9 +1664,9 @@ int8_t udf_add_aext(struct inode *inode, struct extent_position *epos, | |||
1657 | ptr = epos->bh->b_data + epos->offset; | 1664 | ptr = epos->bh->b_data + epos->offset; |
1658 | 1665 | ||
1659 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 1666 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
1660 | adsize = sizeof(short_ad); | 1667 | adsize = sizeof(struct short_ad); |
1661 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 1668 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
1662 | adsize = sizeof(long_ad); | 1669 | adsize = sizeof(struct long_ad); |
1663 | else | 1670 | else |
1664 | return -1; | 1671 | return -1; |
1665 | 1672 | ||
@@ -1667,7 +1674,7 @@ int8_t udf_add_aext(struct inode *inode, struct extent_position *epos, | |||
1667 | char *sptr, *dptr; | 1674 | char *sptr, *dptr; |
1668 | struct buffer_head *nbh; | 1675 | struct buffer_head *nbh; |
1669 | int err, loffset; | 1676 | int err, loffset; |
1670 | kernel_lb_addr obloc = epos->block; | 1677 | struct kernel_lb_addr obloc = epos->block; |
1671 | 1678 | ||
1672 | epos->block.logicalBlockNum = udf_new_block(inode->i_sb, NULL, | 1679 | epos->block.logicalBlockNum = udf_new_block(inode->i_sb, NULL, |
1673 | obloc.partitionReferenceNum, | 1680 | obloc.partitionReferenceNum, |
@@ -1675,7 +1682,7 @@ int8_t udf_add_aext(struct inode *inode, struct extent_position *epos, | |||
1675 | if (!epos->block.logicalBlockNum) | 1682 | if (!epos->block.logicalBlockNum) |
1676 | return -1; | 1683 | return -1; |
1677 | nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb, | 1684 | nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb, |
1678 | epos->block, | 1685 | &epos->block, |
1679 | 0)); | 1686 | 0)); |
1680 | if (!nbh) | 1687 | if (!nbh) |
1681 | return -1; | 1688 | return -1; |
@@ -1712,20 +1719,20 @@ int8_t udf_add_aext(struct inode *inode, struct extent_position *epos, | |||
1712 | } | 1719 | } |
1713 | if (UDF_SB(inode->i_sb)->s_udfrev >= 0x0200) | 1720 | if (UDF_SB(inode->i_sb)->s_udfrev >= 0x0200) |
1714 | udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1, | 1721 | udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1, |
1715 | epos->block.logicalBlockNum, sizeof(tag)); | 1722 | epos->block.logicalBlockNum, sizeof(struct tag)); |
1716 | else | 1723 | else |
1717 | udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1, | 1724 | udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1, |
1718 | epos->block.logicalBlockNum, sizeof(tag)); | 1725 | epos->block.logicalBlockNum, sizeof(struct tag)); |
1719 | switch (iinfo->i_alloc_type) { | 1726 | switch (iinfo->i_alloc_type) { |
1720 | case ICBTAG_FLAG_AD_SHORT: | 1727 | case ICBTAG_FLAG_AD_SHORT: |
1721 | sad = (short_ad *)sptr; | 1728 | sad = (struct short_ad *)sptr; |
1722 | sad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | | 1729 | sad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | |
1723 | inode->i_sb->s_blocksize); | 1730 | inode->i_sb->s_blocksize); |
1724 | sad->extPosition = | 1731 | sad->extPosition = |
1725 | cpu_to_le32(epos->block.logicalBlockNum); | 1732 | cpu_to_le32(epos->block.logicalBlockNum); |
1726 | break; | 1733 | break; |
1727 | case ICBTAG_FLAG_AD_LONG: | 1734 | case ICBTAG_FLAG_AD_LONG: |
1728 | lad = (long_ad *)sptr; | 1735 | lad = (struct long_ad *)sptr; |
1729 | lad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | | 1736 | lad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS | |
1730 | inode->i_sb->s_blocksize); | 1737 | inode->i_sb->s_blocksize); |
1731 | lad->extLocation = cpu_to_lelb(epos->block); | 1738 | lad->extLocation = cpu_to_lelb(epos->block); |
@@ -1769,12 +1776,12 @@ int8_t udf_add_aext(struct inode *inode, struct extent_position *epos, | |||
1769 | } | 1776 | } |
1770 | 1777 | ||
1771 | int8_t udf_write_aext(struct inode *inode, struct extent_position *epos, | 1778 | int8_t udf_write_aext(struct inode *inode, struct extent_position *epos, |
1772 | kernel_lb_addr eloc, uint32_t elen, int inc) | 1779 | struct kernel_lb_addr *eloc, uint32_t elen, int inc) |
1773 | { | 1780 | { |
1774 | int adsize; | 1781 | int adsize; |
1775 | uint8_t *ptr; | 1782 | uint8_t *ptr; |
1776 | short_ad *sad; | 1783 | struct short_ad *sad; |
1777 | long_ad *lad; | 1784 | struct long_ad *lad; |
1778 | struct udf_inode_info *iinfo = UDF_I(inode); | 1785 | struct udf_inode_info *iinfo = UDF_I(inode); |
1779 | 1786 | ||
1780 | if (!epos->bh) | 1787 | if (!epos->bh) |
@@ -1786,17 +1793,17 @@ int8_t udf_write_aext(struct inode *inode, struct extent_position *epos, | |||
1786 | 1793 | ||
1787 | switch (iinfo->i_alloc_type) { | 1794 | switch (iinfo->i_alloc_type) { |
1788 | case ICBTAG_FLAG_AD_SHORT: | 1795 | case ICBTAG_FLAG_AD_SHORT: |
1789 | sad = (short_ad *)ptr; | 1796 | sad = (struct short_ad *)ptr; |
1790 | sad->extLength = cpu_to_le32(elen); | 1797 | sad->extLength = cpu_to_le32(elen); |
1791 | sad->extPosition = cpu_to_le32(eloc.logicalBlockNum); | 1798 | sad->extPosition = cpu_to_le32(eloc->logicalBlockNum); |
1792 | adsize = sizeof(short_ad); | 1799 | adsize = sizeof(struct short_ad); |
1793 | break; | 1800 | break; |
1794 | case ICBTAG_FLAG_AD_LONG: | 1801 | case ICBTAG_FLAG_AD_LONG: |
1795 | lad = (long_ad *)ptr; | 1802 | lad = (struct long_ad *)ptr; |
1796 | lad->extLength = cpu_to_le32(elen); | 1803 | lad->extLength = cpu_to_le32(elen); |
1797 | lad->extLocation = cpu_to_lelb(eloc); | 1804 | lad->extLocation = cpu_to_lelb(*eloc); |
1798 | memset(lad->impUse, 0x00, sizeof(lad->impUse)); | 1805 | memset(lad->impUse, 0x00, sizeof(lad->impUse)); |
1799 | adsize = sizeof(long_ad); | 1806 | adsize = sizeof(struct long_ad); |
1800 | break; | 1807 | break; |
1801 | default: | 1808 | default: |
1802 | return -1; | 1809 | return -1; |
@@ -1823,7 +1830,7 @@ int8_t udf_write_aext(struct inode *inode, struct extent_position *epos, | |||
1823 | } | 1830 | } |
1824 | 1831 | ||
1825 | int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, | 1832 | int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, |
1826 | kernel_lb_addr *eloc, uint32_t *elen, int inc) | 1833 | struct kernel_lb_addr *eloc, uint32_t *elen, int inc) |
1827 | { | 1834 | { |
1828 | int8_t etype; | 1835 | int8_t etype; |
1829 | 1836 | ||
@@ -1833,7 +1840,7 @@ int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, | |||
1833 | epos->block = *eloc; | 1840 | epos->block = *eloc; |
1834 | epos->offset = sizeof(struct allocExtDesc); | 1841 | epos->offset = sizeof(struct allocExtDesc); |
1835 | brelse(epos->bh); | 1842 | brelse(epos->bh); |
1836 | block = udf_get_lb_pblock(inode->i_sb, epos->block, 0); | 1843 | block = udf_get_lb_pblock(inode->i_sb, &epos->block, 0); |
1837 | epos->bh = udf_tread(inode->i_sb, block); | 1844 | epos->bh = udf_tread(inode->i_sb, block); |
1838 | if (!epos->bh) { | 1845 | if (!epos->bh) { |
1839 | udf_debug("reading block %d failed!\n", block); | 1846 | udf_debug("reading block %d failed!\n", block); |
@@ -1845,13 +1852,13 @@ int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, | |||
1845 | } | 1852 | } |
1846 | 1853 | ||
1847 | int8_t udf_current_aext(struct inode *inode, struct extent_position *epos, | 1854 | int8_t udf_current_aext(struct inode *inode, struct extent_position *epos, |
1848 | kernel_lb_addr *eloc, uint32_t *elen, int inc) | 1855 | struct kernel_lb_addr *eloc, uint32_t *elen, int inc) |
1849 | { | 1856 | { |
1850 | int alen; | 1857 | int alen; |
1851 | int8_t etype; | 1858 | int8_t etype; |
1852 | uint8_t *ptr; | 1859 | uint8_t *ptr; |
1853 | short_ad *sad; | 1860 | struct short_ad *sad; |
1854 | long_ad *lad; | 1861 | struct long_ad *lad; |
1855 | struct udf_inode_info *iinfo = UDF_I(inode); | 1862 | struct udf_inode_info *iinfo = UDF_I(inode); |
1856 | 1863 | ||
1857 | if (!epos->bh) { | 1864 | if (!epos->bh) { |
@@ -1900,9 +1907,9 @@ int8_t udf_current_aext(struct inode *inode, struct extent_position *epos, | |||
1900 | } | 1907 | } |
1901 | 1908 | ||
1902 | static int8_t udf_insert_aext(struct inode *inode, struct extent_position epos, | 1909 | static int8_t udf_insert_aext(struct inode *inode, struct extent_position epos, |
1903 | kernel_lb_addr neloc, uint32_t nelen) | 1910 | struct kernel_lb_addr neloc, uint32_t nelen) |
1904 | { | 1911 | { |
1905 | kernel_lb_addr oeloc; | 1912 | struct kernel_lb_addr oeloc; |
1906 | uint32_t oelen; | 1913 | uint32_t oelen; |
1907 | int8_t etype; | 1914 | int8_t etype; |
1908 | 1915 | ||
@@ -1910,18 +1917,18 @@ static int8_t udf_insert_aext(struct inode *inode, struct extent_position epos, | |||
1910 | get_bh(epos.bh); | 1917 | get_bh(epos.bh); |
1911 | 1918 | ||
1912 | while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1) { | 1919 | while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1) { |
1913 | udf_write_aext(inode, &epos, neloc, nelen, 1); | 1920 | udf_write_aext(inode, &epos, &neloc, nelen, 1); |
1914 | neloc = oeloc; | 1921 | neloc = oeloc; |
1915 | nelen = (etype << 30) | oelen; | 1922 | nelen = (etype << 30) | oelen; |
1916 | } | 1923 | } |
1917 | udf_add_aext(inode, &epos, neloc, nelen, 1); | 1924 | udf_add_aext(inode, &epos, &neloc, nelen, 1); |
1918 | brelse(epos.bh); | 1925 | brelse(epos.bh); |
1919 | 1926 | ||
1920 | return (nelen >> 30); | 1927 | return (nelen >> 30); |
1921 | } | 1928 | } |
1922 | 1929 | ||
1923 | int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, | 1930 | int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, |
1924 | kernel_lb_addr eloc, uint32_t elen) | 1931 | struct kernel_lb_addr eloc, uint32_t elen) |
1925 | { | 1932 | { |
1926 | struct extent_position oepos; | 1933 | struct extent_position oepos; |
1927 | int adsize; | 1934 | int adsize; |
@@ -1936,9 +1943,9 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, | |||
1936 | 1943 | ||
1937 | iinfo = UDF_I(inode); | 1944 | iinfo = UDF_I(inode); |
1938 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 1945 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
1939 | adsize = sizeof(short_ad); | 1946 | adsize = sizeof(struct short_ad); |
1940 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 1947 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
1941 | adsize = sizeof(long_ad); | 1948 | adsize = sizeof(struct long_ad); |
1942 | else | 1949 | else |
1943 | adsize = 0; | 1950 | adsize = 0; |
1944 | 1951 | ||
@@ -1947,7 +1954,7 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, | |||
1947 | return -1; | 1954 | return -1; |
1948 | 1955 | ||
1949 | while ((etype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) { | 1956 | while ((etype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) { |
1950 | udf_write_aext(inode, &oepos, eloc, (etype << 30) | elen, 1); | 1957 | udf_write_aext(inode, &oepos, &eloc, (etype << 30) | elen, 1); |
1951 | if (oepos.bh != epos.bh) { | 1958 | if (oepos.bh != epos.bh) { |
1952 | oepos.block = epos.block; | 1959 | oepos.block = epos.block; |
1953 | brelse(oepos.bh); | 1960 | brelse(oepos.bh); |
@@ -1956,13 +1963,13 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, | |||
1956 | oepos.offset = epos.offset - adsize; | 1963 | oepos.offset = epos.offset - adsize; |
1957 | } | 1964 | } |
1958 | } | 1965 | } |
1959 | memset(&eloc, 0x00, sizeof(kernel_lb_addr)); | 1966 | memset(&eloc, 0x00, sizeof(struct kernel_lb_addr)); |
1960 | elen = 0; | 1967 | elen = 0; |
1961 | 1968 | ||
1962 | if (epos.bh != oepos.bh) { | 1969 | if (epos.bh != oepos.bh) { |
1963 | udf_free_blocks(inode->i_sb, inode, epos.block, 0, 1); | 1970 | udf_free_blocks(inode->i_sb, inode, &epos.block, 0, 1); |
1964 | udf_write_aext(inode, &oepos, eloc, elen, 1); | 1971 | udf_write_aext(inode, &oepos, &eloc, elen, 1); |
1965 | udf_write_aext(inode, &oepos, eloc, elen, 1); | 1972 | udf_write_aext(inode, &oepos, &eloc, elen, 1); |
1966 | if (!oepos.bh) { | 1973 | if (!oepos.bh) { |
1967 | iinfo->i_lenAlloc -= (adsize * 2); | 1974 | iinfo->i_lenAlloc -= (adsize * 2); |
1968 | mark_inode_dirty(inode); | 1975 | mark_inode_dirty(inode); |
@@ -1979,7 +1986,7 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, | |||
1979 | mark_buffer_dirty_inode(oepos.bh, inode); | 1986 | mark_buffer_dirty_inode(oepos.bh, inode); |
1980 | } | 1987 | } |
1981 | } else { | 1988 | } else { |
1982 | udf_write_aext(inode, &oepos, eloc, elen, 1); | 1989 | udf_write_aext(inode, &oepos, &eloc, elen, 1); |
1983 | if (!oepos.bh) { | 1990 | if (!oepos.bh) { |
1984 | iinfo->i_lenAlloc -= adsize; | 1991 | iinfo->i_lenAlloc -= adsize; |
1985 | mark_inode_dirty(inode); | 1992 | mark_inode_dirty(inode); |
@@ -2004,7 +2011,7 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos, | |||
2004 | } | 2011 | } |
2005 | 2012 | ||
2006 | int8_t inode_bmap(struct inode *inode, sector_t block, | 2013 | int8_t inode_bmap(struct inode *inode, sector_t block, |
2007 | struct extent_position *pos, kernel_lb_addr *eloc, | 2014 | struct extent_position *pos, struct kernel_lb_addr *eloc, |
2008 | uint32_t *elen, sector_t *offset) | 2015 | uint32_t *elen, sector_t *offset) |
2009 | { | 2016 | { |
2010 | unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; | 2017 | unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits; |
@@ -2036,7 +2043,7 @@ int8_t inode_bmap(struct inode *inode, sector_t block, | |||
2036 | 2043 | ||
2037 | long udf_block_map(struct inode *inode, sector_t block) | 2044 | long udf_block_map(struct inode *inode, sector_t block) |
2038 | { | 2045 | { |
2039 | kernel_lb_addr eloc; | 2046 | struct kernel_lb_addr eloc; |
2040 | uint32_t elen; | 2047 | uint32_t elen; |
2041 | sector_t offset; | 2048 | sector_t offset; |
2042 | struct extent_position epos = {}; | 2049 | struct extent_position epos = {}; |
@@ -2046,7 +2053,7 @@ long udf_block_map(struct inode *inode, sector_t block) | |||
2046 | 2053 | ||
2047 | if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) == | 2054 | if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) == |
2048 | (EXT_RECORDED_ALLOCATED >> 30)) | 2055 | (EXT_RECORDED_ALLOCATED >> 30)) |
2049 | ret = udf_get_lb_pblock(inode->i_sb, eloc, offset); | 2056 | ret = udf_get_lb_pblock(inode->i_sb, &eloc, offset); |
2050 | else | 2057 | else |
2051 | ret = 0; | 2058 | ret = 0; |
2052 | 2059 | ||