diff options
-rw-r--r-- | Documentation/filesystems/udf.txt | 2 | ||||
-rw-r--r-- | fs/udf/balloc.c | 150 | ||||
-rw-r--r-- | fs/udf/dir.c | 14 | ||||
-rw-r--r-- | fs/udf/directory.c | 38 | ||||
-rw-r--r-- | fs/udf/ecma_167.h | 416 | ||||
-rw-r--r-- | fs/udf/ialloc.c | 9 | ||||
-rw-r--r-- | fs/udf/inode.c | 213 | ||||
-rw-r--r-- | fs/udf/misc.c | 29 | ||||
-rw-r--r-- | fs/udf/namei.c | 86 | ||||
-rw-r--r-- | fs/udf/osta_udf.h | 22 | ||||
-rw-r--r-- | fs/udf/partition.c | 2 | ||||
-rw-r--r-- | fs/udf/super.c | 605 | ||||
-rw-r--r-- | fs/udf/truncate.c | 44 | ||||
-rw-r--r-- | fs/udf/udf_i.h | 6 | ||||
-rw-r--r-- | fs/udf/udf_sb.h | 9 | ||||
-rw-r--r-- | fs/udf/udfdecl.h | 57 | ||||
-rw-r--r-- | fs/udf/udfend.h | 28 | ||||
-rw-r--r-- | fs/udf/udftime.c | 6 | ||||
-rw-r--r-- | fs/udf/unicode.c | 62 |
19 files changed, 930 insertions, 868 deletions
diff --git a/Documentation/filesystems/udf.txt b/Documentation/filesystems/udf.txt index fde829a756e6..902b95d0ee51 100644 --- a/Documentation/filesystems/udf.txt +++ b/Documentation/filesystems/udf.txt | |||
@@ -24,6 +24,8 @@ The following mount options are supported: | |||
24 | 24 | ||
25 | gid= Set the default group. | 25 | gid= Set the default group. |
26 | umask= Set the default umask. | 26 | umask= Set the default umask. |
27 | mode= Set the default file permissions. | ||
28 | dmode= Set the default directory permissions. | ||
27 | uid= Set the default user. | 29 | uid= Set the default user. |
28 | bs= Set the block size. | 30 | bs= Set the block size. |
29 | unhide Show otherwise hidden files. | 31 | unhide Show otherwise hidden files. |
diff --git a/fs/udf/balloc.c b/fs/udf/balloc.c index 2bb788a2acb1..e48e9a3af763 100644 --- a/fs/udf/balloc.c +++ b/fs/udf/balloc.c | |||
@@ -87,12 +87,12 @@ static int read_block_bitmap(struct super_block *sb, | |||
87 | { | 87 | { |
88 | struct buffer_head *bh = NULL; | 88 | struct buffer_head *bh = NULL; |
89 | int retval = 0; | 89 | int retval = 0; |
90 | kernel_lb_addr loc; | 90 | struct kernel_lb_addr loc; |
91 | 91 | ||
92 | loc.logicalBlockNum = bitmap->s_extPosition; | 92 | loc.logicalBlockNum = bitmap->s_extPosition; |
93 | loc.partitionReferenceNum = UDF_SB(sb)->s_partition; | 93 | loc.partitionReferenceNum = UDF_SB(sb)->s_partition; |
94 | 94 | ||
95 | bh = udf_tread(sb, udf_get_lb_pblock(sb, loc, block)); | 95 | bh = udf_tread(sb, udf_get_lb_pblock(sb, &loc, block)); |
96 | if (!bh) | 96 | if (!bh) |
97 | retval = -EIO; | 97 | retval = -EIO; |
98 | 98 | ||
@@ -140,27 +140,29 @@ static inline int load_block_bitmap(struct super_block *sb, | |||
140 | return slot; | 140 | return slot; |
141 | } | 141 | } |
142 | 142 | ||
143 | static bool udf_add_free_space(struct udf_sb_info *sbi, | 143 | static void udf_add_free_space(struct super_block *sb, u16 partition, u32 cnt) |
144 | u16 partition, u32 cnt) | ||
145 | { | 144 | { |
145 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
146 | struct logicalVolIntegrityDesc *lvid; | 146 | struct logicalVolIntegrityDesc *lvid; |
147 | 147 | ||
148 | if (sbi->s_lvid_bh == NULL) | 148 | if (!sbi->s_lvid_bh) |
149 | return false; | 149 | return; |
150 | 150 | ||
151 | lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; | 151 | lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
152 | le32_add_cpu(&lvid->freeSpaceTable[partition], cnt); | 152 | le32_add_cpu(&lvid->freeSpaceTable[partition], cnt); |
153 | return true; | 153 | udf_updated_lvid(sb); |
154 | } | 154 | } |
155 | 155 | ||
156 | static void udf_bitmap_free_blocks(struct super_block *sb, | 156 | static void udf_bitmap_free_blocks(struct super_block *sb, |
157 | struct inode *inode, | 157 | struct inode *inode, |
158 | struct udf_bitmap *bitmap, | 158 | struct udf_bitmap *bitmap, |
159 | kernel_lb_addr bloc, uint32_t offset, | 159 | struct kernel_lb_addr *bloc, |
160 | uint32_t offset, | ||
160 | uint32_t count) | 161 | uint32_t count) |
161 | { | 162 | { |
162 | struct udf_sb_info *sbi = UDF_SB(sb); | 163 | struct udf_sb_info *sbi = UDF_SB(sb); |
163 | struct buffer_head *bh = NULL; | 164 | struct buffer_head *bh = NULL; |
165 | struct udf_part_map *partmap; | ||
164 | unsigned long block; | 166 | unsigned long block; |
165 | unsigned long block_group; | 167 | unsigned long block_group; |
166 | unsigned long bit; | 168 | unsigned long bit; |
@@ -169,17 +171,17 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
169 | unsigned long overflow; | 171 | unsigned long overflow; |
170 | 172 | ||
171 | mutex_lock(&sbi->s_alloc_mutex); | 173 | mutex_lock(&sbi->s_alloc_mutex); |
172 | if (bloc.logicalBlockNum < 0 || | 174 | partmap = &sbi->s_partmaps[bloc->partitionReferenceNum]; |
173 | (bloc.logicalBlockNum + count) > | 175 | if (bloc->logicalBlockNum < 0 || |
174 | sbi->s_partmaps[bloc.partitionReferenceNum].s_partition_len) { | 176 | (bloc->logicalBlockNum + count) > |
177 | partmap->s_partition_len) { | ||
175 | udf_debug("%d < %d || %d + %d > %d\n", | 178 | udf_debug("%d < %d || %d + %d > %d\n", |
176 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, | 179 | bloc->logicalBlockNum, 0, bloc->logicalBlockNum, |
177 | sbi->s_partmaps[bloc.partitionReferenceNum]. | 180 | count, partmap->s_partition_len); |
178 | s_partition_len); | ||
179 | goto error_return; | 181 | goto error_return; |
180 | } | 182 | } |
181 | 183 | ||
182 | block = bloc.logicalBlockNum + offset + | 184 | block = bloc->logicalBlockNum + offset + |
183 | (sizeof(struct spaceBitmapDesc) << 3); | 185 | (sizeof(struct spaceBitmapDesc) << 3); |
184 | 186 | ||
185 | do { | 187 | do { |
@@ -207,7 +209,7 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
207 | } else { | 209 | } else { |
208 | if (inode) | 210 | if (inode) |
209 | vfs_dq_free_block(inode, 1); | 211 | vfs_dq_free_block(inode, 1); |
210 | udf_add_free_space(sbi, sbi->s_partition, 1); | 212 | udf_add_free_space(sb, sbi->s_partition, 1); |
211 | } | 213 | } |
212 | } | 214 | } |
213 | mark_buffer_dirty(bh); | 215 | mark_buffer_dirty(bh); |
@@ -218,9 +220,6 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
218 | } while (overflow); | 220 | } while (overflow); |
219 | 221 | ||
220 | error_return: | 222 | error_return: |
221 | sb->s_dirt = 1; | ||
222 | if (sbi->s_lvid_bh) | ||
223 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
224 | mutex_unlock(&sbi->s_alloc_mutex); | 223 | mutex_unlock(&sbi->s_alloc_mutex); |
225 | } | 224 | } |
226 | 225 | ||
@@ -277,9 +276,7 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, | |||
277 | } while (block_count > 0); | 276 | } while (block_count > 0); |
278 | 277 | ||
279 | out: | 278 | out: |
280 | if (udf_add_free_space(sbi, partition, -alloc_count)) | 279 | udf_add_free_space(sb, partition, -alloc_count); |
281 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
282 | sb->s_dirt = 1; | ||
283 | mutex_unlock(&sbi->s_alloc_mutex); | 280 | mutex_unlock(&sbi->s_alloc_mutex); |
284 | return alloc_count; | 281 | return alloc_count; |
285 | } | 282 | } |
@@ -409,9 +406,7 @@ got_block: | |||
409 | 406 | ||
410 | mark_buffer_dirty(bh); | 407 | mark_buffer_dirty(bh); |
411 | 408 | ||
412 | if (udf_add_free_space(sbi, partition, -1)) | 409 | udf_add_free_space(sb, partition, -1); |
413 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
414 | sb->s_dirt = 1; | ||
415 | mutex_unlock(&sbi->s_alloc_mutex); | 410 | mutex_unlock(&sbi->s_alloc_mutex); |
416 | *err = 0; | 411 | *err = 0; |
417 | return newblock; | 412 | return newblock; |
@@ -425,26 +420,28 @@ error_return: | |||
425 | static void udf_table_free_blocks(struct super_block *sb, | 420 | static void udf_table_free_blocks(struct super_block *sb, |
426 | struct inode *inode, | 421 | struct inode *inode, |
427 | struct inode *table, | 422 | struct inode *table, |
428 | kernel_lb_addr bloc, uint32_t offset, | 423 | struct kernel_lb_addr *bloc, |
424 | uint32_t offset, | ||
429 | uint32_t count) | 425 | uint32_t count) |
430 | { | 426 | { |
431 | struct udf_sb_info *sbi = UDF_SB(sb); | 427 | struct udf_sb_info *sbi = UDF_SB(sb); |
428 | struct udf_part_map *partmap; | ||
432 | uint32_t start, end; | 429 | uint32_t start, end; |
433 | uint32_t elen; | 430 | uint32_t elen; |
434 | kernel_lb_addr eloc; | 431 | struct kernel_lb_addr eloc; |
435 | struct extent_position oepos, epos; | 432 | struct extent_position oepos, epos; |
436 | int8_t etype; | 433 | int8_t etype; |
437 | int i; | 434 | int i; |
438 | struct udf_inode_info *iinfo; | 435 | struct udf_inode_info *iinfo; |
439 | 436 | ||
440 | mutex_lock(&sbi->s_alloc_mutex); | 437 | mutex_lock(&sbi->s_alloc_mutex); |
441 | if (bloc.logicalBlockNum < 0 || | 438 | partmap = &sbi->s_partmaps[bloc->partitionReferenceNum]; |
442 | (bloc.logicalBlockNum + count) > | 439 | if (bloc->logicalBlockNum < 0 || |
443 | sbi->s_partmaps[bloc.partitionReferenceNum].s_partition_len) { | 440 | (bloc->logicalBlockNum + count) > |
441 | partmap->s_partition_len) { | ||
444 | udf_debug("%d < %d || %d + %d > %d\n", | 442 | udf_debug("%d < %d || %d + %d > %d\n", |
445 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, | 443 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, |
446 | sbi->s_partmaps[bloc.partitionReferenceNum]. | 444 | partmap->s_partition_len); |
447 | s_partition_len); | ||
448 | goto error_return; | 445 | goto error_return; |
449 | } | 446 | } |
450 | 447 | ||
@@ -453,11 +450,10 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
453 | could occure, but.. oh well */ | 450 | could occure, but.. oh well */ |
454 | if (inode) | 451 | if (inode) |
455 | vfs_dq_free_block(inode, count); | 452 | vfs_dq_free_block(inode, count); |
456 | if (udf_add_free_space(sbi, sbi->s_partition, count)) | 453 | udf_add_free_space(sb, sbi->s_partition, count); |
457 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
458 | 454 | ||
459 | start = bloc.logicalBlockNum + offset; | 455 | start = bloc->logicalBlockNum + offset; |
460 | end = bloc.logicalBlockNum + offset + count - 1; | 456 | end = bloc->logicalBlockNum + offset + count - 1; |
461 | 457 | ||
462 | epos.offset = oepos.offset = sizeof(struct unallocSpaceEntry); | 458 | epos.offset = oepos.offset = sizeof(struct unallocSpaceEntry); |
463 | elen = 0; | 459 | elen = 0; |
@@ -483,7 +479,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
483 | start += count; | 479 | start += count; |
484 | count = 0; | 480 | count = 0; |
485 | } | 481 | } |
486 | udf_write_aext(table, &oepos, eloc, elen, 1); | 482 | udf_write_aext(table, &oepos, &eloc, elen, 1); |
487 | } else if (eloc.logicalBlockNum == (end + 1)) { | 483 | } else if (eloc.logicalBlockNum == (end + 1)) { |
488 | if ((0x3FFFFFFF - elen) < | 484 | if ((0x3FFFFFFF - elen) < |
489 | (count << sb->s_blocksize_bits)) { | 485 | (count << sb->s_blocksize_bits)) { |
@@ -502,7 +498,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
502 | end -= count; | 498 | end -= count; |
503 | count = 0; | 499 | count = 0; |
504 | } | 500 | } |
505 | udf_write_aext(table, &oepos, eloc, elen, 1); | 501 | udf_write_aext(table, &oepos, &eloc, elen, 1); |
506 | } | 502 | } |
507 | 503 | ||
508 | if (epos.bh != oepos.bh) { | 504 | if (epos.bh != oepos.bh) { |
@@ -532,8 +528,8 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
532 | */ | 528 | */ |
533 | 529 | ||
534 | int adsize; | 530 | int adsize; |
535 | short_ad *sad = NULL; | 531 | struct short_ad *sad = NULL; |
536 | long_ad *lad = NULL; | 532 | struct long_ad *lad = NULL; |
537 | struct allocExtDesc *aed; | 533 | struct allocExtDesc *aed; |
538 | 534 | ||
539 | eloc.logicalBlockNum = start; | 535 | eloc.logicalBlockNum = start; |
@@ -541,9 +537,9 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
541 | (count << sb->s_blocksize_bits); | 537 | (count << sb->s_blocksize_bits); |
542 | 538 | ||
543 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 539 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
544 | adsize = sizeof(short_ad); | 540 | adsize = sizeof(struct short_ad); |
545 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 541 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
546 | adsize = sizeof(long_ad); | 542 | adsize = sizeof(struct long_ad); |
547 | else { | 543 | else { |
548 | brelse(oepos.bh); | 544 | brelse(oepos.bh); |
549 | brelse(epos.bh); | 545 | brelse(epos.bh); |
@@ -563,7 +559,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
563 | elen -= sb->s_blocksize; | 559 | elen -= sb->s_blocksize; |
564 | 560 | ||
565 | epos.bh = udf_tread(sb, | 561 | epos.bh = udf_tread(sb, |
566 | udf_get_lb_pblock(sb, epos.block, 0)); | 562 | udf_get_lb_pblock(sb, &epos.block, 0)); |
567 | if (!epos.bh) { | 563 | if (!epos.bh) { |
568 | brelse(oepos.bh); | 564 | brelse(oepos.bh); |
569 | goto error_return; | 565 | goto error_return; |
@@ -601,15 +597,15 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
601 | if (sbi->s_udfrev >= 0x0200) | 597 | if (sbi->s_udfrev >= 0x0200) |
602 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, | 598 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, |
603 | 3, 1, epos.block.logicalBlockNum, | 599 | 3, 1, epos.block.logicalBlockNum, |
604 | sizeof(tag)); | 600 | sizeof(struct tag)); |
605 | else | 601 | else |
606 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, | 602 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, |
607 | 2, 1, epos.block.logicalBlockNum, | 603 | 2, 1, epos.block.logicalBlockNum, |
608 | sizeof(tag)); | 604 | sizeof(struct tag)); |
609 | 605 | ||
610 | switch (iinfo->i_alloc_type) { | 606 | switch (iinfo->i_alloc_type) { |
611 | case ICBTAG_FLAG_AD_SHORT: | 607 | case ICBTAG_FLAG_AD_SHORT: |
612 | sad = (short_ad *)sptr; | 608 | sad = (struct short_ad *)sptr; |
613 | sad->extLength = cpu_to_le32( | 609 | sad->extLength = cpu_to_le32( |
614 | EXT_NEXT_EXTENT_ALLOCDECS | | 610 | EXT_NEXT_EXTENT_ALLOCDECS | |
615 | sb->s_blocksize); | 611 | sb->s_blocksize); |
@@ -617,7 +613,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
617 | cpu_to_le32(epos.block.logicalBlockNum); | 613 | cpu_to_le32(epos.block.logicalBlockNum); |
618 | break; | 614 | break; |
619 | case ICBTAG_FLAG_AD_LONG: | 615 | case ICBTAG_FLAG_AD_LONG: |
620 | lad = (long_ad *)sptr; | 616 | lad = (struct long_ad *)sptr; |
621 | lad->extLength = cpu_to_le32( | 617 | lad->extLength = cpu_to_le32( |
622 | EXT_NEXT_EXTENT_ALLOCDECS | | 618 | EXT_NEXT_EXTENT_ALLOCDECS | |
623 | sb->s_blocksize); | 619 | sb->s_blocksize); |
@@ -635,7 +631,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
635 | 631 | ||
636 | /* It's possible that stealing the block emptied the extent */ | 632 | /* It's possible that stealing the block emptied the extent */ |
637 | if (elen) { | 633 | if (elen) { |
638 | udf_write_aext(table, &epos, eloc, elen, 1); | 634 | udf_write_aext(table, &epos, &eloc, elen, 1); |
639 | 635 | ||
640 | if (!epos.bh) { | 636 | if (!epos.bh) { |
641 | iinfo->i_lenAlloc += adsize; | 637 | iinfo->i_lenAlloc += adsize; |
@@ -653,7 +649,6 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
653 | brelse(oepos.bh); | 649 | brelse(oepos.bh); |
654 | 650 | ||
655 | error_return: | 651 | error_return: |
656 | sb->s_dirt = 1; | ||
657 | mutex_unlock(&sbi->s_alloc_mutex); | 652 | mutex_unlock(&sbi->s_alloc_mutex); |
658 | return; | 653 | return; |
659 | } | 654 | } |
@@ -666,7 +661,7 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
666 | struct udf_sb_info *sbi = UDF_SB(sb); | 661 | struct udf_sb_info *sbi = UDF_SB(sb); |
667 | int alloc_count = 0; | 662 | int alloc_count = 0; |
668 | uint32_t elen, adsize; | 663 | uint32_t elen, adsize; |
669 | kernel_lb_addr eloc; | 664 | struct kernel_lb_addr eloc; |
670 | struct extent_position epos; | 665 | struct extent_position epos; |
671 | int8_t etype = -1; | 666 | int8_t etype = -1; |
672 | struct udf_inode_info *iinfo; | 667 | struct udf_inode_info *iinfo; |
@@ -677,9 +672,9 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
677 | 672 | ||
678 | iinfo = UDF_I(table); | 673 | iinfo = UDF_I(table); |
679 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 674 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
680 | adsize = sizeof(short_ad); | 675 | adsize = sizeof(struct short_ad); |
681 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 676 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
682 | adsize = sizeof(long_ad); | 677 | adsize = sizeof(struct long_ad); |
683 | else | 678 | else |
684 | return 0; | 679 | return 0; |
685 | 680 | ||
@@ -707,7 +702,7 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
707 | alloc_count = block_count; | 702 | alloc_count = block_count; |
708 | eloc.logicalBlockNum += alloc_count; | 703 | eloc.logicalBlockNum += alloc_count; |
709 | elen -= (alloc_count << sb->s_blocksize_bits); | 704 | elen -= (alloc_count << sb->s_blocksize_bits); |
710 | udf_write_aext(table, &epos, eloc, | 705 | udf_write_aext(table, &epos, &eloc, |
711 | (etype << 30) | elen, 1); | 706 | (etype << 30) | elen, 1); |
712 | } else | 707 | } else |
713 | udf_delete_aext(table, epos, eloc, | 708 | udf_delete_aext(table, epos, eloc, |
@@ -718,10 +713,8 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
718 | 713 | ||
719 | brelse(epos.bh); | 714 | brelse(epos.bh); |
720 | 715 | ||
721 | if (alloc_count && udf_add_free_space(sbi, partition, -alloc_count)) { | 716 | if (alloc_count) |
722 | mark_buffer_dirty(sbi->s_lvid_bh); | 717 | udf_add_free_space(sb, partition, -alloc_count); |
723 | sb->s_dirt = 1; | ||
724 | } | ||
725 | mutex_unlock(&sbi->s_alloc_mutex); | 718 | mutex_unlock(&sbi->s_alloc_mutex); |
726 | return alloc_count; | 719 | return alloc_count; |
727 | } | 720 | } |
@@ -735,7 +728,7 @@ static int udf_table_new_block(struct super_block *sb, | |||
735 | uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF; | 728 | uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF; |
736 | uint32_t newblock = 0, adsize; | 729 | uint32_t newblock = 0, adsize; |
737 | uint32_t elen, goal_elen = 0; | 730 | uint32_t elen, goal_elen = 0; |
738 | kernel_lb_addr eloc, uninitialized_var(goal_eloc); | 731 | struct kernel_lb_addr eloc, uninitialized_var(goal_eloc); |
739 | struct extent_position epos, goal_epos; | 732 | struct extent_position epos, goal_epos; |
740 | int8_t etype; | 733 | int8_t etype; |
741 | struct udf_inode_info *iinfo = UDF_I(table); | 734 | struct udf_inode_info *iinfo = UDF_I(table); |
@@ -743,9 +736,9 @@ static int udf_table_new_block(struct super_block *sb, | |||
743 | *err = -ENOSPC; | 736 | *err = -ENOSPC; |
744 | 737 | ||
745 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 738 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
746 | adsize = sizeof(short_ad); | 739 | adsize = sizeof(struct short_ad); |
747 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 740 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
748 | adsize = sizeof(long_ad); | 741 | adsize = sizeof(struct long_ad); |
749 | else | 742 | else |
750 | return newblock; | 743 | return newblock; |
751 | 744 | ||
@@ -814,46 +807,37 @@ static int udf_table_new_block(struct super_block *sb, | |||
814 | } | 807 | } |
815 | 808 | ||
816 | if (goal_elen) | 809 | if (goal_elen) |
817 | udf_write_aext(table, &goal_epos, goal_eloc, goal_elen, 1); | 810 | udf_write_aext(table, &goal_epos, &goal_eloc, goal_elen, 1); |
818 | else | 811 | else |
819 | udf_delete_aext(table, goal_epos, goal_eloc, goal_elen); | 812 | udf_delete_aext(table, goal_epos, goal_eloc, goal_elen); |
820 | brelse(goal_epos.bh); | 813 | brelse(goal_epos.bh); |
821 | 814 | ||
822 | if (udf_add_free_space(sbi, partition, -1)) | 815 | udf_add_free_space(sb, partition, -1); |
823 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
824 | 816 | ||
825 | sb->s_dirt = 1; | ||
826 | mutex_unlock(&sbi->s_alloc_mutex); | 817 | mutex_unlock(&sbi->s_alloc_mutex); |
827 | *err = 0; | 818 | *err = 0; |
828 | return newblock; | 819 | return newblock; |
829 | } | 820 | } |
830 | 821 | ||
831 | inline void udf_free_blocks(struct super_block *sb, | 822 | void udf_free_blocks(struct super_block *sb, struct inode *inode, |
832 | struct inode *inode, | 823 | struct kernel_lb_addr *bloc, uint32_t offset, |
833 | kernel_lb_addr bloc, uint32_t offset, | 824 | uint32_t count) |
834 | uint32_t count) | ||
835 | { | 825 | { |
836 | uint16_t partition = bloc.partitionReferenceNum; | 826 | uint16_t partition = bloc->partitionReferenceNum; |
837 | struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; | 827 | struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; |
838 | 828 | ||
839 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { | 829 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { |
840 | return udf_bitmap_free_blocks(sb, inode, | 830 | udf_bitmap_free_blocks(sb, inode, map->s_uspace.s_bitmap, |
841 | map->s_uspace.s_bitmap, | 831 | bloc, offset, count); |
842 | bloc, offset, count); | ||
843 | } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { | 832 | } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { |
844 | return udf_table_free_blocks(sb, inode, | 833 | udf_table_free_blocks(sb, inode, map->s_uspace.s_table, |
845 | map->s_uspace.s_table, | 834 | bloc, offset, count); |
846 | bloc, offset, count); | ||
847 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { | 835 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { |
848 | return udf_bitmap_free_blocks(sb, inode, | 836 | udf_bitmap_free_blocks(sb, inode, map->s_fspace.s_bitmap, |
849 | map->s_fspace.s_bitmap, | 837 | bloc, offset, count); |
850 | bloc, offset, count); | ||
851 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { | 838 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { |
852 | return udf_table_free_blocks(sb, inode, | 839 | udf_table_free_blocks(sb, inode, map->s_fspace.s_table, |
853 | map->s_fspace.s_table, | 840 | bloc, offset, count); |
854 | bloc, offset, count); | ||
855 | } else { | ||
856 | return; | ||
857 | } | 841 | } |
858 | } | 842 | } |
859 | 843 | ||
diff --git a/fs/udf/dir.c b/fs/udf/dir.c index 62dc270c69d1..2efd4d5291b6 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c | |||
@@ -51,7 +51,7 @@ static int do_udf_readdir(struct inode *dir, struct file *filp, | |||
51 | uint8_t lfi; | 51 | uint8_t lfi; |
52 | loff_t size = udf_ext0_offset(dir) + dir->i_size; | 52 | loff_t size = udf_ext0_offset(dir) + dir->i_size; |
53 | struct buffer_head *tmp, *bha[16]; | 53 | struct buffer_head *tmp, *bha[16]; |
54 | kernel_lb_addr eloc; | 54 | struct kernel_lb_addr eloc; |
55 | uint32_t elen; | 55 | uint32_t elen; |
56 | sector_t offset; | 56 | sector_t offset; |
57 | int i, num, ret = 0; | 57 | int i, num, ret = 0; |
@@ -80,13 +80,13 @@ static int do_udf_readdir(struct inode *dir, struct file *filp, | |||
80 | ret = -ENOENT; | 80 | ret = -ENOENT; |
81 | goto out; | 81 | goto out; |
82 | } | 82 | } |
83 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 83 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); |
84 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 84 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
85 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 85 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
86 | epos.offset -= sizeof(short_ad); | 86 | epos.offset -= sizeof(struct short_ad); |
87 | else if (iinfo->i_alloc_type == | 87 | else if (iinfo->i_alloc_type == |
88 | ICBTAG_FLAG_AD_LONG) | 88 | ICBTAG_FLAG_AD_LONG) |
89 | epos.offset -= sizeof(long_ad); | 89 | epos.offset -= sizeof(struct long_ad); |
90 | } else { | 90 | } else { |
91 | offset = 0; | 91 | offset = 0; |
92 | } | 92 | } |
@@ -101,7 +101,7 @@ static int do_udf_readdir(struct inode *dir, struct file *filp, | |||
101 | if (i + offset > (elen >> dir->i_sb->s_blocksize_bits)) | 101 | if (i + offset > (elen >> dir->i_sb->s_blocksize_bits)) |
102 | i = (elen >> dir->i_sb->s_blocksize_bits) - offset; | 102 | i = (elen >> dir->i_sb->s_blocksize_bits) - offset; |
103 | for (num = 0; i > 0; i--) { | 103 | for (num = 0; i > 0; i--) { |
104 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset + i); | 104 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset + i); |
105 | tmp = udf_tgetblk(dir->i_sb, block); | 105 | tmp = udf_tgetblk(dir->i_sb, block); |
106 | if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) | 106 | if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) |
107 | bha[num++] = tmp; | 107 | bha[num++] = tmp; |
@@ -161,9 +161,9 @@ static int do_udf_readdir(struct inode *dir, struct file *filp, | |||
161 | memcpy(fname, "..", flen); | 161 | memcpy(fname, "..", flen); |
162 | dt_type = DT_DIR; | 162 | dt_type = DT_DIR; |
163 | } else { | 163 | } else { |
164 | kernel_lb_addr tloc = lelb_to_cpu(cfi.icb.extLocation); | 164 | struct kernel_lb_addr tloc = lelb_to_cpu(cfi.icb.extLocation); |
165 | 165 | ||
166 | iblock = udf_get_lb_pblock(dir->i_sb, tloc, 0); | 166 | iblock = udf_get_lb_pblock(dir->i_sb, &tloc, 0); |
167 | flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi); | 167 | flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi); |
168 | dt_type = DT_UNKNOWN; | 168 | dt_type = DT_UNKNOWN; |
169 | } | 169 | } |
diff --git a/fs/udf/directory.c b/fs/udf/directory.c index 2820f8fcf4cc..1d2c570704c8 100644 --- a/fs/udf/directory.c +++ b/fs/udf/directory.c | |||
@@ -20,7 +20,7 @@ | |||
20 | 20 | ||
21 | #if 0 | 21 | #if 0 |
22 | static uint8_t *udf_filead_read(struct inode *dir, uint8_t *tmpad, | 22 | static uint8_t *udf_filead_read(struct inode *dir, uint8_t *tmpad, |
23 | uint8_t ad_size, kernel_lb_addr fe_loc, | 23 | uint8_t ad_size, struct kernel_lb_addr fe_loc, |
24 | int *pos, int *offset, struct buffer_head **bh, | 24 | int *pos, int *offset, struct buffer_head **bh, |
25 | int *error) | 25 | int *error) |
26 | { | 26 | { |
@@ -75,7 +75,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, | |||
75 | struct udf_fileident_bh *fibh, | 75 | struct udf_fileident_bh *fibh, |
76 | struct fileIdentDesc *cfi, | 76 | struct fileIdentDesc *cfi, |
77 | struct extent_position *epos, | 77 | struct extent_position *epos, |
78 | kernel_lb_addr *eloc, uint32_t *elen, | 78 | struct kernel_lb_addr *eloc, uint32_t *elen, |
79 | sector_t *offset) | 79 | sector_t *offset) |
80 | { | 80 | { |
81 | struct fileIdentDesc *fi; | 81 | struct fileIdentDesc *fi; |
@@ -111,7 +111,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, | |||
111 | (EXT_RECORDED_ALLOCATED >> 30)) | 111 | (EXT_RECORDED_ALLOCATED >> 30)) |
112 | return NULL; | 112 | return NULL; |
113 | 113 | ||
114 | block = udf_get_lb_pblock(dir->i_sb, *eloc, *offset); | 114 | block = udf_get_lb_pblock(dir->i_sb, eloc, *offset); |
115 | 115 | ||
116 | (*offset)++; | 116 | (*offset)++; |
117 | 117 | ||
@@ -131,7 +131,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, | |||
131 | if (i + *offset > (*elen >> blocksize_bits)) | 131 | if (i + *offset > (*elen >> blocksize_bits)) |
132 | i = (*elen >> blocksize_bits)-*offset; | 132 | i = (*elen >> blocksize_bits)-*offset; |
133 | for (num = 0; i > 0; i--) { | 133 | for (num = 0; i > 0; i--) { |
134 | block = udf_get_lb_pblock(dir->i_sb, *eloc, | 134 | block = udf_get_lb_pblock(dir->i_sb, eloc, |
135 | *offset + i); | 135 | *offset + i); |
136 | tmp = udf_tgetblk(dir->i_sb, block); | 136 | tmp = udf_tgetblk(dir->i_sb, block); |
137 | if (tmp && !buffer_uptodate(tmp) && | 137 | if (tmp && !buffer_uptodate(tmp) && |
@@ -169,7 +169,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, | |||
169 | (EXT_RECORDED_ALLOCATED >> 30)) | 169 | (EXT_RECORDED_ALLOCATED >> 30)) |
170 | return NULL; | 170 | return NULL; |
171 | 171 | ||
172 | block = udf_get_lb_pblock(dir->i_sb, *eloc, *offset); | 172 | block = udf_get_lb_pblock(dir->i_sb, eloc, *offset); |
173 | 173 | ||
174 | (*offset)++; | 174 | (*offset)++; |
175 | 175 | ||
@@ -249,9 +249,9 @@ struct fileIdentDesc *udf_get_fileident(void *buffer, int bufsize, int *offset) | |||
249 | } | 249 | } |
250 | 250 | ||
251 | #if 0 | 251 | #if 0 |
252 | static extent_ad *udf_get_fileextent(void *buffer, int bufsize, int *offset) | 252 | static struct extent_ad *udf_get_fileextent(void *buffer, int bufsize, int *offset) |
253 | { | 253 | { |
254 | extent_ad *ext; | 254 | struct extent_ad *ext; |
255 | struct fileEntry *fe; | 255 | struct fileEntry *fe; |
256 | uint8_t *ptr; | 256 | uint8_t *ptr; |
257 | 257 | ||
@@ -274,54 +274,54 @@ static extent_ad *udf_get_fileextent(void *buffer, int bufsize, int *offset) | |||
274 | if ((*offset > 0) && (*offset < le32_to_cpu(fe->lengthAllocDescs))) | 274 | if ((*offset > 0) && (*offset < le32_to_cpu(fe->lengthAllocDescs))) |
275 | ptr += *offset; | 275 | ptr += *offset; |
276 | 276 | ||
277 | ext = (extent_ad *)ptr; | 277 | ext = (struct extent_ad *)ptr; |
278 | 278 | ||
279 | *offset = *offset + sizeof(extent_ad); | 279 | *offset = *offset + sizeof(struct extent_ad); |
280 | return ext; | 280 | return ext; |
281 | } | 281 | } |
282 | #endif | 282 | #endif |
283 | 283 | ||
284 | short_ad *udf_get_fileshortad(uint8_t *ptr, int maxoffset, uint32_t *offset, | 284 | struct short_ad *udf_get_fileshortad(uint8_t *ptr, int maxoffset, uint32_t *offset, |
285 | int inc) | 285 | int inc) |
286 | { | 286 | { |
287 | short_ad *sa; | 287 | struct short_ad *sa; |
288 | 288 | ||
289 | if ((!ptr) || (!offset)) { | 289 | if ((!ptr) || (!offset)) { |
290 | printk(KERN_ERR "udf: udf_get_fileshortad() invalidparms\n"); | 290 | printk(KERN_ERR "udf: udf_get_fileshortad() invalidparms\n"); |
291 | return NULL; | 291 | return NULL; |
292 | } | 292 | } |
293 | 293 | ||
294 | if ((*offset + sizeof(short_ad)) > maxoffset) | 294 | if ((*offset + sizeof(struct short_ad)) > maxoffset) |
295 | return NULL; | 295 | return NULL; |
296 | else { | 296 | else { |
297 | sa = (short_ad *)ptr; | 297 | sa = (struct short_ad *)ptr; |
298 | if (sa->extLength == 0) | 298 | if (sa->extLength == 0) |
299 | return NULL; | 299 | return NULL; |
300 | } | 300 | } |
301 | 301 | ||
302 | if (inc) | 302 | if (inc) |
303 | *offset += sizeof(short_ad); | 303 | *offset += sizeof(struct short_ad); |
304 | return sa; | 304 | return sa; |
305 | } | 305 | } |
306 | 306 | ||
307 | long_ad *udf_get_filelongad(uint8_t *ptr, int maxoffset, uint32_t *offset, int inc) | 307 | struct long_ad *udf_get_filelongad(uint8_t *ptr, int maxoffset, uint32_t *offset, int inc) |
308 | { | 308 | { |
309 | long_ad *la; | 309 | struct long_ad *la; |
310 | 310 | ||
311 | if ((!ptr) || (!offset)) { | 311 | if ((!ptr) || (!offset)) { |
312 | printk(KERN_ERR "udf: udf_get_filelongad() invalidparms\n"); | 312 | printk(KERN_ERR "udf: udf_get_filelongad() invalidparms\n"); |
313 | return NULL; | 313 | return NULL; |
314 | } | 314 | } |
315 | 315 | ||
316 | if ((*offset + sizeof(long_ad)) > maxoffset) | 316 | if ((*offset + sizeof(struct long_ad)) > maxoffset) |
317 | return NULL; | 317 | return NULL; |
318 | else { | 318 | else { |
319 | la = (long_ad *)ptr; | 319 | la = (struct long_ad *)ptr; |
320 | if (la->extLength == 0) | 320 | if (la->extLength == 0) |
321 | return NULL; | 321 | return NULL; |
322 | } | 322 | } |
323 | 323 | ||
324 | if (inc) | 324 | if (inc) |
325 | *offset += sizeof(long_ad); | 325 | *offset += sizeof(struct long_ad); |
326 | return la; | 326 | return la; |
327 | } | 327 | } |
diff --git a/fs/udf/ecma_167.h b/fs/udf/ecma_167.h index a0974df82b31..4792b771aa80 100644 --- a/fs/udf/ecma_167.h +++ b/fs/udf/ecma_167.h | |||
@@ -38,10 +38,10 @@ | |||
38 | #define _ECMA_167_H 1 | 38 | #define _ECMA_167_H 1 |
39 | 39 | ||
40 | /* Character set specification (ECMA 167r3 1/7.2.1) */ | 40 | /* Character set specification (ECMA 167r3 1/7.2.1) */ |
41 | typedef struct { | 41 | struct charspec { |
42 | uint8_t charSetType; | 42 | uint8_t charSetType; |
43 | uint8_t charSetInfo[63]; | 43 | uint8_t charSetInfo[63]; |
44 | } __attribute__ ((packed)) charspec; | 44 | } __attribute__ ((packed)); |
45 | 45 | ||
46 | /* Character Set Type (ECMA 167r3 1/7.2.1.1) */ | 46 | /* Character Set Type (ECMA 167r3 1/7.2.1.1) */ |
47 | #define CHARSPEC_TYPE_CS0 0x00 /* (1/7.2.2) */ | 47 | #define CHARSPEC_TYPE_CS0 0x00 /* (1/7.2.2) */ |
@@ -57,7 +57,7 @@ typedef struct { | |||
57 | typedef uint8_t dstring; | 57 | typedef uint8_t dstring; |
58 | 58 | ||
59 | /* Timestamp (ECMA 167r3 1/7.3) */ | 59 | /* Timestamp (ECMA 167r3 1/7.3) */ |
60 | typedef struct { | 60 | struct timestamp { |
61 | __le16 typeAndTimezone; | 61 | __le16 typeAndTimezone; |
62 | __le16 year; | 62 | __le16 year; |
63 | uint8_t month; | 63 | uint8_t month; |
@@ -68,7 +68,7 @@ typedef struct { | |||
68 | uint8_t centiseconds; | 68 | uint8_t centiseconds; |
69 | uint8_t hundredsOfMicroseconds; | 69 | uint8_t hundredsOfMicroseconds; |
70 | uint8_t microseconds; | 70 | uint8_t microseconds; |
71 | } __attribute__ ((packed)) timestamp; | 71 | } __attribute__ ((packed)); |
72 | 72 | ||
73 | /* Type and Time Zone (ECMA 167r3 1/7.3.1) */ | 73 | /* Type and Time Zone (ECMA 167r3 1/7.3.1) */ |
74 | #define TIMESTAMP_TYPE_MASK 0xF000 | 74 | #define TIMESTAMP_TYPE_MASK 0xF000 |
@@ -78,11 +78,11 @@ typedef struct { | |||
78 | #define TIMESTAMP_TIMEZONE_MASK 0x0FFF | 78 | #define TIMESTAMP_TIMEZONE_MASK 0x0FFF |
79 | 79 | ||
80 | /* Entity identifier (ECMA 167r3 1/7.4) */ | 80 | /* Entity identifier (ECMA 167r3 1/7.4) */ |
81 | typedef struct { | 81 | struct regid { |
82 | uint8_t flags; | 82 | uint8_t flags; |
83 | uint8_t ident[23]; | 83 | uint8_t ident[23]; |
84 | uint8_t identSuffix[8]; | 84 | uint8_t identSuffix[8]; |
85 | } __attribute__ ((packed)) regid; | 85 | } __attribute__ ((packed)); |
86 | 86 | ||
87 | /* Flags (ECMA 167r3 1/7.4.1) */ | 87 | /* Flags (ECMA 167r3 1/7.4.1) */ |
88 | #define ENTITYID_FLAGS_DIRTY 0x00 | 88 | #define ENTITYID_FLAGS_DIRTY 0x00 |
@@ -126,38 +126,38 @@ struct terminatingExtendedAreaDesc { | |||
126 | 126 | ||
127 | /* Boot Descriptor (ECMA 167r3 2/9.4) */ | 127 | /* Boot Descriptor (ECMA 167r3 2/9.4) */ |
128 | struct bootDesc { | 128 | struct bootDesc { |
129 | uint8_t structType; | 129 | uint8_t structType; |
130 | uint8_t stdIdent[VSD_STD_ID_LEN]; | 130 | uint8_t stdIdent[VSD_STD_ID_LEN]; |
131 | uint8_t structVersion; | 131 | uint8_t structVersion; |
132 | uint8_t reserved1; | 132 | uint8_t reserved1; |
133 | regid archType; | 133 | struct regid archType; |
134 | regid bootIdent; | 134 | struct regid bootIdent; |
135 | __le32 bootExtLocation; | 135 | __le32 bootExtLocation; |
136 | __le32 bootExtLength; | 136 | __le32 bootExtLength; |
137 | __le64 loadAddress; | 137 | __le64 loadAddress; |
138 | __le64 startAddress; | 138 | __le64 startAddress; |
139 | timestamp descCreationDateAndTime; | 139 | struct timestamp descCreationDateAndTime; |
140 | __le16 flags; | 140 | __le16 flags; |
141 | uint8_t reserved2[32]; | 141 | uint8_t reserved2[32]; |
142 | uint8_t bootUse[1906]; | 142 | uint8_t bootUse[1906]; |
143 | } __attribute__ ((packed)); | 143 | } __attribute__ ((packed)); |
144 | 144 | ||
145 | /* Flags (ECMA 167r3 2/9.4.12) */ | 145 | /* Flags (ECMA 167r3 2/9.4.12) */ |
146 | #define BOOT_FLAGS_ERASE 0x01 | 146 | #define BOOT_FLAGS_ERASE 0x01 |
147 | 147 | ||
148 | /* Extent Descriptor (ECMA 167r3 3/7.1) */ | 148 | /* Extent Descriptor (ECMA 167r3 3/7.1) */ |
149 | typedef struct { | 149 | struct extent_ad { |
150 | __le32 extLength; | 150 | __le32 extLength; |
151 | __le32 extLocation; | 151 | __le32 extLocation; |
152 | } __attribute__ ((packed)) extent_ad; | 152 | } __attribute__ ((packed)); |
153 | 153 | ||
154 | typedef struct { | 154 | struct kernel_extent_ad { |
155 | uint32_t extLength; | 155 | uint32_t extLength; |
156 | uint32_t extLocation; | 156 | uint32_t extLocation; |
157 | } kernel_extent_ad; | 157 | }; |
158 | 158 | ||
159 | /* Descriptor Tag (ECMA 167r3 3/7.2) */ | 159 | /* Descriptor Tag (ECMA 167r3 3/7.2) */ |
160 | typedef struct { | 160 | struct tag { |
161 | __le16 tagIdent; | 161 | __le16 tagIdent; |
162 | __le16 descVersion; | 162 | __le16 descVersion; |
163 | uint8_t tagChecksum; | 163 | uint8_t tagChecksum; |
@@ -166,7 +166,7 @@ typedef struct { | |||
166 | __le16 descCRC; | 166 | __le16 descCRC; |
167 | __le16 descCRCLength; | 167 | __le16 descCRCLength; |
168 | __le32 tagLocation; | 168 | __le32 tagLocation; |
169 | } __attribute__ ((packed)) tag; | 169 | } __attribute__ ((packed)); |
170 | 170 | ||
171 | /* Tag Identifier (ECMA 167r3 3/7.2.1) */ | 171 | /* Tag Identifier (ECMA 167r3 3/7.2.1) */ |
172 | #define TAG_IDENT_PVD 0x0001 | 172 | #define TAG_IDENT_PVD 0x0001 |
@@ -190,28 +190,28 @@ struct NSRDesc { | |||
190 | 190 | ||
191 | /* Primary Volume Descriptor (ECMA 167r3 3/10.1) */ | 191 | /* Primary Volume Descriptor (ECMA 167r3 3/10.1) */ |
192 | struct primaryVolDesc { | 192 | struct primaryVolDesc { |
193 | tag descTag; | 193 | struct tag descTag; |
194 | __le32 volDescSeqNum; | 194 | __le32 volDescSeqNum; |
195 | __le32 primaryVolDescNum; | 195 | __le32 primaryVolDescNum; |
196 | dstring volIdent[32]; | 196 | dstring volIdent[32]; |
197 | __le16 volSeqNum; | 197 | __le16 volSeqNum; |
198 | __le16 maxVolSeqNum; | 198 | __le16 maxVolSeqNum; |
199 | __le16 interchangeLvl; | 199 | __le16 interchangeLvl; |
200 | __le16 maxInterchangeLvl; | 200 | __le16 maxInterchangeLvl; |
201 | __le32 charSetList; | 201 | __le32 charSetList; |
202 | __le32 maxCharSetList; | 202 | __le32 maxCharSetList; |
203 | dstring volSetIdent[128]; | 203 | dstring volSetIdent[128]; |
204 | charspec descCharSet; | 204 | struct charspec descCharSet; |
205 | charspec explanatoryCharSet; | 205 | struct charspec explanatoryCharSet; |
206 | extent_ad volAbstract; | 206 | struct extent_ad volAbstract; |
207 | extent_ad volCopyright; | 207 | struct extent_ad volCopyright; |
208 | regid appIdent; | 208 | struct regid appIdent; |
209 | timestamp recordingDateAndTime; | 209 | struct timestamp recordingDateAndTime; |
210 | regid impIdent; | 210 | struct regid impIdent; |
211 | uint8_t impUse[64]; | 211 | uint8_t impUse[64]; |
212 | __le32 predecessorVolDescSeqLocation; | 212 | __le32 predecessorVolDescSeqLocation; |
213 | __le16 flags; | 213 | __le16 flags; |
214 | uint8_t reserved[22]; | 214 | uint8_t reserved[22]; |
215 | } __attribute__ ((packed)); | 215 | } __attribute__ ((packed)); |
216 | 216 | ||
217 | /* Flags (ECMA 167r3 3/10.1.21) */ | 217 | /* Flags (ECMA 167r3 3/10.1.21) */ |
@@ -219,40 +219,40 @@ struct primaryVolDesc { | |||
219 | 219 | ||
220 | /* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */ | 220 | /* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */ |
221 | struct anchorVolDescPtr { | 221 | struct anchorVolDescPtr { |
222 | tag descTag; | 222 | struct tag descTag; |
223 | extent_ad mainVolDescSeqExt; | 223 | struct extent_ad mainVolDescSeqExt; |
224 | extent_ad reserveVolDescSeqExt; | 224 | struct extent_ad reserveVolDescSeqExt; |
225 | uint8_t reserved[480]; | 225 | uint8_t reserved[480]; |
226 | } __attribute__ ((packed)); | 226 | } __attribute__ ((packed)); |
227 | 227 | ||
228 | /* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */ | 228 | /* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */ |
229 | struct volDescPtr { | 229 | struct volDescPtr { |
230 | tag descTag; | 230 | struct tag descTag; |
231 | __le32 volDescSeqNum; | 231 | __le32 volDescSeqNum; |
232 | extent_ad nextVolDescSeqExt; | 232 | struct extent_ad nextVolDescSeqExt; |
233 | uint8_t reserved[484]; | 233 | uint8_t reserved[484]; |
234 | } __attribute__ ((packed)); | 234 | } __attribute__ ((packed)); |
235 | 235 | ||
236 | /* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */ | 236 | /* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */ |
237 | struct impUseVolDesc { | 237 | struct impUseVolDesc { |
238 | tag descTag; | 238 | struct tag descTag; |
239 | __le32 volDescSeqNum; | 239 | __le32 volDescSeqNum; |
240 | regid impIdent; | 240 | struct regid impIdent; |
241 | uint8_t impUse[460]; | 241 | uint8_t impUse[460]; |
242 | } __attribute__ ((packed)); | 242 | } __attribute__ ((packed)); |
243 | 243 | ||
244 | /* Partition Descriptor (ECMA 167r3 3/10.5) */ | 244 | /* Partition Descriptor (ECMA 167r3 3/10.5) */ |
245 | struct partitionDesc { | 245 | struct partitionDesc { |
246 | tag descTag; | 246 | struct tag descTag; |
247 | __le32 volDescSeqNum; | 247 | __le32 volDescSeqNum; |
248 | __le16 partitionFlags; | 248 | __le16 partitionFlags; |
249 | __le16 partitionNumber; | 249 | __le16 partitionNumber; |
250 | regid partitionContents; | 250 | struct regid partitionContents; |
251 | uint8_t partitionContentsUse[128]; | 251 | uint8_t partitionContentsUse[128]; |
252 | __le32 accessType; | 252 | __le32 accessType; |
253 | __le32 partitionStartingLocation; | 253 | __le32 partitionStartingLocation; |
254 | __le32 partitionLength; | 254 | __le32 partitionLength; |
255 | regid impIdent; | 255 | struct regid impIdent; |
256 | uint8_t impUse[128]; | 256 | uint8_t impUse[128]; |
257 | uint8_t reserved[156]; | 257 | uint8_t reserved[156]; |
258 | } __attribute__ ((packed)); | 258 | } __attribute__ ((packed)); |
@@ -278,19 +278,19 @@ struct partitionDesc { | |||
278 | 278 | ||
279 | /* Logical Volume Descriptor (ECMA 167r3 3/10.6) */ | 279 | /* Logical Volume Descriptor (ECMA 167r3 3/10.6) */ |
280 | struct logicalVolDesc { | 280 | struct logicalVolDesc { |
281 | tag descTag; | 281 | struct tag descTag; |
282 | __le32 volDescSeqNum; | 282 | __le32 volDescSeqNum; |
283 | charspec descCharSet; | 283 | struct charspec descCharSet; |
284 | dstring logicalVolIdent[128]; | 284 | dstring logicalVolIdent[128]; |
285 | __le32 logicalBlockSize; | 285 | __le32 logicalBlockSize; |
286 | regid domainIdent; | 286 | struct regid domainIdent; |
287 | uint8_t logicalVolContentsUse[16]; | 287 | uint8_t logicalVolContentsUse[16]; |
288 | __le32 mapTableLength; | 288 | __le32 mapTableLength; |
289 | __le32 numPartitionMaps; | 289 | __le32 numPartitionMaps; |
290 | regid impIdent; | 290 | struct regid impIdent; |
291 | uint8_t impUse[128]; | 291 | uint8_t impUse[128]; |
292 | extent_ad integritySeqExt; | 292 | struct extent_ad integritySeqExt; |
293 | uint8_t partitionMaps[0]; | 293 | uint8_t partitionMaps[0]; |
294 | } __attribute__ ((packed)); | 294 | } __attribute__ ((packed)); |
295 | 295 | ||
296 | /* Generic Partition Map (ECMA 167r3 3/10.7.1) */ | 296 | /* Generic Partition Map (ECMA 167r3 3/10.7.1) */ |
@@ -322,30 +322,30 @@ struct genericPartitionMap2 { | |||
322 | 322 | ||
323 | /* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */ | 323 | /* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */ |
324 | struct unallocSpaceDesc { | 324 | struct unallocSpaceDesc { |
325 | tag descTag; | 325 | struct tag descTag; |
326 | __le32 volDescSeqNum; | 326 | __le32 volDescSeqNum; |
327 | __le32 numAllocDescs; | 327 | __le32 numAllocDescs; |
328 | extent_ad allocDescs[0]; | 328 | struct extent_ad allocDescs[0]; |
329 | } __attribute__ ((packed)); | 329 | } __attribute__ ((packed)); |
330 | 330 | ||
331 | /* Terminating Descriptor (ECMA 167r3 3/10.9) */ | 331 | /* Terminating Descriptor (ECMA 167r3 3/10.9) */ |
332 | struct terminatingDesc { | 332 | struct terminatingDesc { |
333 | tag descTag; | 333 | struct tag descTag; |
334 | uint8_t reserved[496]; | 334 | uint8_t reserved[496]; |
335 | } __attribute__ ((packed)); | 335 | } __attribute__ ((packed)); |
336 | 336 | ||
337 | /* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */ | 337 | /* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */ |
338 | struct logicalVolIntegrityDesc { | 338 | struct logicalVolIntegrityDesc { |
339 | tag descTag; | 339 | struct tag descTag; |
340 | timestamp recordingDateAndTime; | 340 | struct timestamp recordingDateAndTime; |
341 | __le32 integrityType; | 341 | __le32 integrityType; |
342 | extent_ad nextIntegrityExt; | 342 | struct extent_ad nextIntegrityExt; |
343 | uint8_t logicalVolContentsUse[32]; | 343 | uint8_t logicalVolContentsUse[32]; |
344 | __le32 numOfPartitions; | 344 | __le32 numOfPartitions; |
345 | __le32 lengthOfImpUse; | 345 | __le32 lengthOfImpUse; |
346 | __le32 freeSpaceTable[0]; | 346 | __le32 freeSpaceTable[0]; |
347 | __le32 sizeTable[0]; | 347 | __le32 sizeTable[0]; |
348 | uint8_t impUse[0]; | 348 | uint8_t impUse[0]; |
349 | } __attribute__ ((packed)); | 349 | } __attribute__ ((packed)); |
350 | 350 | ||
351 | /* Integrity Type (ECMA 167r3 3/10.10.3) */ | 351 | /* Integrity Type (ECMA 167r3 3/10.10.3) */ |
@@ -353,50 +353,50 @@ struct logicalVolIntegrityDesc { | |||
353 | #define LVID_INTEGRITY_TYPE_CLOSE 0x00000001 | 353 | #define LVID_INTEGRITY_TYPE_CLOSE 0x00000001 |
354 | 354 | ||
355 | /* Recorded Address (ECMA 167r3 4/7.1) */ | 355 | /* Recorded Address (ECMA 167r3 4/7.1) */ |
356 | typedef struct { | 356 | struct lb_addr { |
357 | __le32 logicalBlockNum; | 357 | __le32 logicalBlockNum; |
358 | __le16 partitionReferenceNum; | 358 | __le16 partitionReferenceNum; |
359 | } __attribute__ ((packed)) lb_addr; | 359 | } __attribute__ ((packed)); |
360 | 360 | ||
361 | /* ... and its in-core analog */ | 361 | /* ... and its in-core analog */ |
362 | typedef struct { | 362 | struct kernel_lb_addr { |
363 | uint32_t logicalBlockNum; | 363 | uint32_t logicalBlockNum; |
364 | uint16_t partitionReferenceNum; | 364 | uint16_t partitionReferenceNum; |
365 | } kernel_lb_addr; | 365 | }; |
366 | 366 | ||
367 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ | 367 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ |
368 | typedef struct { | 368 | struct short_ad { |
369 | __le32 extLength; | 369 | __le32 extLength; |
370 | __le32 extPosition; | 370 | __le32 extPosition; |
371 | } __attribute__ ((packed)) short_ad; | 371 | } __attribute__ ((packed)); |
372 | 372 | ||
373 | /* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */ | 373 | /* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */ |
374 | typedef struct { | 374 | struct long_ad { |
375 | __le32 extLength; | 375 | __le32 extLength; |
376 | lb_addr extLocation; | 376 | struct lb_addr extLocation; |
377 | uint8_t impUse[6]; | 377 | uint8_t impUse[6]; |
378 | } __attribute__ ((packed)) long_ad; | 378 | } __attribute__ ((packed)); |
379 | 379 | ||
380 | typedef struct { | 380 | struct kernel_long_ad { |
381 | uint32_t extLength; | 381 | uint32_t extLength; |
382 | kernel_lb_addr extLocation; | 382 | struct kernel_lb_addr extLocation; |
383 | uint8_t impUse[6]; | 383 | uint8_t impUse[6]; |
384 | } kernel_long_ad; | 384 | }; |
385 | 385 | ||
386 | /* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */ | 386 | /* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */ |
387 | typedef struct { | 387 | struct ext_ad { |
388 | __le32 extLength; | 388 | __le32 extLength; |
389 | __le32 recordedLength; | 389 | __le32 recordedLength; |
390 | __le32 informationLength; | 390 | __le32 informationLength; |
391 | lb_addr extLocation; | 391 | struct lb_addr extLocation; |
392 | } __attribute__ ((packed)) ext_ad; | 392 | } __attribute__ ((packed)); |
393 | 393 | ||
394 | typedef struct { | 394 | struct kernel_ext_ad { |
395 | uint32_t extLength; | 395 | uint32_t extLength; |
396 | uint32_t recordedLength; | 396 | uint32_t recordedLength; |
397 | uint32_t informationLength; | 397 | uint32_t informationLength; |
398 | kernel_lb_addr extLocation; | 398 | struct kernel_lb_addr extLocation; |
399 | } kernel_ext_ad; | 399 | }; |
400 | 400 | ||
401 | /* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */ | 401 | /* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */ |
402 | 402 | ||
@@ -415,44 +415,44 @@ typedef struct { | |||
415 | 415 | ||
416 | /* File Set Descriptor (ECMA 167r3 4/14.1) */ | 416 | /* File Set Descriptor (ECMA 167r3 4/14.1) */ |
417 | struct fileSetDesc { | 417 | struct fileSetDesc { |
418 | tag descTag; | 418 | struct tag descTag; |
419 | timestamp recordingDateAndTime; | 419 | struct timestamp recordingDateAndTime; |
420 | __le16 interchangeLvl; | 420 | __le16 interchangeLvl; |
421 | __le16 maxInterchangeLvl; | 421 | __le16 maxInterchangeLvl; |
422 | __le32 charSetList; | 422 | __le32 charSetList; |
423 | __le32 maxCharSetList; | 423 | __le32 maxCharSetList; |
424 | __le32 fileSetNum; | 424 | __le32 fileSetNum; |
425 | __le32 fileSetDescNum; | 425 | __le32 fileSetDescNum; |
426 | charspec logicalVolIdentCharSet; | 426 | struct charspec logicalVolIdentCharSet; |
427 | dstring logicalVolIdent[128]; | 427 | dstring logicalVolIdent[128]; |
428 | charspec fileSetCharSet; | 428 | struct charspec fileSetCharSet; |
429 | dstring fileSetIdent[32]; | 429 | dstring fileSetIdent[32]; |
430 | dstring copyrightFileIdent[32]; | 430 | dstring copyrightFileIdent[32]; |
431 | dstring abstractFileIdent[32]; | 431 | dstring abstractFileIdent[32]; |
432 | long_ad rootDirectoryICB; | 432 | struct long_ad rootDirectoryICB; |
433 | regid domainIdent; | 433 | struct regid domainIdent; |
434 | long_ad nextExt; | 434 | struct long_ad nextExt; |
435 | long_ad streamDirectoryICB; | 435 | struct long_ad streamDirectoryICB; |
436 | uint8_t reserved[32]; | 436 | uint8_t reserved[32]; |
437 | } __attribute__ ((packed)); | 437 | } __attribute__ ((packed)); |
438 | 438 | ||
439 | /* Partition Header Descriptor (ECMA 167r3 4/14.3) */ | 439 | /* Partition Header Descriptor (ECMA 167r3 4/14.3) */ |
440 | struct partitionHeaderDesc { | 440 | struct partitionHeaderDesc { |
441 | short_ad unallocSpaceTable; | 441 | struct short_ad unallocSpaceTable; |
442 | short_ad unallocSpaceBitmap; | 442 | struct short_ad unallocSpaceBitmap; |
443 | short_ad partitionIntegrityTable; | 443 | struct short_ad partitionIntegrityTable; |
444 | short_ad freedSpaceTable; | 444 | struct short_ad freedSpaceTable; |
445 | short_ad freedSpaceBitmap; | 445 | struct short_ad freedSpaceBitmap; |
446 | uint8_t reserved[88]; | 446 | uint8_t reserved[88]; |
447 | } __attribute__ ((packed)); | 447 | } __attribute__ ((packed)); |
448 | 448 | ||
449 | /* File Identifier Descriptor (ECMA 167r3 4/14.4) */ | 449 | /* File Identifier Descriptor (ECMA 167r3 4/14.4) */ |
450 | struct fileIdentDesc { | 450 | struct fileIdentDesc { |
451 | tag descTag; | 451 | struct tag descTag; |
452 | __le16 fileVersionNum; | 452 | __le16 fileVersionNum; |
453 | uint8_t fileCharacteristics; | 453 | uint8_t fileCharacteristics; |
454 | uint8_t lengthFileIdent; | 454 | uint8_t lengthFileIdent; |
455 | long_ad icb; | 455 | struct long_ad icb; |
456 | __le16 lengthOfImpUse; | 456 | __le16 lengthOfImpUse; |
457 | uint8_t impUse[0]; | 457 | uint8_t impUse[0]; |
458 | uint8_t fileIdent[0]; | 458 | uint8_t fileIdent[0]; |
@@ -468,22 +468,22 @@ struct fileIdentDesc { | |||
468 | 468 | ||
469 | /* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */ | 469 | /* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */ |
470 | struct allocExtDesc { | 470 | struct allocExtDesc { |
471 | tag descTag; | 471 | struct tag descTag; |
472 | __le32 previousAllocExtLocation; | 472 | __le32 previousAllocExtLocation; |
473 | __le32 lengthAllocDescs; | 473 | __le32 lengthAllocDescs; |
474 | } __attribute__ ((packed)); | 474 | } __attribute__ ((packed)); |
475 | 475 | ||
476 | /* ICB Tag (ECMA 167r3 4/14.6) */ | 476 | /* ICB Tag (ECMA 167r3 4/14.6) */ |
477 | typedef struct { | 477 | struct icbtag { |
478 | __le32 priorRecordedNumDirectEntries; | 478 | __le32 priorRecordedNumDirectEntries; |
479 | __le16 strategyType; | 479 | __le16 strategyType; |
480 | __le16 strategyParameter; | 480 | __le16 strategyParameter; |
481 | __le16 numEntries; | 481 | __le16 numEntries; |
482 | uint8_t reserved; | 482 | uint8_t reserved; |
483 | uint8_t fileType; | 483 | uint8_t fileType; |
484 | lb_addr parentICBLocation; | 484 | struct lb_addr parentICBLocation; |
485 | __le16 flags; | 485 | __le16 flags; |
486 | } __attribute__ ((packed)) icbtag; | 486 | } __attribute__ ((packed)); |
487 | 487 | ||
488 | /* Strategy Type (ECMA 167r3 4/14.6.2) */ | 488 | /* Strategy Type (ECMA 167r3 4/14.6.2) */ |
489 | #define ICBTAG_STRATEGY_TYPE_UNDEF 0x0000 | 489 | #define ICBTAG_STRATEGY_TYPE_UNDEF 0x0000 |
@@ -528,41 +528,41 @@ typedef struct { | |||
528 | 528 | ||
529 | /* Indirect Entry (ECMA 167r3 4/14.7) */ | 529 | /* Indirect Entry (ECMA 167r3 4/14.7) */ |
530 | struct indirectEntry { | 530 | struct indirectEntry { |
531 | tag descTag; | 531 | struct tag descTag; |
532 | icbtag icbTag; | 532 | struct icbtag icbTag; |
533 | long_ad indirectICB; | 533 | struct long_ad indirectICB; |
534 | } __attribute__ ((packed)); | 534 | } __attribute__ ((packed)); |
535 | 535 | ||
536 | /* Terminal Entry (ECMA 167r3 4/14.8) */ | 536 | /* Terminal Entry (ECMA 167r3 4/14.8) */ |
537 | struct terminalEntry { | 537 | struct terminalEntry { |
538 | tag descTag; | 538 | struct tag descTag; |
539 | icbtag icbTag; | 539 | struct icbtag icbTag; |
540 | } __attribute__ ((packed)); | 540 | } __attribute__ ((packed)); |
541 | 541 | ||
542 | /* File Entry (ECMA 167r3 4/14.9) */ | 542 | /* File Entry (ECMA 167r3 4/14.9) */ |
543 | struct fileEntry { | 543 | struct fileEntry { |
544 | tag descTag; | 544 | struct tag descTag; |
545 | icbtag icbTag; | 545 | struct icbtag icbTag; |
546 | __le32 uid; | 546 | __le32 uid; |
547 | __le32 gid; | 547 | __le32 gid; |
548 | __le32 permissions; | 548 | __le32 permissions; |
549 | __le16 fileLinkCount; | 549 | __le16 fileLinkCount; |
550 | uint8_t recordFormat; | 550 | uint8_t recordFormat; |
551 | uint8_t recordDisplayAttr; | 551 | uint8_t recordDisplayAttr; |
552 | __le32 recordLength; | 552 | __le32 recordLength; |
553 | __le64 informationLength; | 553 | __le64 informationLength; |
554 | __le64 logicalBlocksRecorded; | 554 | __le64 logicalBlocksRecorded; |
555 | timestamp accessTime; | 555 | struct timestamp accessTime; |
556 | timestamp modificationTime; | 556 | struct timestamp modificationTime; |
557 | timestamp attrTime; | 557 | struct timestamp attrTime; |
558 | __le32 checkpoint; | 558 | __le32 checkpoint; |
559 | long_ad extendedAttrICB; | 559 | struct long_ad extendedAttrICB; |
560 | regid impIdent; | 560 | struct regid impIdent; |
561 | __le64 uniqueID; | 561 | __le64 uniqueID; |
562 | __le32 lengthExtendedAttr; | 562 | __le32 lengthExtendedAttr; |
563 | __le32 lengthAllocDescs; | 563 | __le32 lengthAllocDescs; |
564 | uint8_t extendedAttr[0]; | 564 | uint8_t extendedAttr[0]; |
565 | uint8_t allocDescs[0]; | 565 | uint8_t allocDescs[0]; |
566 | } __attribute__ ((packed)); | 566 | } __attribute__ ((packed)); |
567 | 567 | ||
568 | /* Permissions (ECMA 167r3 4/14.9.5) */ | 568 | /* Permissions (ECMA 167r3 4/14.9.5) */ |
@@ -604,7 +604,7 @@ struct fileEntry { | |||
604 | 604 | ||
605 | /* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */ | 605 | /* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */ |
606 | struct extendedAttrHeaderDesc { | 606 | struct extendedAttrHeaderDesc { |
607 | tag descTag; | 607 | struct tag descTag; |
608 | __le32 impAttrLocation; | 608 | __le32 impAttrLocation; |
609 | __le32 appAttrLocation; | 609 | __le32 appAttrLocation; |
610 | } __attribute__ ((packed)); | 610 | } __attribute__ ((packed)); |
@@ -687,7 +687,7 @@ struct impUseExtAttr { | |||
687 | uint8_t reserved[3]; | 687 | uint8_t reserved[3]; |
688 | __le32 attrLength; | 688 | __le32 attrLength; |
689 | __le32 impUseLength; | 689 | __le32 impUseLength; |
690 | regid impIdent; | 690 | struct regid impIdent; |
691 | uint8_t impUse[0]; | 691 | uint8_t impUse[0]; |
692 | } __attribute__ ((packed)); | 692 | } __attribute__ ((packed)); |
693 | 693 | ||
@@ -698,7 +698,7 @@ struct appUseExtAttr { | |||
698 | uint8_t reserved[3]; | 698 | uint8_t reserved[3]; |
699 | __le32 attrLength; | 699 | __le32 attrLength; |
700 | __le32 appUseLength; | 700 | __le32 appUseLength; |
701 | regid appIdent; | 701 | struct regid appIdent; |
702 | uint8_t appUse[0]; | 702 | uint8_t appUse[0]; |
703 | } __attribute__ ((packed)); | 703 | } __attribute__ ((packed)); |
704 | 704 | ||
@@ -712,15 +712,15 @@ struct appUseExtAttr { | |||
712 | 712 | ||
713 | /* Unallocated Space Entry (ECMA 167r3 4/14.11) */ | 713 | /* Unallocated Space Entry (ECMA 167r3 4/14.11) */ |
714 | struct unallocSpaceEntry { | 714 | struct unallocSpaceEntry { |
715 | tag descTag; | 715 | struct tag descTag; |
716 | icbtag icbTag; | 716 | struct icbtag icbTag; |
717 | __le32 lengthAllocDescs; | 717 | __le32 lengthAllocDescs; |
718 | uint8_t allocDescs[0]; | 718 | uint8_t allocDescs[0]; |
719 | } __attribute__ ((packed)); | 719 | } __attribute__ ((packed)); |
720 | 720 | ||
721 | /* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */ | 721 | /* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */ |
722 | struct spaceBitmapDesc { | 722 | struct spaceBitmapDesc { |
723 | tag descTag; | 723 | struct tag descTag; |
724 | __le32 numOfBits; | 724 | __le32 numOfBits; |
725 | __le32 numOfBytes; | 725 | __le32 numOfBytes; |
726 | uint8_t bitmap[0]; | 726 | uint8_t bitmap[0]; |
@@ -728,13 +728,13 @@ struct spaceBitmapDesc { | |||
728 | 728 | ||
729 | /* Partition Integrity Entry (ECMA 167r3 4/14.13) */ | 729 | /* Partition Integrity Entry (ECMA 167r3 4/14.13) */ |
730 | struct partitionIntegrityEntry { | 730 | struct partitionIntegrityEntry { |
731 | tag descTag; | 731 | struct tag descTag; |
732 | icbtag icbTag; | 732 | struct icbtag icbTag; |
733 | timestamp recordingDateAndTime; | 733 | struct timestamp recordingDateAndTime; |
734 | uint8_t integrityType; | 734 | uint8_t integrityType; |
735 | uint8_t reserved[175]; | 735 | uint8_t reserved[175]; |
736 | regid impIdent; | 736 | struct regid impIdent; |
737 | uint8_t impUse[256]; | 737 | uint8_t impUse[256]; |
738 | } __attribute__ ((packed)); | 738 | } __attribute__ ((packed)); |
739 | 739 | ||
740 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ | 740 | /* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */ |
@@ -765,32 +765,32 @@ struct pathComponent { | |||
765 | 765 | ||
766 | /* File Entry (ECMA 167r3 4/14.17) */ | 766 | /* File Entry (ECMA 167r3 4/14.17) */ |
767 | struct extendedFileEntry { | 767 | struct extendedFileEntry { |
768 | tag descTag; | 768 | struct tag descTag; |
769 | icbtag icbTag; | 769 | struct icbtag icbTag; |
770 | __le32 uid; | 770 | __le32 uid; |
771 | __le32 gid; | 771 | __le32 gid; |
772 | __le32 permissions; | 772 | __le32 permissions; |
773 | __le16 fileLinkCount; | 773 | __le16 fileLinkCount; |
774 | uint8_t recordFormat; | 774 | uint8_t recordFormat; |
775 | uint8_t recordDisplayAttr; | 775 | uint8_t recordDisplayAttr; |
776 | __le32 recordLength; | 776 | __le32 recordLength; |
777 | __le64 informationLength; | 777 | __le64 informationLength; |
778 | __le64 objectSize; | 778 | __le64 objectSize; |
779 | __le64 logicalBlocksRecorded; | 779 | __le64 logicalBlocksRecorded; |
780 | timestamp accessTime; | 780 | struct timestamp accessTime; |
781 | timestamp modificationTime; | 781 | struct timestamp modificationTime; |
782 | timestamp createTime; | 782 | struct timestamp createTime; |
783 | timestamp attrTime; | 783 | struct timestamp attrTime; |
784 | __le32 checkpoint; | 784 | __le32 checkpoint; |
785 | __le32 reserved; | 785 | __le32 reserved; |
786 | long_ad extendedAttrICB; | 786 | struct long_ad extendedAttrICB; |
787 | long_ad streamDirectoryICB; | 787 | struct long_ad streamDirectoryICB; |
788 | regid impIdent; | 788 | struct regid impIdent; |
789 | __le64 uniqueID; | 789 | __le64 uniqueID; |
790 | __le32 lengthExtendedAttr; | 790 | __le32 lengthExtendedAttr; |
791 | __le32 lengthAllocDescs; | 791 | __le32 lengthAllocDescs; |
792 | uint8_t extendedAttr[0]; | 792 | uint8_t extendedAttr[0]; |
793 | uint8_t allocDescs[0]; | 793 | uint8_t allocDescs[0]; |
794 | } __attribute__ ((packed)); | 794 | } __attribute__ ((packed)); |
795 | 795 | ||
796 | #endif /* _ECMA_167_H */ | 796 | #endif /* _ECMA_167_H */ |
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 47dbe5613f90..c10fa39f97e2 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
@@ -49,12 +49,11 @@ void udf_free_inode(struct inode *inode) | |||
49 | le32_add_cpu(&lvidiu->numDirs, -1); | 49 | le32_add_cpu(&lvidiu->numDirs, -1); |
50 | else | 50 | else |
51 | le32_add_cpu(&lvidiu->numFiles, -1); | 51 | le32_add_cpu(&lvidiu->numFiles, -1); |
52 | 52 | udf_updated_lvid(sb); | |
53 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
54 | } | 53 | } |
55 | mutex_unlock(&sbi->s_alloc_mutex); | 54 | mutex_unlock(&sbi->s_alloc_mutex); |
56 | 55 | ||
57 | udf_free_blocks(sb, NULL, UDF_I(inode)->i_location, 0, 1); | 56 | udf_free_blocks(sb, NULL, &UDF_I(inode)->i_location, 0, 1); |
58 | } | 57 | } |
59 | 58 | ||
60 | struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | 59 | struct inode *udf_new_inode(struct inode *dir, int mode, int *err) |
@@ -122,7 +121,7 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
122 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) | 121 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) |
123 | uniqueID += 16; | 122 | uniqueID += 16; |
124 | lvhd->uniqueID = cpu_to_le64(uniqueID); | 123 | lvhd->uniqueID = cpu_to_le64(uniqueID); |
125 | mark_buffer_dirty(sbi->s_lvid_bh); | 124 | udf_updated_lvid(sb); |
126 | } | 125 | } |
127 | mutex_unlock(&sbi->s_alloc_mutex); | 126 | mutex_unlock(&sbi->s_alloc_mutex); |
128 | inode->i_mode = mode; | 127 | inode->i_mode = mode; |
@@ -138,7 +137,7 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
138 | iinfo->i_location.logicalBlockNum = block; | 137 | iinfo->i_location.logicalBlockNum = block; |
139 | iinfo->i_location.partitionReferenceNum = | 138 | iinfo->i_location.partitionReferenceNum = |
140 | dinfo->i_location.partitionReferenceNum; | 139 | dinfo->i_location.partitionReferenceNum; |
141 | inode->i_ino = udf_get_lb_pblock(sb, iinfo->i_location, 0); | 140 | inode->i_ino = udf_get_lb_pblock(sb, &iinfo->i_location, 0); |
142 | inode->i_blocks = 0; | 141 | inode->i_blocks = 0; |
143 | iinfo->i_lenEAttr = 0; | 142 | iinfo->i_lenEAttr = 0; |
144 | iinfo->i_lenAlloc = 0; | 143 | iinfo->i_lenAlloc = 0; |
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 | ||
diff --git a/fs/udf/misc.c b/fs/udf/misc.c index 84bf0fd4a4f1..9215700c00a4 100644 --- a/fs/udf/misc.c +++ b/fs/udf/misc.c | |||
@@ -134,10 +134,10 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size, | |||
134 | } | 134 | } |
135 | } | 135 | } |
136 | /* rewrite CRC + checksum of eahd */ | 136 | /* rewrite CRC + checksum of eahd */ |
137 | crclen = sizeof(struct extendedAttrHeaderDesc) - sizeof(tag); | 137 | crclen = sizeof(struct extendedAttrHeaderDesc) - sizeof(struct tag); |
138 | eahd->descTag.descCRCLength = cpu_to_le16(crclen); | 138 | eahd->descTag.descCRCLength = cpu_to_le16(crclen); |
139 | eahd->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)eahd + | 139 | eahd->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)eahd + |
140 | sizeof(tag), crclen)); | 140 | sizeof(struct tag), crclen)); |
141 | eahd->descTag.tagChecksum = udf_tag_checksum(&eahd->descTag); | 141 | eahd->descTag.tagChecksum = udf_tag_checksum(&eahd->descTag); |
142 | iinfo->i_lenEAttr += size; | 142 | iinfo->i_lenEAttr += size; |
143 | return (struct genericFormat *)&ea[offset]; | 143 | return (struct genericFormat *)&ea[offset]; |
@@ -202,7 +202,7 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type, | |||
202 | struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | 202 | struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, |
203 | uint32_t location, uint16_t *ident) | 203 | uint32_t location, uint16_t *ident) |
204 | { | 204 | { |
205 | tag *tag_p; | 205 | struct tag *tag_p; |
206 | struct buffer_head *bh = NULL; | 206 | struct buffer_head *bh = NULL; |
207 | 207 | ||
208 | /* Read the block */ | 208 | /* Read the block */ |
@@ -216,7 +216,7 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | |||
216 | return NULL; | 216 | return NULL; |
217 | } | 217 | } |
218 | 218 | ||
219 | tag_p = (tag *)(bh->b_data); | 219 | tag_p = (struct tag *)(bh->b_data); |
220 | 220 | ||
221 | *ident = le16_to_cpu(tag_p->tagIdent); | 221 | *ident = le16_to_cpu(tag_p->tagIdent); |
222 | 222 | ||
@@ -241,9 +241,9 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | |||
241 | } | 241 | } |
242 | 242 | ||
243 | /* Verify the descriptor CRC */ | 243 | /* Verify the descriptor CRC */ |
244 | if (le16_to_cpu(tag_p->descCRCLength) + sizeof(tag) > sb->s_blocksize || | 244 | if (le16_to_cpu(tag_p->descCRCLength) + sizeof(struct tag) > sb->s_blocksize || |
245 | le16_to_cpu(tag_p->descCRC) == crc_itu_t(0, | 245 | le16_to_cpu(tag_p->descCRC) == crc_itu_t(0, |
246 | bh->b_data + sizeof(tag), | 246 | bh->b_data + sizeof(struct tag), |
247 | le16_to_cpu(tag_p->descCRCLength))) | 247 | le16_to_cpu(tag_p->descCRCLength))) |
248 | return bh; | 248 | return bh; |
249 | 249 | ||
@@ -255,27 +255,28 @@ error_out: | |||
255 | return NULL; | 255 | return NULL; |
256 | } | 256 | } |
257 | 257 | ||
258 | struct buffer_head *udf_read_ptagged(struct super_block *sb, kernel_lb_addr loc, | 258 | struct buffer_head *udf_read_ptagged(struct super_block *sb, |
259 | struct kernel_lb_addr *loc, | ||
259 | uint32_t offset, uint16_t *ident) | 260 | uint32_t offset, uint16_t *ident) |
260 | { | 261 | { |
261 | return udf_read_tagged(sb, udf_get_lb_pblock(sb, loc, offset), | 262 | return udf_read_tagged(sb, udf_get_lb_pblock(sb, loc, offset), |
262 | loc.logicalBlockNum + offset, ident); | 263 | loc->logicalBlockNum + offset, ident); |
263 | } | 264 | } |
264 | 265 | ||
265 | void udf_update_tag(char *data, int length) | 266 | void udf_update_tag(char *data, int length) |
266 | { | 267 | { |
267 | tag *tptr = (tag *)data; | 268 | struct tag *tptr = (struct tag *)data; |
268 | length -= sizeof(tag); | 269 | length -= sizeof(struct tag); |
269 | 270 | ||
270 | tptr->descCRCLength = cpu_to_le16(length); | 271 | tptr->descCRCLength = cpu_to_le16(length); |
271 | tptr->descCRC = cpu_to_le16(crc_itu_t(0, data + sizeof(tag), length)); | 272 | tptr->descCRC = cpu_to_le16(crc_itu_t(0, data + sizeof(struct tag), length)); |
272 | tptr->tagChecksum = udf_tag_checksum(tptr); | 273 | tptr->tagChecksum = udf_tag_checksum(tptr); |
273 | } | 274 | } |
274 | 275 | ||
275 | void udf_new_tag(char *data, uint16_t ident, uint16_t version, uint16_t snum, | 276 | void udf_new_tag(char *data, uint16_t ident, uint16_t version, uint16_t snum, |
276 | uint32_t loc, int length) | 277 | uint32_t loc, int length) |
277 | { | 278 | { |
278 | tag *tptr = (tag *)data; | 279 | struct tag *tptr = (struct tag *)data; |
279 | tptr->tagIdent = cpu_to_le16(ident); | 280 | tptr->tagIdent = cpu_to_le16(ident); |
280 | tptr->descVersion = cpu_to_le16(version); | 281 | tptr->descVersion = cpu_to_le16(version); |
281 | tptr->tagSerialNum = cpu_to_le16(snum); | 282 | tptr->tagSerialNum = cpu_to_le16(snum); |
@@ -283,12 +284,12 @@ void udf_new_tag(char *data, uint16_t ident, uint16_t version, uint16_t snum, | |||
283 | udf_update_tag(data, length); | 284 | udf_update_tag(data, length); |
284 | } | 285 | } |
285 | 286 | ||
286 | u8 udf_tag_checksum(const tag *t) | 287 | u8 udf_tag_checksum(const struct tag *t) |
287 | { | 288 | { |
288 | u8 *data = (u8 *)t; | 289 | u8 *data = (u8 *)t; |
289 | u8 checksum = 0; | 290 | u8 checksum = 0; |
290 | int i; | 291 | int i; |
291 | for (i = 0; i < sizeof(tag); ++i) | 292 | for (i = 0; i < sizeof(struct tag); ++i) |
292 | if (i != 4) /* position of checksum */ | 293 | if (i != 4) /* position of checksum */ |
293 | checksum += data[i]; | 294 | checksum += data[i]; |
294 | return checksum; | 295 | return checksum; |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index f84bfaa8d941..6a29fa34c478 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -47,7 +47,7 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi, | |||
47 | struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh, | 47 | struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh, |
48 | uint8_t *impuse, uint8_t *fileident) | 48 | uint8_t *impuse, uint8_t *fileident) |
49 | { | 49 | { |
50 | uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(tag); | 50 | uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(struct tag); |
51 | uint16_t crc; | 51 | uint16_t crc; |
52 | int offset; | 52 | int offset; |
53 | uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse); | 53 | uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse); |
@@ -99,18 +99,18 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi, | |||
99 | memset(fibh->ebh->b_data, 0x00, padlen + offset); | 99 | memset(fibh->ebh->b_data, 0x00, padlen + offset); |
100 | } | 100 | } |
101 | 101 | ||
102 | crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(tag), | 102 | crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(struct tag), |
103 | sizeof(struct fileIdentDesc) - sizeof(tag)); | 103 | sizeof(struct fileIdentDesc) - sizeof(struct tag)); |
104 | 104 | ||
105 | if (fibh->sbh == fibh->ebh) { | 105 | if (fibh->sbh == fibh->ebh) { |
106 | crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, | 106 | crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, |
107 | crclen + sizeof(tag) - | 107 | crclen + sizeof(struct tag) - |
108 | sizeof(struct fileIdentDesc)); | 108 | sizeof(struct fileIdentDesc)); |
109 | } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) { | 109 | } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) { |
110 | crc = crc_itu_t(crc, fibh->ebh->b_data + | 110 | crc = crc_itu_t(crc, fibh->ebh->b_data + |
111 | sizeof(struct fileIdentDesc) + | 111 | sizeof(struct fileIdentDesc) + |
112 | fibh->soffset, | 112 | fibh->soffset, |
113 | crclen + sizeof(tag) - | 113 | crclen + sizeof(struct tag) - |
114 | sizeof(struct fileIdentDesc)); | 114 | sizeof(struct fileIdentDesc)); |
115 | } else { | 115 | } else { |
116 | crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, | 116 | crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, |
@@ -154,7 +154,7 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir, | |||
154 | uint8_t lfi; | 154 | uint8_t lfi; |
155 | uint16_t liu; | 155 | uint16_t liu; |
156 | loff_t size; | 156 | loff_t size; |
157 | kernel_lb_addr eloc; | 157 | struct kernel_lb_addr eloc; |
158 | uint32_t elen; | 158 | uint32_t elen; |
159 | sector_t offset; | 159 | sector_t offset; |
160 | struct extent_position epos = {}; | 160 | struct extent_position epos = {}; |
@@ -171,12 +171,12 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir, | |||
171 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, | 171 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, |
172 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) | 172 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) |
173 | goto out_err; | 173 | goto out_err; |
174 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 174 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); |
175 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 175 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
176 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 176 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
177 | epos.offset -= sizeof(short_ad); | 177 | epos.offset -= sizeof(struct short_ad); |
178 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 178 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
179 | epos.offset -= sizeof(long_ad); | 179 | epos.offset -= sizeof(struct long_ad); |
180 | } else | 180 | } else |
181 | offset = 0; | 181 | offset = 0; |
182 | 182 | ||
@@ -268,7 +268,7 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | |||
268 | #ifdef UDF_RECOVERY | 268 | #ifdef UDF_RECOVERY |
269 | /* temporary shorthand for specifying files by inode number */ | 269 | /* temporary shorthand for specifying files by inode number */ |
270 | if (!strncmp(dentry->d_name.name, ".B=", 3)) { | 270 | if (!strncmp(dentry->d_name.name, ".B=", 3)) { |
271 | kernel_lb_addr lb = { | 271 | struct kernel_lb_addr lb = { |
272 | .logicalBlockNum = 0, | 272 | .logicalBlockNum = 0, |
273 | .partitionReferenceNum = | 273 | .partitionReferenceNum = |
274 | simple_strtoul(dentry->d_name.name + 3, | 274 | simple_strtoul(dentry->d_name.name + 3, |
@@ -283,11 +283,14 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, | |||
283 | #endif /* UDF_RECOVERY */ | 283 | #endif /* UDF_RECOVERY */ |
284 | 284 | ||
285 | if (udf_find_entry(dir, &dentry->d_name, &fibh, &cfi)) { | 285 | if (udf_find_entry(dir, &dentry->d_name, &fibh, &cfi)) { |
286 | struct kernel_lb_addr loc; | ||
287 | |||
286 | if (fibh.sbh != fibh.ebh) | 288 | if (fibh.sbh != fibh.ebh) |
287 | brelse(fibh.ebh); | 289 | brelse(fibh.ebh); |
288 | brelse(fibh.sbh); | 290 | brelse(fibh.sbh); |
289 | 291 | ||
290 | inode = udf_iget(dir->i_sb, lelb_to_cpu(cfi.icb.extLocation)); | 292 | loc = lelb_to_cpu(cfi.icb.extLocation); |
293 | inode = udf_iget(dir->i_sb, &loc); | ||
291 | if (!inode) { | 294 | if (!inode) { |
292 | unlock_kernel(); | 295 | unlock_kernel(); |
293 | return ERR_PTR(-EACCES); | 296 | return ERR_PTR(-EACCES); |
@@ -313,7 +316,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
313 | uint8_t lfi; | 316 | uint8_t lfi; |
314 | uint16_t liu; | 317 | uint16_t liu; |
315 | int block; | 318 | int block; |
316 | kernel_lb_addr eloc; | 319 | struct kernel_lb_addr eloc; |
317 | uint32_t elen = 0; | 320 | uint32_t elen = 0; |
318 | sector_t offset; | 321 | sector_t offset; |
319 | struct extent_position epos = {}; | 322 | struct extent_position epos = {}; |
@@ -351,16 +354,16 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
351 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, | 354 | if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, |
352 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { | 355 | &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { |
353 | block = udf_get_lb_pblock(dir->i_sb, | 356 | block = udf_get_lb_pblock(dir->i_sb, |
354 | dinfo->i_location, 0); | 357 | &dinfo->i_location, 0); |
355 | fibh->soffset = fibh->eoffset = sb->s_blocksize; | 358 | fibh->soffset = fibh->eoffset = sb->s_blocksize; |
356 | goto add; | 359 | goto add; |
357 | } | 360 | } |
358 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 361 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); |
359 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 362 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
360 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 363 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
361 | epos.offset -= sizeof(short_ad); | 364 | epos.offset -= sizeof(struct short_ad); |
362 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 365 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
363 | epos.offset -= sizeof(long_ad); | 366 | epos.offset -= sizeof(struct long_ad); |
364 | } else | 367 | } else |
365 | offset = 0; | 368 | offset = 0; |
366 | 369 | ||
@@ -409,10 +412,10 @@ add: | |||
409 | if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && elen) { | 412 | if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB && elen) { |
410 | elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1); | 413 | elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1); |
411 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 414 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
412 | epos.offset -= sizeof(short_ad); | 415 | epos.offset -= sizeof(struct short_ad); |
413 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 416 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
414 | epos.offset -= sizeof(long_ad); | 417 | epos.offset -= sizeof(struct long_ad); |
415 | udf_write_aext(dir, &epos, eloc, elen, 1); | 418 | udf_write_aext(dir, &epos, &eloc, elen, 1); |
416 | } | 419 | } |
417 | f_pos += nfidlen; | 420 | f_pos += nfidlen; |
418 | 421 | ||
@@ -494,10 +497,10 @@ add: | |||
494 | memset(cfi, 0, sizeof(struct fileIdentDesc)); | 497 | memset(cfi, 0, sizeof(struct fileIdentDesc)); |
495 | if (UDF_SB(sb)->s_udfrev >= 0x0200) | 498 | if (UDF_SB(sb)->s_udfrev >= 0x0200) |
496 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, | 499 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, |
497 | sizeof(tag)); | 500 | sizeof(struct tag)); |
498 | else | 501 | else |
499 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, | 502 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, |
500 | sizeof(tag)); | 503 | sizeof(struct tag)); |
501 | cfi->fileVersionNum = cpu_to_le16(1); | 504 | cfi->fileVersionNum = cpu_to_le16(1); |
502 | cfi->lengthFileIdent = namelen; | 505 | cfi->lengthFileIdent = namelen; |
503 | cfi->lengthOfImpUse = cpu_to_le16(0); | 506 | cfi->lengthOfImpUse = cpu_to_le16(0); |
@@ -530,7 +533,7 @@ static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, | |||
530 | cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED; | 533 | cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED; |
531 | 534 | ||
532 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) | 535 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) |
533 | memset(&(cfi->icb), 0x00, sizeof(long_ad)); | 536 | memset(&(cfi->icb), 0x00, sizeof(struct long_ad)); |
534 | 537 | ||
535 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); | 538 | return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); |
536 | } | 539 | } |
@@ -710,7 +713,7 @@ static int empty_dir(struct inode *dir) | |||
710 | loff_t f_pos; | 713 | loff_t f_pos; |
711 | loff_t size = udf_ext0_offset(dir) + dir->i_size; | 714 | loff_t size = udf_ext0_offset(dir) + dir->i_size; |
712 | int block; | 715 | int block; |
713 | kernel_lb_addr eloc; | 716 | struct kernel_lb_addr eloc; |
714 | uint32_t elen; | 717 | uint32_t elen; |
715 | sector_t offset; | 718 | sector_t offset; |
716 | struct extent_position epos = {}; | 719 | struct extent_position epos = {}; |
@@ -724,12 +727,12 @@ static int empty_dir(struct inode *dir) | |||
724 | else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, | 727 | else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, |
725 | &epos, &eloc, &elen, &offset) == | 728 | &epos, &eloc, &elen, &offset) == |
726 | (EXT_RECORDED_ALLOCATED >> 30)) { | 729 | (EXT_RECORDED_ALLOCATED >> 30)) { |
727 | block = udf_get_lb_pblock(dir->i_sb, eloc, offset); | 730 | block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); |
728 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { | 731 | if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { |
729 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 732 | if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
730 | epos.offset -= sizeof(short_ad); | 733 | epos.offset -= sizeof(struct short_ad); |
731 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 734 | else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
732 | epos.offset -= sizeof(long_ad); | 735 | epos.offset -= sizeof(struct long_ad); |
733 | } else | 736 | } else |
734 | offset = 0; | 737 | offset = 0; |
735 | 738 | ||
@@ -778,7 +781,7 @@ static int udf_rmdir(struct inode *dir, struct dentry *dentry) | |||
778 | struct inode *inode = dentry->d_inode; | 781 | struct inode *inode = dentry->d_inode; |
779 | struct udf_fileident_bh fibh; | 782 | struct udf_fileident_bh fibh; |
780 | struct fileIdentDesc *fi, cfi; | 783 | struct fileIdentDesc *fi, cfi; |
781 | kernel_lb_addr tloc; | 784 | struct kernel_lb_addr tloc; |
782 | 785 | ||
783 | retval = -ENOENT; | 786 | retval = -ENOENT; |
784 | lock_kernel(); | 787 | lock_kernel(); |
@@ -788,7 +791,7 @@ static int udf_rmdir(struct inode *dir, struct dentry *dentry) | |||
788 | 791 | ||
789 | retval = -EIO; | 792 | retval = -EIO; |
790 | tloc = lelb_to_cpu(cfi.icb.extLocation); | 793 | tloc = lelb_to_cpu(cfi.icb.extLocation); |
791 | if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino) | 794 | if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) |
792 | goto end_rmdir; | 795 | goto end_rmdir; |
793 | retval = -ENOTEMPTY; | 796 | retval = -ENOTEMPTY; |
794 | if (!empty_dir(inode)) | 797 | if (!empty_dir(inode)) |
@@ -824,7 +827,7 @@ static int udf_unlink(struct inode *dir, struct dentry *dentry) | |||
824 | struct udf_fileident_bh fibh; | 827 | struct udf_fileident_bh fibh; |
825 | struct fileIdentDesc *fi; | 828 | struct fileIdentDesc *fi; |
826 | struct fileIdentDesc cfi; | 829 | struct fileIdentDesc cfi; |
827 | kernel_lb_addr tloc; | 830 | struct kernel_lb_addr tloc; |
828 | 831 | ||
829 | retval = -ENOENT; | 832 | retval = -ENOENT; |
830 | lock_kernel(); | 833 | lock_kernel(); |
@@ -834,7 +837,7 @@ static int udf_unlink(struct inode *dir, struct dentry *dentry) | |||
834 | 837 | ||
835 | retval = -EIO; | 838 | retval = -EIO; |
836 | tloc = lelb_to_cpu(cfi.icb.extLocation); | 839 | tloc = lelb_to_cpu(cfi.icb.extLocation); |
837 | if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino) | 840 | if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) |
838 | goto end_unlink; | 841 | goto end_unlink; |
839 | 842 | ||
840 | if (!inode->i_nlink) { | 843 | if (!inode->i_nlink) { |
@@ -897,7 +900,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
897 | inode->i_op = &page_symlink_inode_operations; | 900 | inode->i_op = &page_symlink_inode_operations; |
898 | 901 | ||
899 | if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { | 902 | if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { |
900 | kernel_lb_addr eloc; | 903 | struct kernel_lb_addr eloc; |
901 | uint32_t bsize; | 904 | uint32_t bsize; |
902 | 905 | ||
903 | block = udf_new_block(inode->i_sb, inode, | 906 | block = udf_new_block(inode->i_sb, inode, |
@@ -913,7 +916,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
913 | iinfo->i_location.partitionReferenceNum; | 916 | iinfo->i_location.partitionReferenceNum; |
914 | bsize = inode->i_sb->s_blocksize; | 917 | bsize = inode->i_sb->s_blocksize; |
915 | iinfo->i_lenExtents = bsize; | 918 | iinfo->i_lenExtents = bsize; |
916 | udf_add_aext(inode, &epos, eloc, bsize, 0); | 919 | udf_add_aext(inode, &epos, &eloc, bsize, 0); |
917 | brelse(epos.bh); | 920 | brelse(epos.bh); |
918 | 921 | ||
919 | block = udf_get_pblock(inode->i_sb, block, | 922 | block = udf_get_pblock(inode->i_sb, block, |
@@ -1108,7 +1111,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1108 | struct fileIdentDesc ocfi, ncfi; | 1111 | struct fileIdentDesc ocfi, ncfi; |
1109 | struct buffer_head *dir_bh = NULL; | 1112 | struct buffer_head *dir_bh = NULL; |
1110 | int retval = -ENOENT; | 1113 | int retval = -ENOENT; |
1111 | kernel_lb_addr tloc; | 1114 | struct kernel_lb_addr tloc; |
1112 | struct udf_inode_info *old_iinfo = UDF_I(old_inode); | 1115 | struct udf_inode_info *old_iinfo = UDF_I(old_inode); |
1113 | 1116 | ||
1114 | lock_kernel(); | 1117 | lock_kernel(); |
@@ -1119,7 +1122,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1119 | brelse(ofibh.sbh); | 1122 | brelse(ofibh.sbh); |
1120 | } | 1123 | } |
1121 | tloc = lelb_to_cpu(ocfi.icb.extLocation); | 1124 | tloc = lelb_to_cpu(ocfi.icb.extLocation); |
1122 | if (!ofi || udf_get_lb_pblock(old_dir->i_sb, tloc, 0) | 1125 | if (!ofi || udf_get_lb_pblock(old_dir->i_sb, &tloc, 0) |
1123 | != old_inode->i_ino) | 1126 | != old_inode->i_ino) |
1124 | goto end_rename; | 1127 | goto end_rename; |
1125 | 1128 | ||
@@ -1158,7 +1161,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1158 | if (!dir_fi) | 1161 | if (!dir_fi) |
1159 | goto end_rename; | 1162 | goto end_rename; |
1160 | tloc = lelb_to_cpu(dir_fi->icb.extLocation); | 1163 | tloc = lelb_to_cpu(dir_fi->icb.extLocation); |
1161 | if (udf_get_lb_pblock(old_inode->i_sb, tloc, 0) != | 1164 | if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) != |
1162 | old_dir->i_ino) | 1165 | old_dir->i_ino) |
1163 | goto end_rename; | 1166 | goto end_rename; |
1164 | 1167 | ||
@@ -1187,7 +1190,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1187 | */ | 1190 | */ |
1188 | ncfi.fileVersionNum = ocfi.fileVersionNum; | 1191 | ncfi.fileVersionNum = ocfi.fileVersionNum; |
1189 | ncfi.fileCharacteristics = ocfi.fileCharacteristics; | 1192 | ncfi.fileCharacteristics = ocfi.fileCharacteristics; |
1190 | memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(long_ad)); | 1193 | memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(struct long_ad)); |
1191 | udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL); | 1194 | udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL); |
1192 | 1195 | ||
1193 | /* The old fid may have moved - find it again */ | 1196 | /* The old fid may have moved - find it again */ |
@@ -1242,6 +1245,7 @@ end_rename: | |||
1242 | 1245 | ||
1243 | static struct dentry *udf_get_parent(struct dentry *child) | 1246 | static struct dentry *udf_get_parent(struct dentry *child) |
1244 | { | 1247 | { |
1248 | struct kernel_lb_addr tloc; | ||
1245 | struct inode *inode = NULL; | 1249 | struct inode *inode = NULL; |
1246 | struct qstr dotdot = {.name = "..", .len = 2}; | 1250 | struct qstr dotdot = {.name = "..", .len = 2}; |
1247 | struct fileIdentDesc cfi; | 1251 | struct fileIdentDesc cfi; |
@@ -1255,8 +1259,8 @@ static struct dentry *udf_get_parent(struct dentry *child) | |||
1255 | brelse(fibh.ebh); | 1259 | brelse(fibh.ebh); |
1256 | brelse(fibh.sbh); | 1260 | brelse(fibh.sbh); |
1257 | 1261 | ||
1258 | inode = udf_iget(child->d_inode->i_sb, | 1262 | tloc = lelb_to_cpu(cfi.icb.extLocation); |
1259 | lelb_to_cpu(cfi.icb.extLocation)); | 1263 | inode = udf_iget(child->d_inode->i_sb, &tloc); |
1260 | if (!inode) | 1264 | if (!inode) |
1261 | goto out_unlock; | 1265 | goto out_unlock; |
1262 | unlock_kernel(); | 1266 | unlock_kernel(); |
@@ -1272,14 +1276,14 @@ static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block, | |||
1272 | u16 partref, __u32 generation) | 1276 | u16 partref, __u32 generation) |
1273 | { | 1277 | { |
1274 | struct inode *inode; | 1278 | struct inode *inode; |
1275 | kernel_lb_addr loc; | 1279 | struct kernel_lb_addr loc; |
1276 | 1280 | ||
1277 | if (block == 0) | 1281 | if (block == 0) |
1278 | return ERR_PTR(-ESTALE); | 1282 | return ERR_PTR(-ESTALE); |
1279 | 1283 | ||
1280 | loc.logicalBlockNum = block; | 1284 | loc.logicalBlockNum = block; |
1281 | loc.partitionReferenceNum = partref; | 1285 | loc.partitionReferenceNum = partref; |
1282 | inode = udf_iget(sb, loc); | 1286 | inode = udf_iget(sb, &loc); |
1283 | 1287 | ||
1284 | if (inode == NULL) | 1288 | if (inode == NULL) |
1285 | return ERR_PTR(-ENOMEM); | 1289 | return ERR_PTR(-ENOMEM); |
@@ -1318,7 +1322,7 @@ static int udf_encode_fh(struct dentry *de, __u32 *fh, int *lenp, | |||
1318 | { | 1322 | { |
1319 | int len = *lenp; | 1323 | int len = *lenp; |
1320 | struct inode *inode = de->d_inode; | 1324 | struct inode *inode = de->d_inode; |
1321 | kernel_lb_addr location = UDF_I(inode)->i_location; | 1325 | struct kernel_lb_addr location = UDF_I(inode)->i_location; |
1322 | struct fid *fid = (struct fid *)fh; | 1326 | struct fid *fid = (struct fid *)fh; |
1323 | int type = FILEID_UDF_WITHOUT_PARENT; | 1327 | int type = FILEID_UDF_WITHOUT_PARENT; |
1324 | 1328 | ||
diff --git a/fs/udf/osta_udf.h b/fs/udf/osta_udf.h index 65ff47902bd2..fbff74654df2 100644 --- a/fs/udf/osta_udf.h +++ b/fs/udf/osta_udf.h | |||
@@ -85,7 +85,7 @@ struct appIdentSuffix { | |||
85 | /* Logical Volume Integrity Descriptor (UDF 2.50 2.2.6) */ | 85 | /* Logical Volume Integrity Descriptor (UDF 2.50 2.2.6) */ |
86 | /* Implementation Use (UDF 2.50 2.2.6.4) */ | 86 | /* Implementation Use (UDF 2.50 2.2.6.4) */ |
87 | struct logicalVolIntegrityDescImpUse { | 87 | struct logicalVolIntegrityDescImpUse { |
88 | regid impIdent; | 88 | struct regid impIdent; |
89 | __le32 numFiles; | 89 | __le32 numFiles; |
90 | __le32 numDirs; | 90 | __le32 numDirs; |
91 | __le16 minUDFReadRev; | 91 | __le16 minUDFReadRev; |
@@ -97,12 +97,12 @@ struct logicalVolIntegrityDescImpUse { | |||
97 | /* Implementation Use Volume Descriptor (UDF 2.50 2.2.7) */ | 97 | /* Implementation Use Volume Descriptor (UDF 2.50 2.2.7) */ |
98 | /* Implementation Use (UDF 2.50 2.2.7.2) */ | 98 | /* Implementation Use (UDF 2.50 2.2.7.2) */ |
99 | struct impUseVolDescImpUse { | 99 | struct impUseVolDescImpUse { |
100 | charspec LVICharset; | 100 | struct charspec LVICharset; |
101 | dstring logicalVolIdent[128]; | 101 | dstring logicalVolIdent[128]; |
102 | dstring LVInfo1[36]; | 102 | dstring LVInfo1[36]; |
103 | dstring LVInfo2[36]; | 103 | dstring LVInfo2[36]; |
104 | dstring LVInfo3[36]; | 104 | dstring LVInfo3[36]; |
105 | regid impIdent; | 105 | struct regid impIdent; |
106 | uint8_t impUse[128]; | 106 | uint8_t impUse[128]; |
107 | } __attribute__ ((packed)); | 107 | } __attribute__ ((packed)); |
108 | 108 | ||
@@ -110,7 +110,7 @@ struct udfPartitionMap2 { | |||
110 | uint8_t partitionMapType; | 110 | uint8_t partitionMapType; |
111 | uint8_t partitionMapLength; | 111 | uint8_t partitionMapLength; |
112 | uint8_t reserved1[2]; | 112 | uint8_t reserved1[2]; |
113 | regid partIdent; | 113 | struct regid partIdent; |
114 | __le16 volSeqNum; | 114 | __le16 volSeqNum; |
115 | __le16 partitionNum; | 115 | __le16 partitionNum; |
116 | } __attribute__ ((packed)); | 116 | } __attribute__ ((packed)); |
@@ -120,7 +120,7 @@ struct virtualPartitionMap { | |||
120 | uint8_t partitionMapType; | 120 | uint8_t partitionMapType; |
121 | uint8_t partitionMapLength; | 121 | uint8_t partitionMapLength; |
122 | uint8_t reserved1[2]; | 122 | uint8_t reserved1[2]; |
123 | regid partIdent; | 123 | struct regid partIdent; |
124 | __le16 volSeqNum; | 124 | __le16 volSeqNum; |
125 | __le16 partitionNum; | 125 | __le16 partitionNum; |
126 | uint8_t reserved2[24]; | 126 | uint8_t reserved2[24]; |
@@ -131,7 +131,7 @@ struct sparablePartitionMap { | |||
131 | uint8_t partitionMapType; | 131 | uint8_t partitionMapType; |
132 | uint8_t partitionMapLength; | 132 | uint8_t partitionMapLength; |
133 | uint8_t reserved1[2]; | 133 | uint8_t reserved1[2]; |
134 | regid partIdent; | 134 | struct regid partIdent; |
135 | __le16 volSeqNum; | 135 | __le16 volSeqNum; |
136 | __le16 partitionNum; | 136 | __le16 partitionNum; |
137 | __le16 packetLength; | 137 | __le16 packetLength; |
@@ -146,7 +146,7 @@ struct metadataPartitionMap { | |||
146 | uint8_t partitionMapType; | 146 | uint8_t partitionMapType; |
147 | uint8_t partitionMapLength; | 147 | uint8_t partitionMapLength; |
148 | uint8_t reserved1[2]; | 148 | uint8_t reserved1[2]; |
149 | regid partIdent; | 149 | struct regid partIdent; |
150 | __le16 volSeqNum; | 150 | __le16 volSeqNum; |
151 | __le16 partitionNum; | 151 | __le16 partitionNum; |
152 | __le32 metadataFileLoc; | 152 | __le32 metadataFileLoc; |
@@ -161,7 +161,7 @@ struct metadataPartitionMap { | |||
161 | /* Virtual Allocation Table (UDF 1.5 2.2.10) */ | 161 | /* Virtual Allocation Table (UDF 1.5 2.2.10) */ |
162 | struct virtualAllocationTable15 { | 162 | struct virtualAllocationTable15 { |
163 | __le32 VirtualSector[0]; | 163 | __le32 VirtualSector[0]; |
164 | regid vatIdent; | 164 | struct regid vatIdent; |
165 | __le32 previousVATICBLoc; | 165 | __le32 previousVATICBLoc; |
166 | } __attribute__ ((packed)); | 166 | } __attribute__ ((packed)); |
167 | 167 | ||
@@ -192,8 +192,8 @@ struct sparingEntry { | |||
192 | } __attribute__ ((packed)); | 192 | } __attribute__ ((packed)); |
193 | 193 | ||
194 | struct sparingTable { | 194 | struct sparingTable { |
195 | tag descTag; | 195 | struct tag descTag; |
196 | regid sparingIdent; | 196 | struct regid sparingIdent; |
197 | __le16 reallocationTableLen; | 197 | __le16 reallocationTableLen; |
198 | __le16 reserved; | 198 | __le16 reserved; |
199 | __le32 sequenceNum; | 199 | __le32 sequenceNum; |
@@ -206,7 +206,7 @@ struct sparingTable { | |||
206 | #define ICBTAG_FILE_TYPE_MIRROR 0xFB | 206 | #define ICBTAG_FILE_TYPE_MIRROR 0xFB |
207 | #define ICBTAG_FILE_TYPE_BITMAP 0xFC | 207 | #define ICBTAG_FILE_TYPE_BITMAP 0xFC |
208 | 208 | ||
209 | /* struct long_ad ICB - ADImpUse (UDF 2.50 2.2.4.3) */ | 209 | /* struct struct long_ad ICB - ADImpUse (UDF 2.50 2.2.4.3) */ |
210 | struct allocDescImpUse { | 210 | struct allocDescImpUse { |
211 | __le16 flags; | 211 | __le16 flags; |
212 | uint8_t impUse[4]; | 212 | uint8_t impUse[4]; |
diff --git a/fs/udf/partition.c b/fs/udf/partition.c index 96dfd207c3d6..4b540ee632d5 100644 --- a/fs/udf/partition.c +++ b/fs/udf/partition.c | |||
@@ -273,7 +273,7 @@ static uint32_t udf_try_read_meta(struct inode *inode, uint32_t block, | |||
273 | { | 273 | { |
274 | struct super_block *sb = inode->i_sb; | 274 | struct super_block *sb = inode->i_sb; |
275 | struct udf_part_map *map; | 275 | struct udf_part_map *map; |
276 | kernel_lb_addr eloc; | 276 | struct kernel_lb_addr eloc; |
277 | uint32_t elen; | 277 | uint32_t elen; |
278 | sector_t ext_offset; | 278 | sector_t ext_offset; |
279 | struct extent_position epos = {}; | 279 | struct extent_position epos = {}; |
diff --git a/fs/udf/super.c b/fs/udf/super.c index e25e7010627b..72348cc855a4 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -81,16 +81,13 @@ static char error_buf[1024]; | |||
81 | /* These are the "meat" - everything else is stuffing */ | 81 | /* These are the "meat" - everything else is stuffing */ |
82 | static int udf_fill_super(struct super_block *, void *, int); | 82 | static int udf_fill_super(struct super_block *, void *, int); |
83 | static void udf_put_super(struct super_block *); | 83 | static void udf_put_super(struct super_block *); |
84 | static void udf_write_super(struct super_block *); | 84 | static int udf_sync_fs(struct super_block *, int); |
85 | static int udf_remount_fs(struct super_block *, int *, char *); | 85 | static int udf_remount_fs(struct super_block *, int *, char *); |
86 | static int udf_check_valid(struct super_block *, int, int); | 86 | static void udf_load_logicalvolint(struct super_block *, struct kernel_extent_ad); |
87 | static int udf_vrs(struct super_block *sb, int silent); | 87 | static int udf_find_fileset(struct super_block *, struct kernel_lb_addr *, |
88 | static void udf_load_logicalvolint(struct super_block *, kernel_extent_ad); | 88 | struct kernel_lb_addr *); |
89 | static void udf_find_anchor(struct super_block *); | ||
90 | static int udf_find_fileset(struct super_block *, kernel_lb_addr *, | ||
91 | kernel_lb_addr *); | ||
92 | static void udf_load_fileset(struct super_block *, struct buffer_head *, | 89 | static void udf_load_fileset(struct super_block *, struct buffer_head *, |
93 | kernel_lb_addr *); | 90 | struct kernel_lb_addr *); |
94 | static void udf_open_lvid(struct super_block *); | 91 | static void udf_open_lvid(struct super_block *); |
95 | static void udf_close_lvid(struct super_block *); | 92 | static void udf_close_lvid(struct super_block *); |
96 | static unsigned int udf_count_free(struct super_block *); | 93 | static unsigned int udf_count_free(struct super_block *); |
@@ -181,7 +178,7 @@ static const struct super_operations udf_sb_ops = { | |||
181 | .delete_inode = udf_delete_inode, | 178 | .delete_inode = udf_delete_inode, |
182 | .clear_inode = udf_clear_inode, | 179 | .clear_inode = udf_clear_inode, |
183 | .put_super = udf_put_super, | 180 | .put_super = udf_put_super, |
184 | .write_super = udf_write_super, | 181 | .sync_fs = udf_sync_fs, |
185 | .statfs = udf_statfs, | 182 | .statfs = udf_statfs, |
186 | .remount_fs = udf_remount_fs, | 183 | .remount_fs = udf_remount_fs, |
187 | .show_options = udf_show_options, | 184 | .show_options = udf_show_options, |
@@ -201,6 +198,8 @@ struct udf_options { | |||
201 | mode_t umask; | 198 | mode_t umask; |
202 | gid_t gid; | 199 | gid_t gid; |
203 | uid_t uid; | 200 | uid_t uid; |
201 | mode_t fmode; | ||
202 | mode_t dmode; | ||
204 | struct nls_table *nls_map; | 203 | struct nls_table *nls_map; |
205 | }; | 204 | }; |
206 | 205 | ||
@@ -258,7 +257,7 @@ static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt) | |||
258 | 257 | ||
259 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) | 258 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) |
260 | seq_puts(seq, ",nostrict"); | 259 | seq_puts(seq, ",nostrict"); |
261 | if (sb->s_blocksize != UDF_DEFAULT_BLOCKSIZE) | 260 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_BLOCKSIZE_SET)) |
262 | seq_printf(seq, ",bs=%lu", sb->s_blocksize); | 261 | seq_printf(seq, ",bs=%lu", sb->s_blocksize); |
263 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) | 262 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) |
264 | seq_puts(seq, ",unhide"); | 263 | seq_puts(seq, ",unhide"); |
@@ -282,18 +281,16 @@ static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt) | |||
282 | seq_printf(seq, ",gid=%u", sbi->s_gid); | 281 | seq_printf(seq, ",gid=%u", sbi->s_gid); |
283 | if (sbi->s_umask != 0) | 282 | if (sbi->s_umask != 0) |
284 | seq_printf(seq, ",umask=%o", sbi->s_umask); | 283 | seq_printf(seq, ",umask=%o", sbi->s_umask); |
284 | if (sbi->s_fmode != UDF_INVALID_MODE) | ||
285 | seq_printf(seq, ",mode=%o", sbi->s_fmode); | ||
286 | if (sbi->s_dmode != UDF_INVALID_MODE) | ||
287 | seq_printf(seq, ",dmode=%o", sbi->s_dmode); | ||
285 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET)) | 288 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET)) |
286 | seq_printf(seq, ",session=%u", sbi->s_session); | 289 | seq_printf(seq, ",session=%u", sbi->s_session); |
287 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET)) | 290 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET)) |
288 | seq_printf(seq, ",lastblock=%u", sbi->s_last_block); | 291 | seq_printf(seq, ",lastblock=%u", sbi->s_last_block); |
289 | /* | 292 | if (sbi->s_anchor != 0) |
290 | * s_anchor[2] could be zeroed out in case there is no anchor | 293 | seq_printf(seq, ",anchor=%u", sbi->s_anchor); |
291 | * in the specified block, but then the "anchor=N" option | ||
292 | * originally given by the user wasn't effective, so it's OK | ||
293 | * if we don't show it. | ||
294 | */ | ||
295 | if (sbi->s_anchor[2] != 0) | ||
296 | seq_printf(seq, ",anchor=%u", sbi->s_anchor[2]); | ||
297 | /* | 294 | /* |
298 | * volume, partition, fileset and rootdir seem to be ignored | 295 | * volume, partition, fileset and rootdir seem to be ignored |
299 | * currently | 296 | * currently |
@@ -317,6 +314,8 @@ static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt) | |||
317 | * | 314 | * |
318 | * gid= Set the default group. | 315 | * gid= Set the default group. |
319 | * umask= Set the default umask. | 316 | * umask= Set the default umask. |
317 | * mode= Set the default file permissions. | ||
318 | * dmode= Set the default directory permissions. | ||
320 | * uid= Set the default user. | 319 | * uid= Set the default user. |
321 | * bs= Set the block size. | 320 | * bs= Set the block size. |
322 | * unhide Show otherwise hidden files. | 321 | * unhide Show otherwise hidden files. |
@@ -366,7 +365,8 @@ enum { | |||
366 | Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock, | 365 | Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock, |
367 | Opt_anchor, Opt_volume, Opt_partition, Opt_fileset, | 366 | Opt_anchor, Opt_volume, Opt_partition, Opt_fileset, |
368 | Opt_rootdir, Opt_utf8, Opt_iocharset, | 367 | Opt_rootdir, Opt_utf8, Opt_iocharset, |
369 | Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore | 368 | Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore, |
369 | Opt_fmode, Opt_dmode | ||
370 | }; | 370 | }; |
371 | 371 | ||
372 | static const match_table_t tokens = { | 372 | static const match_table_t tokens = { |
@@ -395,6 +395,8 @@ static const match_table_t tokens = { | |||
395 | {Opt_rootdir, "rootdir=%u"}, | 395 | {Opt_rootdir, "rootdir=%u"}, |
396 | {Opt_utf8, "utf8"}, | 396 | {Opt_utf8, "utf8"}, |
397 | {Opt_iocharset, "iocharset=%s"}, | 397 | {Opt_iocharset, "iocharset=%s"}, |
398 | {Opt_fmode, "mode=%o"}, | ||
399 | {Opt_dmode, "dmode=%o"}, | ||
398 | {Opt_err, NULL} | 400 | {Opt_err, NULL} |
399 | }; | 401 | }; |
400 | 402 | ||
@@ -405,7 +407,6 @@ static int udf_parse_options(char *options, struct udf_options *uopt, | |||
405 | int option; | 407 | int option; |
406 | 408 | ||
407 | uopt->novrs = 0; | 409 | uopt->novrs = 0; |
408 | uopt->blocksize = UDF_DEFAULT_BLOCKSIZE; | ||
409 | uopt->partition = 0xFFFF; | 410 | uopt->partition = 0xFFFF; |
410 | uopt->session = 0xFFFFFFFF; | 411 | uopt->session = 0xFFFFFFFF; |
411 | uopt->lastblock = 0; | 412 | uopt->lastblock = 0; |
@@ -428,10 +429,12 @@ static int udf_parse_options(char *options, struct udf_options *uopt, | |||
428 | switch (token) { | 429 | switch (token) { |
429 | case Opt_novrs: | 430 | case Opt_novrs: |
430 | uopt->novrs = 1; | 431 | uopt->novrs = 1; |
432 | break; | ||
431 | case Opt_bs: | 433 | case Opt_bs: |
432 | if (match_int(&args[0], &option)) | 434 | if (match_int(&args[0], &option)) |
433 | return 0; | 435 | return 0; |
434 | uopt->blocksize = option; | 436 | uopt->blocksize = option; |
437 | uopt->flags |= (1 << UDF_FLAG_BLOCKSIZE_SET); | ||
435 | break; | 438 | break; |
436 | case Opt_unhide: | 439 | case Opt_unhide: |
437 | uopt->flags |= (1 << UDF_FLAG_UNHIDE); | 440 | uopt->flags |= (1 << UDF_FLAG_UNHIDE); |
@@ -531,6 +534,16 @@ static int udf_parse_options(char *options, struct udf_options *uopt, | |||
531 | case Opt_gforget: | 534 | case Opt_gforget: |
532 | uopt->flags |= (1 << UDF_FLAG_GID_FORGET); | 535 | uopt->flags |= (1 << UDF_FLAG_GID_FORGET); |
533 | break; | 536 | break; |
537 | case Opt_fmode: | ||
538 | if (match_octal(args, &option)) | ||
539 | return 0; | ||
540 | uopt->fmode = option & 0777; | ||
541 | break; | ||
542 | case Opt_dmode: | ||
543 | if (match_octal(args, &option)) | ||
544 | return 0; | ||
545 | uopt->dmode = option & 0777; | ||
546 | break; | ||
534 | default: | 547 | default: |
535 | printk(KERN_ERR "udf: bad mount option \"%s\" " | 548 | printk(KERN_ERR "udf: bad mount option \"%s\" " |
536 | "or missing value\n", p); | 549 | "or missing value\n", p); |
@@ -540,17 +553,6 @@ static int udf_parse_options(char *options, struct udf_options *uopt, | |||
540 | return 1; | 553 | return 1; |
541 | } | 554 | } |
542 | 555 | ||
543 | static void udf_write_super(struct super_block *sb) | ||
544 | { | ||
545 | lock_kernel(); | ||
546 | |||
547 | if (!(sb->s_flags & MS_RDONLY)) | ||
548 | udf_open_lvid(sb); | ||
549 | sb->s_dirt = 0; | ||
550 | |||
551 | unlock_kernel(); | ||
552 | } | ||
553 | |||
554 | static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | 556 | static int udf_remount_fs(struct super_block *sb, int *flags, char *options) |
555 | { | 557 | { |
556 | struct udf_options uopt; | 558 | struct udf_options uopt; |
@@ -560,6 +562,8 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
560 | uopt.uid = sbi->s_uid; | 562 | uopt.uid = sbi->s_uid; |
561 | uopt.gid = sbi->s_gid; | 563 | uopt.gid = sbi->s_gid; |
562 | uopt.umask = sbi->s_umask; | 564 | uopt.umask = sbi->s_umask; |
565 | uopt.fmode = sbi->s_fmode; | ||
566 | uopt.dmode = sbi->s_dmode; | ||
563 | 567 | ||
564 | if (!udf_parse_options(options, &uopt, true)) | 568 | if (!udf_parse_options(options, &uopt, true)) |
565 | return -EINVAL; | 569 | return -EINVAL; |
@@ -568,6 +572,8 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
568 | sbi->s_uid = uopt.uid; | 572 | sbi->s_uid = uopt.uid; |
569 | sbi->s_gid = uopt.gid; | 573 | sbi->s_gid = uopt.gid; |
570 | sbi->s_umask = uopt.umask; | 574 | sbi->s_umask = uopt.umask; |
575 | sbi->s_fmode = uopt.fmode; | ||
576 | sbi->s_dmode = uopt.dmode; | ||
571 | 577 | ||
572 | if (sbi->s_lvid_bh) { | 578 | if (sbi->s_lvid_bh) { |
573 | int write_rev = le16_to_cpu(udf_sb_lvidiu(sbi)->minUDFWriteRev); | 579 | int write_rev = le16_to_cpu(udf_sb_lvidiu(sbi)->minUDFWriteRev); |
@@ -585,22 +591,19 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | |||
585 | return 0; | 591 | return 0; |
586 | } | 592 | } |
587 | 593 | ||
588 | static int udf_vrs(struct super_block *sb, int silent) | 594 | /* Check Volume Structure Descriptors (ECMA 167 2/9.1) */ |
595 | /* We also check any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ | ||
596 | static loff_t udf_check_vsd(struct super_block *sb) | ||
589 | { | 597 | { |
590 | struct volStructDesc *vsd = NULL; | 598 | struct volStructDesc *vsd = NULL; |
591 | loff_t sector = 32768; | 599 | loff_t sector = 32768; |
592 | int sectorsize; | 600 | int sectorsize; |
593 | struct buffer_head *bh = NULL; | 601 | struct buffer_head *bh = NULL; |
594 | int iso9660 = 0; | ||
595 | int nsr02 = 0; | 602 | int nsr02 = 0; |
596 | int nsr03 = 0; | 603 | int nsr03 = 0; |
597 | struct udf_sb_info *sbi; | 604 | struct udf_sb_info *sbi; |
598 | 605 | ||
599 | /* Block size must be a multiple of 512 */ | ||
600 | if (sb->s_blocksize & 511) | ||
601 | return 0; | ||
602 | sbi = UDF_SB(sb); | 606 | sbi = UDF_SB(sb); |
603 | |||
604 | if (sb->s_blocksize < sizeof(struct volStructDesc)) | 607 | if (sb->s_blocksize < sizeof(struct volStructDesc)) |
605 | sectorsize = sizeof(struct volStructDesc); | 608 | sectorsize = sizeof(struct volStructDesc); |
606 | else | 609 | else |
@@ -627,7 +630,6 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
627 | break; | 630 | break; |
628 | } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, | 631 | } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, |
629 | VSD_STD_ID_LEN)) { | 632 | VSD_STD_ID_LEN)) { |
630 | iso9660 = sector; | ||
631 | switch (vsd->structType) { | 633 | switch (vsd->structType) { |
632 | case 0: | 634 | case 0: |
633 | udf_debug("ISO9660 Boot Record found\n"); | 635 | udf_debug("ISO9660 Boot Record found\n"); |
@@ -679,139 +681,9 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
679 | return 0; | 681 | return 0; |
680 | } | 682 | } |
681 | 683 | ||
682 | /* | ||
683 | * Check whether there is an anchor block in the given block | ||
684 | */ | ||
685 | static int udf_check_anchor_block(struct super_block *sb, sector_t block) | ||
686 | { | ||
687 | struct buffer_head *bh; | ||
688 | uint16_t ident; | ||
689 | |||
690 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && | ||
691 | udf_fixed_to_variable(block) >= | ||
692 | sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) | ||
693 | return 0; | ||
694 | |||
695 | bh = udf_read_tagged(sb, block, block, &ident); | ||
696 | if (!bh) | ||
697 | return 0; | ||
698 | brelse(bh); | ||
699 | |||
700 | return ident == TAG_IDENT_AVDP; | ||
701 | } | ||
702 | |||
703 | /* Search for an anchor volume descriptor pointer */ | ||
704 | static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock) | ||
705 | { | ||
706 | sector_t last[6]; | ||
707 | int i; | ||
708 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
709 | |||
710 | last[0] = lastblock; | ||
711 | last[1] = last[0] - 1; | ||
712 | last[2] = last[0] + 1; | ||
713 | last[3] = last[0] - 2; | ||
714 | last[4] = last[0] - 150; | ||
715 | last[5] = last[0] - 152; | ||
716 | |||
717 | /* according to spec, anchor is in either: | ||
718 | * block 256 | ||
719 | * lastblock-256 | ||
720 | * lastblock | ||
721 | * however, if the disc isn't closed, it could be 512 */ | ||
722 | |||
723 | for (i = 0; i < ARRAY_SIZE(last); i++) { | ||
724 | if (last[i] < 0) | ||
725 | continue; | ||
726 | if (last[i] >= sb->s_bdev->bd_inode->i_size >> | ||
727 | sb->s_blocksize_bits) | ||
728 | continue; | ||
729 | |||
730 | if (udf_check_anchor_block(sb, last[i])) { | ||
731 | sbi->s_anchor[0] = last[i]; | ||
732 | sbi->s_anchor[1] = last[i] - 256; | ||
733 | return last[i]; | ||
734 | } | ||
735 | |||
736 | if (last[i] < 256) | ||
737 | continue; | ||
738 | |||
739 | if (udf_check_anchor_block(sb, last[i] - 256)) { | ||
740 | sbi->s_anchor[1] = last[i] - 256; | ||
741 | return last[i]; | ||
742 | } | ||
743 | } | ||
744 | |||
745 | if (udf_check_anchor_block(sb, sbi->s_session + 256)) { | ||
746 | sbi->s_anchor[0] = sbi->s_session + 256; | ||
747 | return last[0]; | ||
748 | } | ||
749 | if (udf_check_anchor_block(sb, sbi->s_session + 512)) { | ||
750 | sbi->s_anchor[0] = sbi->s_session + 512; | ||
751 | return last[0]; | ||
752 | } | ||
753 | return 0; | ||
754 | } | ||
755 | |||
756 | /* | ||
757 | * Find an anchor volume descriptor. The function expects sbi->s_lastblock to | ||
758 | * be the last block on the media. | ||
759 | * | ||
760 | * Return 1 if not found, 0 if ok | ||
761 | * | ||
762 | */ | ||
763 | static void udf_find_anchor(struct super_block *sb) | ||
764 | { | ||
765 | sector_t lastblock; | ||
766 | struct buffer_head *bh = NULL; | ||
767 | uint16_t ident; | ||
768 | int i; | ||
769 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
770 | |||
771 | lastblock = udf_scan_anchors(sb, sbi->s_last_block); | ||
772 | if (lastblock) | ||
773 | goto check_anchor; | ||
774 | |||
775 | /* No anchor found? Try VARCONV conversion of block numbers */ | ||
776 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | ||
777 | /* Firstly, we try to not convert number of the last block */ | ||
778 | lastblock = udf_scan_anchors(sb, | ||
779 | udf_variable_to_fixed(sbi->s_last_block)); | ||
780 | if (lastblock) | ||
781 | goto check_anchor; | ||
782 | |||
783 | /* Secondly, we try with converted number of the last block */ | ||
784 | lastblock = udf_scan_anchors(sb, sbi->s_last_block); | ||
785 | if (!lastblock) { | ||
786 | /* VARCONV didn't help. Clear it. */ | ||
787 | UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); | ||
788 | } | ||
789 | |||
790 | check_anchor: | ||
791 | /* | ||
792 | * Check located anchors and the anchor block supplied via | ||
793 | * mount options | ||
794 | */ | ||
795 | for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) { | ||
796 | if (!sbi->s_anchor[i]) | ||
797 | continue; | ||
798 | bh = udf_read_tagged(sb, sbi->s_anchor[i], | ||
799 | sbi->s_anchor[i], &ident); | ||
800 | if (!bh) | ||
801 | sbi->s_anchor[i] = 0; | ||
802 | else { | ||
803 | brelse(bh); | ||
804 | if (ident != TAG_IDENT_AVDP) | ||
805 | sbi->s_anchor[i] = 0; | ||
806 | } | ||
807 | } | ||
808 | |||
809 | sbi->s_last_block = lastblock; | ||
810 | } | ||
811 | |||
812 | static int udf_find_fileset(struct super_block *sb, | 684 | static int udf_find_fileset(struct super_block *sb, |
813 | kernel_lb_addr *fileset, | 685 | struct kernel_lb_addr *fileset, |
814 | kernel_lb_addr *root) | 686 | struct kernel_lb_addr *root) |
815 | { | 687 | { |
816 | struct buffer_head *bh = NULL; | 688 | struct buffer_head *bh = NULL; |
817 | long lastblock; | 689 | long lastblock; |
@@ -820,7 +692,7 @@ static int udf_find_fileset(struct super_block *sb, | |||
820 | 692 | ||
821 | if (fileset->logicalBlockNum != 0xFFFFFFFF || | 693 | if (fileset->logicalBlockNum != 0xFFFFFFFF || |
822 | fileset->partitionReferenceNum != 0xFFFF) { | 694 | fileset->partitionReferenceNum != 0xFFFF) { |
823 | bh = udf_read_ptagged(sb, *fileset, 0, &ident); | 695 | bh = udf_read_ptagged(sb, fileset, 0, &ident); |
824 | 696 | ||
825 | if (!bh) { | 697 | if (!bh) { |
826 | return 1; | 698 | return 1; |
@@ -834,7 +706,7 @@ static int udf_find_fileset(struct super_block *sb, | |||
834 | sbi = UDF_SB(sb); | 706 | sbi = UDF_SB(sb); |
835 | if (!bh) { | 707 | if (!bh) { |
836 | /* Search backwards through the partitions */ | 708 | /* Search backwards through the partitions */ |
837 | kernel_lb_addr newfileset; | 709 | struct kernel_lb_addr newfileset; |
838 | 710 | ||
839 | /* --> cvg: FIXME - is it reasonable? */ | 711 | /* --> cvg: FIXME - is it reasonable? */ |
840 | return 1; | 712 | return 1; |
@@ -850,7 +722,7 @@ static int udf_find_fileset(struct super_block *sb, | |||
850 | newfileset.logicalBlockNum = 0; | 722 | newfileset.logicalBlockNum = 0; |
851 | 723 | ||
852 | do { | 724 | do { |
853 | bh = udf_read_ptagged(sb, newfileset, 0, | 725 | bh = udf_read_ptagged(sb, &newfileset, 0, |
854 | &ident); | 726 | &ident); |
855 | if (!bh) { | 727 | if (!bh) { |
856 | newfileset.logicalBlockNum++; | 728 | newfileset.logicalBlockNum++; |
@@ -902,14 +774,23 @@ static int udf_find_fileset(struct super_block *sb, | |||
902 | static int udf_load_pvoldesc(struct super_block *sb, sector_t block) | 774 | static int udf_load_pvoldesc(struct super_block *sb, sector_t block) |
903 | { | 775 | { |
904 | struct primaryVolDesc *pvoldesc; | 776 | struct primaryVolDesc *pvoldesc; |
905 | struct ustr instr; | 777 | struct ustr *instr, *outstr; |
906 | struct ustr outstr; | ||
907 | struct buffer_head *bh; | 778 | struct buffer_head *bh; |
908 | uint16_t ident; | 779 | uint16_t ident; |
780 | int ret = 1; | ||
781 | |||
782 | instr = kmalloc(sizeof(struct ustr), GFP_NOFS); | ||
783 | if (!instr) | ||
784 | return 1; | ||
785 | |||
786 | outstr = kmalloc(sizeof(struct ustr), GFP_NOFS); | ||
787 | if (!outstr) | ||
788 | goto out1; | ||
909 | 789 | ||
910 | bh = udf_read_tagged(sb, block, block, &ident); | 790 | bh = udf_read_tagged(sb, block, block, &ident); |
911 | if (!bh) | 791 | if (!bh) |
912 | return 1; | 792 | goto out2; |
793 | |||
913 | BUG_ON(ident != TAG_IDENT_PVD); | 794 | BUG_ON(ident != TAG_IDENT_PVD); |
914 | 795 | ||
915 | pvoldesc = (struct primaryVolDesc *)bh->b_data; | 796 | pvoldesc = (struct primaryVolDesc *)bh->b_data; |
@@ -917,7 +798,7 @@ static int udf_load_pvoldesc(struct super_block *sb, sector_t block) | |||
917 | if (udf_disk_stamp_to_time(&UDF_SB(sb)->s_record_time, | 798 | if (udf_disk_stamp_to_time(&UDF_SB(sb)->s_record_time, |
918 | pvoldesc->recordingDateAndTime)) { | 799 | pvoldesc->recordingDateAndTime)) { |
919 | #ifdef UDFFS_DEBUG | 800 | #ifdef UDFFS_DEBUG |
920 | timestamp *ts = &pvoldesc->recordingDateAndTime; | 801 | struct timestamp *ts = &pvoldesc->recordingDateAndTime; |
921 | udf_debug("recording time %04u/%02u/%02u" | 802 | udf_debug("recording time %04u/%02u/%02u" |
922 | " %02u:%02u (%x)\n", | 803 | " %02u:%02u (%x)\n", |
923 | le16_to_cpu(ts->year), ts->month, ts->day, ts->hour, | 804 | le16_to_cpu(ts->year), ts->month, ts->day, ts->hour, |
@@ -925,20 +806,25 @@ static int udf_load_pvoldesc(struct super_block *sb, sector_t block) | |||
925 | #endif | 806 | #endif |
926 | } | 807 | } |
927 | 808 | ||
928 | if (!udf_build_ustr(&instr, pvoldesc->volIdent, 32)) | 809 | if (!udf_build_ustr(instr, pvoldesc->volIdent, 32)) |
929 | if (udf_CS0toUTF8(&outstr, &instr)) { | 810 | if (udf_CS0toUTF8(outstr, instr)) { |
930 | strncpy(UDF_SB(sb)->s_volume_ident, outstr.u_name, | 811 | strncpy(UDF_SB(sb)->s_volume_ident, outstr->u_name, |
931 | outstr.u_len > 31 ? 31 : outstr.u_len); | 812 | outstr->u_len > 31 ? 31 : outstr->u_len); |
932 | udf_debug("volIdent[] = '%s'\n", | 813 | udf_debug("volIdent[] = '%s'\n", |
933 | UDF_SB(sb)->s_volume_ident); | 814 | UDF_SB(sb)->s_volume_ident); |
934 | } | 815 | } |
935 | 816 | ||
936 | if (!udf_build_ustr(&instr, pvoldesc->volSetIdent, 128)) | 817 | if (!udf_build_ustr(instr, pvoldesc->volSetIdent, 128)) |
937 | if (udf_CS0toUTF8(&outstr, &instr)) | 818 | if (udf_CS0toUTF8(outstr, instr)) |
938 | udf_debug("volSetIdent[] = '%s'\n", outstr.u_name); | 819 | udf_debug("volSetIdent[] = '%s'\n", outstr->u_name); |
939 | 820 | ||
940 | brelse(bh); | 821 | brelse(bh); |
941 | return 0; | 822 | ret = 0; |
823 | out2: | ||
824 | kfree(outstr); | ||
825 | out1: | ||
826 | kfree(instr); | ||
827 | return ret; | ||
942 | } | 828 | } |
943 | 829 | ||
944 | static int udf_load_metadata_files(struct super_block *sb, int partition) | 830 | static int udf_load_metadata_files(struct super_block *sb, int partition) |
@@ -946,7 +832,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
946 | struct udf_sb_info *sbi = UDF_SB(sb); | 832 | struct udf_sb_info *sbi = UDF_SB(sb); |
947 | struct udf_part_map *map; | 833 | struct udf_part_map *map; |
948 | struct udf_meta_data *mdata; | 834 | struct udf_meta_data *mdata; |
949 | kernel_lb_addr addr; | 835 | struct kernel_lb_addr addr; |
950 | int fe_error = 0; | 836 | int fe_error = 0; |
951 | 837 | ||
952 | map = &sbi->s_partmaps[partition]; | 838 | map = &sbi->s_partmaps[partition]; |
@@ -959,7 +845,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
959 | udf_debug("Metadata file location: block = %d part = %d\n", | 845 | udf_debug("Metadata file location: block = %d part = %d\n", |
960 | addr.logicalBlockNum, addr.partitionReferenceNum); | 846 | addr.logicalBlockNum, addr.partitionReferenceNum); |
961 | 847 | ||
962 | mdata->s_metadata_fe = udf_iget(sb, addr); | 848 | mdata->s_metadata_fe = udf_iget(sb, &addr); |
963 | 849 | ||
964 | if (mdata->s_metadata_fe == NULL) { | 850 | if (mdata->s_metadata_fe == NULL) { |
965 | udf_warning(sb, __func__, "metadata inode efe not found, " | 851 | udf_warning(sb, __func__, "metadata inode efe not found, " |
@@ -981,7 +867,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
981 | udf_debug("Mirror metadata file location: block = %d part = %d\n", | 867 | udf_debug("Mirror metadata file location: block = %d part = %d\n", |
982 | addr.logicalBlockNum, addr.partitionReferenceNum); | 868 | addr.logicalBlockNum, addr.partitionReferenceNum); |
983 | 869 | ||
984 | mdata->s_mirror_fe = udf_iget(sb, addr); | 870 | mdata->s_mirror_fe = udf_iget(sb, &addr); |
985 | 871 | ||
986 | if (mdata->s_mirror_fe == NULL) { | 872 | if (mdata->s_mirror_fe == NULL) { |
987 | if (fe_error) { | 873 | if (fe_error) { |
@@ -1013,7 +899,7 @@ static int udf_load_metadata_files(struct super_block *sb, int partition) | |||
1013 | udf_debug("Bitmap file location: block = %d part = %d\n", | 899 | udf_debug("Bitmap file location: block = %d part = %d\n", |
1014 | addr.logicalBlockNum, addr.partitionReferenceNum); | 900 | addr.logicalBlockNum, addr.partitionReferenceNum); |
1015 | 901 | ||
1016 | mdata->s_bitmap_fe = udf_iget(sb, addr); | 902 | mdata->s_bitmap_fe = udf_iget(sb, &addr); |
1017 | 903 | ||
1018 | if (mdata->s_bitmap_fe == NULL) { | 904 | if (mdata->s_bitmap_fe == NULL) { |
1019 | if (sb->s_flags & MS_RDONLY) | 905 | if (sb->s_flags & MS_RDONLY) |
@@ -1037,7 +923,7 @@ error_exit: | |||
1037 | } | 923 | } |
1038 | 924 | ||
1039 | static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh, | 925 | static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh, |
1040 | kernel_lb_addr *root) | 926 | struct kernel_lb_addr *root) |
1041 | { | 927 | { |
1042 | struct fileSetDesc *fset; | 928 | struct fileSetDesc *fset; |
1043 | 929 | ||
@@ -1119,13 +1005,13 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
1119 | 1005 | ||
1120 | phd = (struct partitionHeaderDesc *)p->partitionContentsUse; | 1006 | phd = (struct partitionHeaderDesc *)p->partitionContentsUse; |
1121 | if (phd->unallocSpaceTable.extLength) { | 1007 | if (phd->unallocSpaceTable.extLength) { |
1122 | kernel_lb_addr loc = { | 1008 | struct kernel_lb_addr loc = { |
1123 | .logicalBlockNum = le32_to_cpu( | 1009 | .logicalBlockNum = le32_to_cpu( |
1124 | phd->unallocSpaceTable.extPosition), | 1010 | phd->unallocSpaceTable.extPosition), |
1125 | .partitionReferenceNum = p_index, | 1011 | .partitionReferenceNum = p_index, |
1126 | }; | 1012 | }; |
1127 | 1013 | ||
1128 | map->s_uspace.s_table = udf_iget(sb, loc); | 1014 | map->s_uspace.s_table = udf_iget(sb, &loc); |
1129 | if (!map->s_uspace.s_table) { | 1015 | if (!map->s_uspace.s_table) { |
1130 | udf_debug("cannot load unallocSpaceTable (part %d)\n", | 1016 | udf_debug("cannot load unallocSpaceTable (part %d)\n", |
1131 | p_index); | 1017 | p_index); |
@@ -1154,13 +1040,13 @@ static int udf_fill_partdesc_info(struct super_block *sb, | |||
1154 | udf_debug("partitionIntegrityTable (part %d)\n", p_index); | 1040 | udf_debug("partitionIntegrityTable (part %d)\n", p_index); |
1155 | 1041 | ||
1156 | if (phd->freedSpaceTable.extLength) { | 1042 | if (phd->freedSpaceTable.extLength) { |
1157 | kernel_lb_addr loc = { | 1043 | struct kernel_lb_addr loc = { |
1158 | .logicalBlockNum = le32_to_cpu( | 1044 | .logicalBlockNum = le32_to_cpu( |
1159 | phd->freedSpaceTable.extPosition), | 1045 | phd->freedSpaceTable.extPosition), |
1160 | .partitionReferenceNum = p_index, | 1046 | .partitionReferenceNum = p_index, |
1161 | }; | 1047 | }; |
1162 | 1048 | ||
1163 | map->s_fspace.s_table = udf_iget(sb, loc); | 1049 | map->s_fspace.s_table = udf_iget(sb, &loc); |
1164 | if (!map->s_fspace.s_table) { | 1050 | if (!map->s_fspace.s_table) { |
1165 | udf_debug("cannot load freedSpaceTable (part %d)\n", | 1051 | udf_debug("cannot load freedSpaceTable (part %d)\n", |
1166 | p_index); | 1052 | p_index); |
@@ -1192,7 +1078,7 @@ static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) | |||
1192 | { | 1078 | { |
1193 | struct udf_sb_info *sbi = UDF_SB(sb); | 1079 | struct udf_sb_info *sbi = UDF_SB(sb); |
1194 | struct udf_part_map *map = &sbi->s_partmaps[p_index]; | 1080 | struct udf_part_map *map = &sbi->s_partmaps[p_index]; |
1195 | kernel_lb_addr ino; | 1081 | struct kernel_lb_addr ino; |
1196 | struct buffer_head *bh = NULL; | 1082 | struct buffer_head *bh = NULL; |
1197 | struct udf_inode_info *vati; | 1083 | struct udf_inode_info *vati; |
1198 | uint32_t pos; | 1084 | uint32_t pos; |
@@ -1201,7 +1087,7 @@ static int udf_load_vat(struct super_block *sb, int p_index, int type1_index) | |||
1201 | /* VAT file entry is in the last recorded block */ | 1087 | /* VAT file entry is in the last recorded block */ |
1202 | ino.partitionReferenceNum = type1_index; | 1088 | ino.partitionReferenceNum = type1_index; |
1203 | ino.logicalBlockNum = sbi->s_last_block - map->s_partition_root; | 1089 | ino.logicalBlockNum = sbi->s_last_block - map->s_partition_root; |
1204 | sbi->s_vat_inode = udf_iget(sb, ino); | 1090 | sbi->s_vat_inode = udf_iget(sb, &ino); |
1205 | if (!sbi->s_vat_inode) | 1091 | if (!sbi->s_vat_inode) |
1206 | return 1; | 1092 | return 1; |
1207 | 1093 | ||
@@ -1322,7 +1208,7 @@ out_bh: | |||
1322 | } | 1208 | } |
1323 | 1209 | ||
1324 | static int udf_load_logicalvol(struct super_block *sb, sector_t block, | 1210 | static int udf_load_logicalvol(struct super_block *sb, sector_t block, |
1325 | kernel_lb_addr *fileset) | 1211 | struct kernel_lb_addr *fileset) |
1326 | { | 1212 | { |
1327 | struct logicalVolDesc *lvd; | 1213 | struct logicalVolDesc *lvd; |
1328 | int i, j, offset; | 1214 | int i, j, offset; |
@@ -1471,7 +1357,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
1471 | } | 1357 | } |
1472 | 1358 | ||
1473 | if (fileset) { | 1359 | if (fileset) { |
1474 | long_ad *la = (long_ad *)&(lvd->logicalVolContentsUse[0]); | 1360 | struct long_ad *la = (struct long_ad *)&(lvd->logicalVolContentsUse[0]); |
1475 | 1361 | ||
1476 | *fileset = lelb_to_cpu(la->extLocation); | 1362 | *fileset = lelb_to_cpu(la->extLocation); |
1477 | udf_debug("FileSet found in LogicalVolDesc at block=%d, " | 1363 | udf_debug("FileSet found in LogicalVolDesc at block=%d, " |
@@ -1490,7 +1376,7 @@ out_bh: | |||
1490 | * udf_load_logicalvolint | 1376 | * udf_load_logicalvolint |
1491 | * | 1377 | * |
1492 | */ | 1378 | */ |
1493 | static void udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc) | 1379 | static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_ad loc) |
1494 | { | 1380 | { |
1495 | struct buffer_head *bh = NULL; | 1381 | struct buffer_head *bh = NULL; |
1496 | uint16_t ident; | 1382 | uint16_t ident; |
@@ -1533,7 +1419,7 @@ static void udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc) | |||
1533 | * Written, tested, and released. | 1419 | * Written, tested, and released. |
1534 | */ | 1420 | */ |
1535 | static noinline int udf_process_sequence(struct super_block *sb, long block, | 1421 | static noinline int udf_process_sequence(struct super_block *sb, long block, |
1536 | long lastblock, kernel_lb_addr *fileset) | 1422 | long lastblock, struct kernel_lb_addr *fileset) |
1537 | { | 1423 | { |
1538 | struct buffer_head *bh = NULL; | 1424 | struct buffer_head *bh = NULL; |
1539 | struct udf_vds_record vds[VDS_POS_LENGTH]; | 1425 | struct udf_vds_record vds[VDS_POS_LENGTH]; |
@@ -1655,85 +1541,199 @@ static noinline int udf_process_sequence(struct super_block *sb, long block, | |||
1655 | return 0; | 1541 | return 0; |
1656 | } | 1542 | } |
1657 | 1543 | ||
1544 | static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh, | ||
1545 | struct kernel_lb_addr *fileset) | ||
1546 | { | ||
1547 | struct anchorVolDescPtr *anchor; | ||
1548 | long main_s, main_e, reserve_s, reserve_e; | ||
1549 | struct udf_sb_info *sbi; | ||
1550 | |||
1551 | sbi = UDF_SB(sb); | ||
1552 | anchor = (struct anchorVolDescPtr *)bh->b_data; | ||
1553 | |||
1554 | /* Locate the main sequence */ | ||
1555 | main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation); | ||
1556 | main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength); | ||
1557 | main_e = main_e >> sb->s_blocksize_bits; | ||
1558 | main_e += main_s; | ||
1559 | |||
1560 | /* Locate the reserve sequence */ | ||
1561 | reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation); | ||
1562 | reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength); | ||
1563 | reserve_e = reserve_e >> sb->s_blocksize_bits; | ||
1564 | reserve_e += reserve_s; | ||
1565 | |||
1566 | /* Process the main & reserve sequences */ | ||
1567 | /* responsible for finding the PartitionDesc(s) */ | ||
1568 | if (!udf_process_sequence(sb, main_s, main_e, fileset)) | ||
1569 | return 1; | ||
1570 | return !udf_process_sequence(sb, reserve_s, reserve_e, fileset); | ||
1571 | } | ||
1572 | |||
1658 | /* | 1573 | /* |
1659 | * udf_check_valid() | 1574 | * Check whether there is an anchor block in the given block and |
1575 | * load Volume Descriptor Sequence if so. | ||
1660 | */ | 1576 | */ |
1661 | static int udf_check_valid(struct super_block *sb, int novrs, int silent) | 1577 | static int udf_check_anchor_block(struct super_block *sb, sector_t block, |
1578 | struct kernel_lb_addr *fileset) | ||
1662 | { | 1579 | { |
1663 | long block; | 1580 | struct buffer_head *bh; |
1664 | struct udf_sb_info *sbi = UDF_SB(sb); | 1581 | uint16_t ident; |
1582 | int ret; | ||
1665 | 1583 | ||
1666 | if (novrs) { | 1584 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) && |
1667 | udf_debug("Validity check skipped because of novrs option\n"); | 1585 | udf_fixed_to_variable(block) >= |
1586 | sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits) | ||
1587 | return 0; | ||
1588 | |||
1589 | bh = udf_read_tagged(sb, block, block, &ident); | ||
1590 | if (!bh) | ||
1591 | return 0; | ||
1592 | if (ident != TAG_IDENT_AVDP) { | ||
1593 | brelse(bh); | ||
1668 | return 0; | 1594 | return 0; |
1669 | } | 1595 | } |
1670 | /* Check that it is NSR02 compliant */ | 1596 | ret = udf_load_sequence(sb, bh, fileset); |
1671 | /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */ | 1597 | brelse(bh); |
1672 | block = udf_vrs(sb, silent); | 1598 | return ret; |
1673 | if (block == -1) | ||
1674 | udf_debug("Failed to read byte 32768. Assuming open " | ||
1675 | "disc. Skipping validity check\n"); | ||
1676 | if (block && !sbi->s_last_block) | ||
1677 | sbi->s_last_block = udf_get_last_block(sb); | ||
1678 | return !block; | ||
1679 | } | 1599 | } |
1680 | 1600 | ||
1681 | static int udf_load_sequence(struct super_block *sb, kernel_lb_addr *fileset) | 1601 | /* Search for an anchor volume descriptor pointer */ |
1602 | static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock, | ||
1603 | struct kernel_lb_addr *fileset) | ||
1682 | { | 1604 | { |
1683 | struct anchorVolDescPtr *anchor; | 1605 | sector_t last[6]; |
1684 | uint16_t ident; | ||
1685 | struct buffer_head *bh; | ||
1686 | long main_s, main_e, reserve_s, reserve_e; | ||
1687 | int i; | 1606 | int i; |
1688 | struct udf_sb_info *sbi; | 1607 | struct udf_sb_info *sbi = UDF_SB(sb); |
1689 | 1608 | int last_count = 0; | |
1690 | if (!sb) | ||
1691 | return 1; | ||
1692 | sbi = UDF_SB(sb); | ||
1693 | 1609 | ||
1694 | for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) { | 1610 | /* First try user provided anchor */ |
1695 | if (!sbi->s_anchor[i]) | 1611 | if (sbi->s_anchor) { |
1612 | if (udf_check_anchor_block(sb, sbi->s_anchor, fileset)) | ||
1613 | return lastblock; | ||
1614 | } | ||
1615 | /* | ||
1616 | * according to spec, anchor is in either: | ||
1617 | * block 256 | ||
1618 | * lastblock-256 | ||
1619 | * lastblock | ||
1620 | * however, if the disc isn't closed, it could be 512. | ||
1621 | */ | ||
1622 | if (udf_check_anchor_block(sb, sbi->s_session + 256, fileset)) | ||
1623 | return lastblock; | ||
1624 | /* | ||
1625 | * The trouble is which block is the last one. Drives often misreport | ||
1626 | * this so we try various possibilities. | ||
1627 | */ | ||
1628 | last[last_count++] = lastblock; | ||
1629 | if (lastblock >= 1) | ||
1630 | last[last_count++] = lastblock - 1; | ||
1631 | last[last_count++] = lastblock + 1; | ||
1632 | if (lastblock >= 2) | ||
1633 | last[last_count++] = lastblock - 2; | ||
1634 | if (lastblock >= 150) | ||
1635 | last[last_count++] = lastblock - 150; | ||
1636 | if (lastblock >= 152) | ||
1637 | last[last_count++] = lastblock - 152; | ||
1638 | |||
1639 | for (i = 0; i < last_count; i++) { | ||
1640 | if (last[i] >= sb->s_bdev->bd_inode->i_size >> | ||
1641 | sb->s_blocksize_bits) | ||
1696 | continue; | 1642 | continue; |
1697 | 1643 | if (udf_check_anchor_block(sb, last[i], fileset)) | |
1698 | bh = udf_read_tagged(sb, sbi->s_anchor[i], sbi->s_anchor[i], | 1644 | return last[i]; |
1699 | &ident); | 1645 | if (last[i] < 256) |
1700 | if (!bh) | ||
1701 | continue; | 1646 | continue; |
1647 | if (udf_check_anchor_block(sb, last[i] - 256, fileset)) | ||
1648 | return last[i]; | ||
1649 | } | ||
1702 | 1650 | ||
1703 | anchor = (struct anchorVolDescPtr *)bh->b_data; | 1651 | /* Finally try block 512 in case media is open */ |
1652 | if (udf_check_anchor_block(sb, sbi->s_session + 512, fileset)) | ||
1653 | return last[0]; | ||
1654 | return 0; | ||
1655 | } | ||
1704 | 1656 | ||
1705 | /* Locate the main sequence */ | 1657 | /* |
1706 | main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation); | 1658 | * Find an anchor volume descriptor and load Volume Descriptor Sequence from |
1707 | main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength); | 1659 | * area specified by it. The function expects sbi->s_lastblock to be the last |
1708 | main_e = main_e >> sb->s_blocksize_bits; | 1660 | * block on the media. |
1709 | main_e += main_s; | 1661 | * |
1662 | * Return 1 if ok, 0 if not found. | ||
1663 | * | ||
1664 | */ | ||
1665 | static int udf_find_anchor(struct super_block *sb, | ||
1666 | struct kernel_lb_addr *fileset) | ||
1667 | { | ||
1668 | sector_t lastblock; | ||
1669 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
1710 | 1670 | ||
1711 | /* Locate the reserve sequence */ | 1671 | lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset); |
1712 | reserve_s = le32_to_cpu( | 1672 | if (lastblock) |
1713 | anchor->reserveVolDescSeqExt.extLocation); | 1673 | goto out; |
1714 | reserve_e = le32_to_cpu( | ||
1715 | anchor->reserveVolDescSeqExt.extLength); | ||
1716 | reserve_e = reserve_e >> sb->s_blocksize_bits; | ||
1717 | reserve_e += reserve_s; | ||
1718 | 1674 | ||
1719 | brelse(bh); | 1675 | /* No anchor found? Try VARCONV conversion of block numbers */ |
1676 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | ||
1677 | /* Firstly, we try to not convert number of the last block */ | ||
1678 | lastblock = udf_scan_anchors(sb, | ||
1679 | udf_variable_to_fixed(sbi->s_last_block), | ||
1680 | fileset); | ||
1681 | if (lastblock) | ||
1682 | goto out; | ||
1720 | 1683 | ||
1721 | /* Process the main & reserve sequences */ | 1684 | /* Secondly, we try with converted number of the last block */ |
1722 | /* responsible for finding the PartitionDesc(s) */ | 1685 | lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset); |
1723 | if (!(udf_process_sequence(sb, main_s, main_e, | 1686 | if (!lastblock) { |
1724 | fileset) && | 1687 | /* VARCONV didn't help. Clear it. */ |
1725 | udf_process_sequence(sb, reserve_s, reserve_e, | 1688 | UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV); |
1726 | fileset))) | 1689 | return 0; |
1727 | break; | ||
1728 | } | 1690 | } |
1691 | out: | ||
1692 | sbi->s_last_block = lastblock; | ||
1693 | return 1; | ||
1694 | } | ||
1729 | 1695 | ||
1730 | if (i == ARRAY_SIZE(sbi->s_anchor)) { | 1696 | /* |
1731 | udf_debug("No Anchor block found\n"); | 1697 | * Check Volume Structure Descriptor, find Anchor block and load Volume |
1732 | return 1; | 1698 | * Descriptor Sequence |
1699 | */ | ||
1700 | static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt, | ||
1701 | int silent, struct kernel_lb_addr *fileset) | ||
1702 | { | ||
1703 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
1704 | loff_t nsr_off; | ||
1705 | |||
1706 | if (!sb_set_blocksize(sb, uopt->blocksize)) { | ||
1707 | if (!silent) | ||
1708 | printk(KERN_WARNING "UDF-fs: Bad block size\n"); | ||
1709 | return 0; | ||
1710 | } | ||
1711 | sbi->s_last_block = uopt->lastblock; | ||
1712 | if (!uopt->novrs) { | ||
1713 | /* Check that it is NSR02 compliant */ | ||
1714 | nsr_off = udf_check_vsd(sb); | ||
1715 | if (!nsr_off) { | ||
1716 | if (!silent) | ||
1717 | printk(KERN_WARNING "UDF-fs: No VRS found\n"); | ||
1718 | return 0; | ||
1719 | } | ||
1720 | if (nsr_off == -1) | ||
1721 | udf_debug("Failed to read byte 32768. Assuming open " | ||
1722 | "disc. Skipping validity check\n"); | ||
1723 | if (!sbi->s_last_block) | ||
1724 | sbi->s_last_block = udf_get_last_block(sb); | ||
1725 | } else { | ||
1726 | udf_debug("Validity check skipped because of novrs option\n"); | ||
1733 | } | 1727 | } |
1734 | udf_debug("Using anchor in block %d\n", sbi->s_anchor[i]); | ||
1735 | 1728 | ||
1736 | return 0; | 1729 | /* Look for anchor block and load Volume Descriptor Sequence */ |
1730 | sbi->s_anchor = uopt->anchor; | ||
1731 | if (!udf_find_anchor(sb, fileset)) { | ||
1732 | if (!silent) | ||
1733 | printk(KERN_WARNING "UDF-fs: No anchor found\n"); | ||
1734 | return 0; | ||
1735 | } | ||
1736 | return 1; | ||
1737 | } | 1737 | } |
1738 | 1738 | ||
1739 | static void udf_open_lvid(struct super_block *sb) | 1739 | static void udf_open_lvid(struct super_block *sb) |
@@ -1742,9 +1742,9 @@ static void udf_open_lvid(struct super_block *sb) | |||
1742 | struct buffer_head *bh = sbi->s_lvid_bh; | 1742 | struct buffer_head *bh = sbi->s_lvid_bh; |
1743 | struct logicalVolIntegrityDesc *lvid; | 1743 | struct logicalVolIntegrityDesc *lvid; |
1744 | struct logicalVolIntegrityDescImpUse *lvidiu; | 1744 | struct logicalVolIntegrityDescImpUse *lvidiu; |
1745 | |||
1745 | if (!bh) | 1746 | if (!bh) |
1746 | return; | 1747 | return; |
1747 | |||
1748 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; | 1748 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; |
1749 | lvidiu = udf_sb_lvidiu(sbi); | 1749 | lvidiu = udf_sb_lvidiu(sbi); |
1750 | 1750 | ||
@@ -1752,14 +1752,15 @@ static void udf_open_lvid(struct super_block *sb) | |||
1752 | lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1752 | lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; |
1753 | udf_time_to_disk_stamp(&lvid->recordingDateAndTime, | 1753 | udf_time_to_disk_stamp(&lvid->recordingDateAndTime, |
1754 | CURRENT_TIME); | 1754 | CURRENT_TIME); |
1755 | lvid->integrityType = LVID_INTEGRITY_TYPE_OPEN; | 1755 | lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN); |
1756 | 1756 | ||
1757 | lvid->descTag.descCRC = cpu_to_le16( | 1757 | lvid->descTag.descCRC = cpu_to_le16( |
1758 | crc_itu_t(0, (char *)lvid + sizeof(tag), | 1758 | crc_itu_t(0, (char *)lvid + sizeof(struct tag), |
1759 | le16_to_cpu(lvid->descTag.descCRCLength))); | 1759 | le16_to_cpu(lvid->descTag.descCRCLength))); |
1760 | 1760 | ||
1761 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); | 1761 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); |
1762 | mark_buffer_dirty(bh); | 1762 | mark_buffer_dirty(bh); |
1763 | sbi->s_lvid_dirty = 0; | ||
1763 | } | 1764 | } |
1764 | 1765 | ||
1765 | static void udf_close_lvid(struct super_block *sb) | 1766 | static void udf_close_lvid(struct super_block *sb) |
@@ -1773,10 +1774,6 @@ static void udf_close_lvid(struct super_block *sb) | |||
1773 | return; | 1774 | return; |
1774 | 1775 | ||
1775 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; | 1776 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; |
1776 | |||
1777 | if (lvid->integrityType != LVID_INTEGRITY_TYPE_OPEN) | ||
1778 | return; | ||
1779 | |||
1780 | lvidiu = udf_sb_lvidiu(sbi); | 1777 | lvidiu = udf_sb_lvidiu(sbi); |
1781 | lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | 1778 | lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; |
1782 | lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1779 | lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; |
@@ -1790,11 +1787,12 @@ static void udf_close_lvid(struct super_block *sb) | |||
1790 | lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); | 1787 | lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); |
1791 | 1788 | ||
1792 | lvid->descTag.descCRC = cpu_to_le16( | 1789 | lvid->descTag.descCRC = cpu_to_le16( |
1793 | crc_itu_t(0, (char *)lvid + sizeof(tag), | 1790 | crc_itu_t(0, (char *)lvid + sizeof(struct tag), |
1794 | le16_to_cpu(lvid->descTag.descCRCLength))); | 1791 | le16_to_cpu(lvid->descTag.descCRCLength))); |
1795 | 1792 | ||
1796 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); | 1793 | lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag); |
1797 | mark_buffer_dirty(bh); | 1794 | mark_buffer_dirty(bh); |
1795 | sbi->s_lvid_dirty = 0; | ||
1798 | } | 1796 | } |
1799 | 1797 | ||
1800 | static void udf_sb_free_bitmap(struct udf_bitmap *bitmap) | 1798 | static void udf_sb_free_bitmap(struct udf_bitmap *bitmap) |
@@ -1846,15 +1844,18 @@ static void udf_free_partition(struct udf_part_map *map) | |||
1846 | static int udf_fill_super(struct super_block *sb, void *options, int silent) | 1844 | static int udf_fill_super(struct super_block *sb, void *options, int silent) |
1847 | { | 1845 | { |
1848 | int i; | 1846 | int i; |
1847 | int ret; | ||
1849 | struct inode *inode = NULL; | 1848 | struct inode *inode = NULL; |
1850 | struct udf_options uopt; | 1849 | struct udf_options uopt; |
1851 | kernel_lb_addr rootdir, fileset; | 1850 | struct kernel_lb_addr rootdir, fileset; |
1852 | struct udf_sb_info *sbi; | 1851 | struct udf_sb_info *sbi; |
1853 | 1852 | ||
1854 | uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); | 1853 | uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); |
1855 | uopt.uid = -1; | 1854 | uopt.uid = -1; |
1856 | uopt.gid = -1; | 1855 | uopt.gid = -1; |
1857 | uopt.umask = 0; | 1856 | uopt.umask = 0; |
1857 | uopt.fmode = UDF_INVALID_MODE; | ||
1858 | uopt.dmode = UDF_INVALID_MODE; | ||
1858 | 1859 | ||
1859 | sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); | 1860 | sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); |
1860 | if (!sbi) | 1861 | if (!sbi) |
@@ -1892,15 +1893,10 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1892 | sbi->s_uid = uopt.uid; | 1893 | sbi->s_uid = uopt.uid; |
1893 | sbi->s_gid = uopt.gid; | 1894 | sbi->s_gid = uopt.gid; |
1894 | sbi->s_umask = uopt.umask; | 1895 | sbi->s_umask = uopt.umask; |
1896 | sbi->s_fmode = uopt.fmode; | ||
1897 | sbi->s_dmode = uopt.dmode; | ||
1895 | sbi->s_nls_map = uopt.nls_map; | 1898 | sbi->s_nls_map = uopt.nls_map; |
1896 | 1899 | ||
1897 | /* Set the block size for all transfers */ | ||
1898 | if (!sb_min_blocksize(sb, uopt.blocksize)) { | ||
1899 | udf_debug("Bad block size (%d)\n", uopt.blocksize); | ||
1900 | printk(KERN_ERR "udf: bad block size (%d)\n", uopt.blocksize); | ||
1901 | goto error_out; | ||
1902 | } | ||
1903 | |||
1904 | if (uopt.session == 0xFFFFFFFF) | 1900 | if (uopt.session == 0xFFFFFFFF) |
1905 | sbi->s_session = udf_get_last_session(sb); | 1901 | sbi->s_session = udf_get_last_session(sb); |
1906 | else | 1902 | else |
@@ -1908,18 +1904,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1908 | 1904 | ||
1909 | udf_debug("Multi-session=%d\n", sbi->s_session); | 1905 | udf_debug("Multi-session=%d\n", sbi->s_session); |
1910 | 1906 | ||
1911 | sbi->s_last_block = uopt.lastblock; | ||
1912 | sbi->s_anchor[0] = sbi->s_anchor[1] = 0; | ||
1913 | sbi->s_anchor[2] = uopt.anchor; | ||
1914 | |||
1915 | if (udf_check_valid(sb, uopt.novrs, silent)) { | ||
1916 | /* read volume recognition sequences */ | ||
1917 | printk(KERN_WARNING "UDF-fs: No VRS found\n"); | ||
1918 | goto error_out; | ||
1919 | } | ||
1920 | |||
1921 | udf_find_anchor(sb); | ||
1922 | |||
1923 | /* Fill in the rest of the superblock */ | 1907 | /* Fill in the rest of the superblock */ |
1924 | sb->s_op = &udf_sb_ops; | 1908 | sb->s_op = &udf_sb_ops; |
1925 | sb->s_export_op = &udf_export_ops; | 1909 | sb->s_export_op = &udf_export_ops; |
@@ -1928,7 +1912,21 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1928 | sb->s_magic = UDF_SUPER_MAGIC; | 1912 | sb->s_magic = UDF_SUPER_MAGIC; |
1929 | sb->s_time_gran = 1000; | 1913 | sb->s_time_gran = 1000; |
1930 | 1914 | ||
1931 | if (udf_load_sequence(sb, &fileset)) { | 1915 | if (uopt.flags & (1 << UDF_FLAG_BLOCKSIZE_SET)) { |
1916 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); | ||
1917 | } else { | ||
1918 | uopt.blocksize = bdev_hardsect_size(sb->s_bdev); | ||
1919 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); | ||
1920 | if (!ret && uopt.blocksize != UDF_DEFAULT_BLOCKSIZE) { | ||
1921 | if (!silent) | ||
1922 | printk(KERN_NOTICE | ||
1923 | "UDF-fs: Rescanning with blocksize " | ||
1924 | "%d\n", UDF_DEFAULT_BLOCKSIZE); | ||
1925 | uopt.blocksize = UDF_DEFAULT_BLOCKSIZE; | ||
1926 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); | ||
1927 | } | ||
1928 | } | ||
1929 | if (!ret) { | ||
1932 | printk(KERN_WARNING "UDF-fs: No partition found (1)\n"); | 1930 | printk(KERN_WARNING "UDF-fs: No partition found (1)\n"); |
1933 | goto error_out; | 1931 | goto error_out; |
1934 | } | 1932 | } |
@@ -1978,7 +1976,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1978 | } | 1976 | } |
1979 | 1977 | ||
1980 | if (!silent) { | 1978 | if (!silent) { |
1981 | timestamp ts; | 1979 | struct timestamp ts; |
1982 | udf_time_to_disk_stamp(&ts, sbi->s_record_time); | 1980 | udf_time_to_disk_stamp(&ts, sbi->s_record_time); |
1983 | udf_info("UDF: Mounting volume '%s', " | 1981 | udf_info("UDF: Mounting volume '%s', " |
1984 | "timestamp %04u/%02u/%02u %02u:%02u (%x)\n", | 1982 | "timestamp %04u/%02u/%02u %02u:%02u (%x)\n", |
@@ -1991,7 +1989,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1991 | /* Assign the root inode */ | 1989 | /* Assign the root inode */ |
1992 | /* assign inodes by physical block number */ | 1990 | /* assign inodes by physical block number */ |
1993 | /* perhaps it's not extensible enough, but for now ... */ | 1991 | /* perhaps it's not extensible enough, but for now ... */ |
1994 | inode = udf_iget(sb, rootdir); | 1992 | inode = udf_iget(sb, &rootdir); |
1995 | if (!inode) { | 1993 | if (!inode) { |
1996 | printk(KERN_ERR "UDF-fs: Error in udf_iget, block=%d, " | 1994 | printk(KERN_ERR "UDF-fs: Error in udf_iget, block=%d, " |
1997 | "partition=%d\n", | 1995 | "partition=%d\n", |
@@ -2081,11 +2079,31 @@ static void udf_put_super(struct super_block *sb) | |||
2081 | sb->s_fs_info = NULL; | 2079 | sb->s_fs_info = NULL; |
2082 | } | 2080 | } |
2083 | 2081 | ||
2082 | static int udf_sync_fs(struct super_block *sb, int wait) | ||
2083 | { | ||
2084 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
2085 | |||
2086 | mutex_lock(&sbi->s_alloc_mutex); | ||
2087 | if (sbi->s_lvid_dirty) { | ||
2088 | /* | ||
2089 | * Blockdevice will be synced later so we don't have to submit | ||
2090 | * the buffer for IO | ||
2091 | */ | ||
2092 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
2093 | sb->s_dirt = 0; | ||
2094 | sbi->s_lvid_dirty = 0; | ||
2095 | } | ||
2096 | mutex_unlock(&sbi->s_alloc_mutex); | ||
2097 | |||
2098 | return 0; | ||
2099 | } | ||
2100 | |||
2084 | static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) | 2101 | static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) |
2085 | { | 2102 | { |
2086 | struct super_block *sb = dentry->d_sb; | 2103 | struct super_block *sb = dentry->d_sb; |
2087 | struct udf_sb_info *sbi = UDF_SB(sb); | 2104 | struct udf_sb_info *sbi = UDF_SB(sb); |
2088 | struct logicalVolIntegrityDescImpUse *lvidiu; | 2105 | struct logicalVolIntegrityDescImpUse *lvidiu; |
2106 | u64 id = huge_encode_dev(sb->s_bdev->bd_dev); | ||
2089 | 2107 | ||
2090 | if (sbi->s_lvid_bh != NULL) | 2108 | if (sbi->s_lvid_bh != NULL) |
2091 | lvidiu = udf_sb_lvidiu(sbi); | 2109 | lvidiu = udf_sb_lvidiu(sbi); |
@@ -2101,8 +2119,9 @@ static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
2101 | le32_to_cpu(lvidiu->numDirs)) : 0) | 2119 | le32_to_cpu(lvidiu->numDirs)) : 0) |
2102 | + buf->f_bfree; | 2120 | + buf->f_bfree; |
2103 | buf->f_ffree = buf->f_bfree; | 2121 | buf->f_ffree = buf->f_bfree; |
2104 | /* __kernel_fsid_t f_fsid */ | ||
2105 | buf->f_namelen = UDF_NAME_LEN - 2; | 2122 | buf->f_namelen = UDF_NAME_LEN - 2; |
2123 | buf->f_fsid.val[0] = (u32)id; | ||
2124 | buf->f_fsid.val[1] = (u32)(id >> 32); | ||
2106 | 2125 | ||
2107 | return 0; | 2126 | return 0; |
2108 | } | 2127 | } |
@@ -2114,7 +2133,7 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb, | |||
2114 | unsigned int accum = 0; | 2133 | unsigned int accum = 0; |
2115 | int index; | 2134 | int index; |
2116 | int block = 0, newblock; | 2135 | int block = 0, newblock; |
2117 | kernel_lb_addr loc; | 2136 | struct kernel_lb_addr loc; |
2118 | uint32_t bytes; | 2137 | uint32_t bytes; |
2119 | uint8_t *ptr; | 2138 | uint8_t *ptr; |
2120 | uint16_t ident; | 2139 | uint16_t ident; |
@@ -2124,7 +2143,7 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb, | |||
2124 | 2143 | ||
2125 | loc.logicalBlockNum = bitmap->s_extPosition; | 2144 | loc.logicalBlockNum = bitmap->s_extPosition; |
2126 | loc.partitionReferenceNum = UDF_SB(sb)->s_partition; | 2145 | loc.partitionReferenceNum = UDF_SB(sb)->s_partition; |
2127 | bh = udf_read_ptagged(sb, loc, 0, &ident); | 2146 | bh = udf_read_ptagged(sb, &loc, 0, &ident); |
2128 | 2147 | ||
2129 | if (!bh) { | 2148 | if (!bh) { |
2130 | printk(KERN_ERR "udf: udf_count_free failed\n"); | 2149 | printk(KERN_ERR "udf: udf_count_free failed\n"); |
@@ -2147,7 +2166,7 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb, | |||
2147 | bytes -= cur_bytes; | 2166 | bytes -= cur_bytes; |
2148 | if (bytes) { | 2167 | if (bytes) { |
2149 | brelse(bh); | 2168 | brelse(bh); |
2150 | newblock = udf_get_lb_pblock(sb, loc, ++block); | 2169 | newblock = udf_get_lb_pblock(sb, &loc, ++block); |
2151 | bh = udf_tread(sb, newblock); | 2170 | bh = udf_tread(sb, newblock); |
2152 | if (!bh) { | 2171 | if (!bh) { |
2153 | udf_debug("read failed\n"); | 2172 | udf_debug("read failed\n"); |
@@ -2170,7 +2189,7 @@ static unsigned int udf_count_free_table(struct super_block *sb, | |||
2170 | { | 2189 | { |
2171 | unsigned int accum = 0; | 2190 | unsigned int accum = 0; |
2172 | uint32_t elen; | 2191 | uint32_t elen; |
2173 | kernel_lb_addr eloc; | 2192 | struct kernel_lb_addr eloc; |
2174 | int8_t etype; | 2193 | int8_t etype; |
2175 | struct extent_position epos; | 2194 | struct extent_position epos; |
2176 | 2195 | ||
diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index 65e19b4f9424..225527cdc885 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c | |||
@@ -28,10 +28,10 @@ | |||
28 | #include "udf_sb.h" | 28 | #include "udf_sb.h" |
29 | 29 | ||
30 | static void extent_trunc(struct inode *inode, struct extent_position *epos, | 30 | static void extent_trunc(struct inode *inode, struct extent_position *epos, |
31 | kernel_lb_addr eloc, int8_t etype, uint32_t elen, | 31 | struct kernel_lb_addr *eloc, int8_t etype, uint32_t elen, |
32 | uint32_t nelen) | 32 | uint32_t nelen) |
33 | { | 33 | { |
34 | kernel_lb_addr neloc = {}; | 34 | struct kernel_lb_addr neloc = {}; |
35 | int last_block = (elen + inode->i_sb->s_blocksize - 1) >> | 35 | int last_block = (elen + inode->i_sb->s_blocksize - 1) >> |
36 | inode->i_sb->s_blocksize_bits; | 36 | inode->i_sb->s_blocksize_bits; |
37 | int first_block = (nelen + inode->i_sb->s_blocksize - 1) >> | 37 | int first_block = (nelen + inode->i_sb->s_blocksize - 1) >> |
@@ -43,12 +43,12 @@ static void extent_trunc(struct inode *inode, struct extent_position *epos, | |||
43 | last_block); | 43 | last_block); |
44 | etype = (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30); | 44 | etype = (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30); |
45 | } else | 45 | } else |
46 | neloc = eloc; | 46 | neloc = *eloc; |
47 | nelen = (etype << 30) | nelen; | 47 | nelen = (etype << 30) | nelen; |
48 | } | 48 | } |
49 | 49 | ||
50 | if (elen != nelen) { | 50 | if (elen != nelen) { |
51 | udf_write_aext(inode, epos, neloc, nelen, 0); | 51 | udf_write_aext(inode, epos, &neloc, nelen, 0); |
52 | if (last_block - first_block > 0) { | 52 | if (last_block - first_block > 0) { |
53 | if (etype == (EXT_RECORDED_ALLOCATED >> 30)) | 53 | if (etype == (EXT_RECORDED_ALLOCATED >> 30)) |
54 | mark_inode_dirty(inode); | 54 | mark_inode_dirty(inode); |
@@ -68,7 +68,7 @@ static void extent_trunc(struct inode *inode, struct extent_position *epos, | |||
68 | void udf_truncate_tail_extent(struct inode *inode) | 68 | void udf_truncate_tail_extent(struct inode *inode) |
69 | { | 69 | { |
70 | struct extent_position epos = {}; | 70 | struct extent_position epos = {}; |
71 | kernel_lb_addr eloc; | 71 | struct kernel_lb_addr eloc; |
72 | uint32_t elen, nelen; | 72 | uint32_t elen, nelen; |
73 | uint64_t lbcount = 0; | 73 | uint64_t lbcount = 0; |
74 | int8_t etype = -1, netype; | 74 | int8_t etype = -1, netype; |
@@ -83,9 +83,9 @@ void udf_truncate_tail_extent(struct inode *inode) | |||
83 | return; | 83 | return; |
84 | 84 | ||
85 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 85 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
86 | adsize = sizeof(short_ad); | 86 | adsize = sizeof(struct short_ad); |
87 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 87 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
88 | adsize = sizeof(long_ad); | 88 | adsize = sizeof(struct long_ad); |
89 | else | 89 | else |
90 | BUG(); | 90 | BUG(); |
91 | 91 | ||
@@ -106,7 +106,7 @@ void udf_truncate_tail_extent(struct inode *inode) | |||
106 | (unsigned)elen); | 106 | (unsigned)elen); |
107 | nelen = elen - (lbcount - inode->i_size); | 107 | nelen = elen - (lbcount - inode->i_size); |
108 | epos.offset -= adsize; | 108 | epos.offset -= adsize; |
109 | extent_trunc(inode, &epos, eloc, etype, elen, nelen); | 109 | extent_trunc(inode, &epos, &eloc, etype, elen, nelen); |
110 | epos.offset += adsize; | 110 | epos.offset += adsize; |
111 | if (udf_next_aext(inode, &epos, &eloc, &elen, 1) != -1) | 111 | if (udf_next_aext(inode, &epos, &eloc, &elen, 1) != -1) |
112 | printk(KERN_ERR "udf_truncate_tail_extent(): " | 112 | printk(KERN_ERR "udf_truncate_tail_extent(): " |
@@ -124,7 +124,7 @@ void udf_truncate_tail_extent(struct inode *inode) | |||
124 | void udf_discard_prealloc(struct inode *inode) | 124 | void udf_discard_prealloc(struct inode *inode) |
125 | { | 125 | { |
126 | struct extent_position epos = { NULL, 0, {0, 0} }; | 126 | struct extent_position epos = { NULL, 0, {0, 0} }; |
127 | kernel_lb_addr eloc; | 127 | struct kernel_lb_addr eloc; |
128 | uint32_t elen; | 128 | uint32_t elen; |
129 | uint64_t lbcount = 0; | 129 | uint64_t lbcount = 0; |
130 | int8_t etype = -1, netype; | 130 | int8_t etype = -1, netype; |
@@ -136,9 +136,9 @@ void udf_discard_prealloc(struct inode *inode) | |||
136 | return; | 136 | return; |
137 | 137 | ||
138 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 138 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
139 | adsize = sizeof(short_ad); | 139 | adsize = sizeof(struct short_ad); |
140 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 140 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
141 | adsize = sizeof(long_ad); | 141 | adsize = sizeof(struct long_ad); |
142 | else | 142 | else |
143 | adsize = 0; | 143 | adsize = 0; |
144 | 144 | ||
@@ -152,7 +152,7 @@ void udf_discard_prealloc(struct inode *inode) | |||
152 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { | 152 | if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) { |
153 | epos.offset -= adsize; | 153 | epos.offset -= adsize; |
154 | lbcount -= elen; | 154 | lbcount -= elen; |
155 | extent_trunc(inode, &epos, eloc, etype, elen, 0); | 155 | extent_trunc(inode, &epos, &eloc, etype, elen, 0); |
156 | if (!epos.bh) { | 156 | if (!epos.bh) { |
157 | iinfo->i_lenAlloc = | 157 | iinfo->i_lenAlloc = |
158 | epos.offset - | 158 | epos.offset - |
@@ -200,7 +200,7 @@ static void udf_update_alloc_ext_desc(struct inode *inode, | |||
200 | void udf_truncate_extents(struct inode *inode) | 200 | void udf_truncate_extents(struct inode *inode) |
201 | { | 201 | { |
202 | struct extent_position epos; | 202 | struct extent_position epos; |
203 | kernel_lb_addr eloc, neloc = {}; | 203 | struct kernel_lb_addr eloc, neloc = {}; |
204 | uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc; | 204 | uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc; |
205 | int8_t etype; | 205 | int8_t etype; |
206 | struct super_block *sb = inode->i_sb; | 206 | struct super_block *sb = inode->i_sb; |
@@ -210,9 +210,9 @@ void udf_truncate_extents(struct inode *inode) | |||
210 | struct udf_inode_info *iinfo = UDF_I(inode); | 210 | struct udf_inode_info *iinfo = UDF_I(inode); |
211 | 211 | ||
212 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) | 212 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
213 | adsize = sizeof(short_ad); | 213 | adsize = sizeof(struct short_ad); |
214 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) | 214 | else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) |
215 | adsize = sizeof(long_ad); | 215 | adsize = sizeof(struct long_ad); |
216 | else | 216 | else |
217 | BUG(); | 217 | BUG(); |
218 | 218 | ||
@@ -221,7 +221,7 @@ void udf_truncate_extents(struct inode *inode) | |||
221 | (inode->i_size & (sb->s_blocksize - 1)); | 221 | (inode->i_size & (sb->s_blocksize - 1)); |
222 | if (etype != -1) { | 222 | if (etype != -1) { |
223 | epos.offset -= adsize; | 223 | epos.offset -= adsize; |
224 | extent_trunc(inode, &epos, eloc, etype, elen, byte_offset); | 224 | extent_trunc(inode, &epos, &eloc, etype, elen, byte_offset); |
225 | epos.offset += adsize; | 225 | epos.offset += adsize; |
226 | if (byte_offset) | 226 | if (byte_offset) |
227 | lenalloc = epos.offset; | 227 | lenalloc = epos.offset; |
@@ -236,12 +236,12 @@ void udf_truncate_extents(struct inode *inode) | |||
236 | while ((etype = udf_current_aext(inode, &epos, &eloc, | 236 | while ((etype = udf_current_aext(inode, &epos, &eloc, |
237 | &elen, 0)) != -1) { | 237 | &elen, 0)) != -1) { |
238 | if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { | 238 | if (etype == (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) { |
239 | udf_write_aext(inode, &epos, neloc, nelen, 0); | 239 | udf_write_aext(inode, &epos, &neloc, nelen, 0); |
240 | if (indirect_ext_len) { | 240 | if (indirect_ext_len) { |
241 | /* We managed to free all extents in the | 241 | /* We managed to free all extents in the |
242 | * indirect extent - free it too */ | 242 | * indirect extent - free it too */ |
243 | BUG_ON(!epos.bh); | 243 | BUG_ON(!epos.bh); |
244 | udf_free_blocks(sb, inode, epos.block, | 244 | udf_free_blocks(sb, inode, &epos.block, |
245 | 0, indirect_ext_len); | 245 | 0, indirect_ext_len); |
246 | } else if (!epos.bh) { | 246 | } else if (!epos.bh) { |
247 | iinfo->i_lenAlloc = lenalloc; | 247 | iinfo->i_lenAlloc = lenalloc; |
@@ -253,7 +253,7 @@ void udf_truncate_extents(struct inode *inode) | |||
253 | epos.offset = sizeof(struct allocExtDesc); | 253 | epos.offset = sizeof(struct allocExtDesc); |
254 | epos.block = eloc; | 254 | epos.block = eloc; |
255 | epos.bh = udf_tread(sb, | 255 | epos.bh = udf_tread(sb, |
256 | udf_get_lb_pblock(sb, eloc, 0)); | 256 | udf_get_lb_pblock(sb, &eloc, 0)); |
257 | if (elen) | 257 | if (elen) |
258 | indirect_ext_len = | 258 | indirect_ext_len = |
259 | (elen + sb->s_blocksize - 1) >> | 259 | (elen + sb->s_blocksize - 1) >> |
@@ -261,7 +261,7 @@ void udf_truncate_extents(struct inode *inode) | |||
261 | else | 261 | else |
262 | indirect_ext_len = 1; | 262 | indirect_ext_len = 1; |
263 | } else { | 263 | } else { |
264 | extent_trunc(inode, &epos, eloc, etype, | 264 | extent_trunc(inode, &epos, &eloc, etype, |
265 | elen, 0); | 265 | elen, 0); |
266 | epos.offset += adsize; | 266 | epos.offset += adsize; |
267 | } | 267 | } |
@@ -269,7 +269,7 @@ void udf_truncate_extents(struct inode *inode) | |||
269 | 269 | ||
270 | if (indirect_ext_len) { | 270 | if (indirect_ext_len) { |
271 | BUG_ON(!epos.bh); | 271 | BUG_ON(!epos.bh); |
272 | udf_free_blocks(sb, inode, epos.block, 0, | 272 | udf_free_blocks(sb, inode, &epos.block, 0, |
273 | indirect_ext_len); | 273 | indirect_ext_len); |
274 | } else if (!epos.bh) { | 274 | } else if (!epos.bh) { |
275 | iinfo->i_lenAlloc = lenalloc; | 275 | iinfo->i_lenAlloc = lenalloc; |
@@ -278,7 +278,7 @@ void udf_truncate_extents(struct inode *inode) | |||
278 | udf_update_alloc_ext_desc(inode, &epos, lenalloc); | 278 | udf_update_alloc_ext_desc(inode, &epos, lenalloc); |
279 | } else if (inode->i_size) { | 279 | } else if (inode->i_size) { |
280 | if (byte_offset) { | 280 | if (byte_offset) { |
281 | kernel_long_ad extent; | 281 | struct kernel_long_ad extent; |
282 | 282 | ||
283 | /* | 283 | /* |
284 | * OK, there is not extent covering inode->i_size and | 284 | * OK, there is not extent covering inode->i_size and |
diff --git a/fs/udf/udf_i.h b/fs/udf/udf_i.h index 4f86b1d98a5d..e58d1de41073 100644 --- a/fs/udf/udf_i.h +++ b/fs/udf/udf_i.h | |||
@@ -4,7 +4,7 @@ | |||
4 | struct udf_inode_info { | 4 | struct udf_inode_info { |
5 | struct timespec i_crtime; | 5 | struct timespec i_crtime; |
6 | /* Physical address of inode */ | 6 | /* Physical address of inode */ |
7 | kernel_lb_addr i_location; | 7 | struct kernel_lb_addr i_location; |
8 | __u64 i_unique; | 8 | __u64 i_unique; |
9 | __u32 i_lenEAttr; | 9 | __u32 i_lenEAttr; |
10 | __u32 i_lenAlloc; | 10 | __u32 i_lenAlloc; |
@@ -17,8 +17,8 @@ struct udf_inode_info { | |||
17 | unsigned i_strat4096 : 1; | 17 | unsigned i_strat4096 : 1; |
18 | unsigned reserved : 26; | 18 | unsigned reserved : 26; |
19 | union { | 19 | union { |
20 | short_ad *i_sad; | 20 | struct short_ad *i_sad; |
21 | long_ad *i_lad; | 21 | struct long_ad *i_lad; |
22 | __u8 *i_data; | 22 | __u8 *i_data; |
23 | } i_ext; | 23 | } i_ext; |
24 | struct inode vfs_inode; | 24 | struct inode vfs_inode; |
diff --git a/fs/udf/udf_sb.h b/fs/udf/udf_sb.h index 1c1c514a9725..d113b72c2768 100644 --- a/fs/udf/udf_sb.h +++ b/fs/udf/udf_sb.h | |||
@@ -30,6 +30,7 @@ | |||
30 | #define UDF_FLAG_GID_SET 16 | 30 | #define UDF_FLAG_GID_SET 16 |
31 | #define UDF_FLAG_SESSION_SET 17 | 31 | #define UDF_FLAG_SESSION_SET 17 |
32 | #define UDF_FLAG_LASTBLOCK_SET 18 | 32 | #define UDF_FLAG_LASTBLOCK_SET 18 |
33 | #define UDF_FLAG_BLOCKSIZE_SET 19 | ||
33 | 34 | ||
34 | #define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001 | 35 | #define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001 |
35 | #define UDF_PART_FLAG_UNALLOC_TABLE 0x0002 | 36 | #define UDF_PART_FLAG_UNALLOC_TABLE 0x0002 |
@@ -48,6 +49,8 @@ | |||
48 | #define UDF_SPARABLE_MAP15 0x1522U | 49 | #define UDF_SPARABLE_MAP15 0x1522U |
49 | #define UDF_METADATA_MAP25 0x2511U | 50 | #define UDF_METADATA_MAP25 0x2511U |
50 | 51 | ||
52 | #define UDF_INVALID_MODE ((mode_t)-1) | ||
53 | |||
51 | #pragma pack(1) /* XXX(hch): Why? This file just defines in-core structures */ | 54 | #pragma pack(1) /* XXX(hch): Why? This file just defines in-core structures */ |
52 | 55 | ||
53 | struct udf_meta_data { | 56 | struct udf_meta_data { |
@@ -114,7 +117,7 @@ struct udf_sb_info { | |||
114 | 117 | ||
115 | /* Sector headers */ | 118 | /* Sector headers */ |
116 | __s32 s_session; | 119 | __s32 s_session; |
117 | __u32 s_anchor[3]; | 120 | __u32 s_anchor; |
118 | __u32 s_last_block; | 121 | __u32 s_last_block; |
119 | 122 | ||
120 | struct buffer_head *s_lvid_bh; | 123 | struct buffer_head *s_lvid_bh; |
@@ -123,6 +126,8 @@ struct udf_sb_info { | |||
123 | mode_t s_umask; | 126 | mode_t s_umask; |
124 | gid_t s_gid; | 127 | gid_t s_gid; |
125 | uid_t s_uid; | 128 | uid_t s_uid; |
129 | mode_t s_fmode; | ||
130 | mode_t s_dmode; | ||
126 | 131 | ||
127 | /* Root Info */ | 132 | /* Root Info */ |
128 | struct timespec s_record_time; | 133 | struct timespec s_record_time; |
@@ -143,6 +148,8 @@ struct udf_sb_info { | |||
143 | struct inode *s_vat_inode; | 148 | struct inode *s_vat_inode; |
144 | 149 | ||
145 | struct mutex s_alloc_mutex; | 150 | struct mutex s_alloc_mutex; |
151 | /* Protected by s_alloc_mutex */ | ||
152 | unsigned int s_lvid_dirty; | ||
146 | }; | 153 | }; |
147 | 154 | ||
148 | static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | 155 | static inline struct udf_sb_info *UDF_SB(struct super_block *sb) |
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 8ec865de5f13..cac51b77a5d1 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
@@ -62,10 +62,8 @@ static inline size_t udf_ext0_offset(struct inode *inode) | |||
62 | return 0; | 62 | return 0; |
63 | } | 63 | } |
64 | 64 | ||
65 | #define udf_get_lb_pblock(sb,loc,offset) udf_get_pblock((sb), (loc).logicalBlockNum, (loc).partitionReferenceNum, (offset)) | ||
66 | |||
67 | /* computes tag checksum */ | 65 | /* computes tag checksum */ |
68 | u8 udf_tag_checksum(const tag *t); | 66 | u8 udf_tag_checksum(const struct tag *t); |
69 | 67 | ||
70 | struct dentry; | 68 | struct dentry; |
71 | struct inode; | 69 | struct inode; |
@@ -95,7 +93,7 @@ struct udf_vds_record { | |||
95 | }; | 93 | }; |
96 | 94 | ||
97 | struct generic_desc { | 95 | struct generic_desc { |
98 | tag descTag; | 96 | struct tag descTag; |
99 | __le32 volDescSeqNum; | 97 | __le32 volDescSeqNum; |
100 | }; | 98 | }; |
101 | 99 | ||
@@ -108,11 +106,22 @@ struct ustr { | |||
108 | struct extent_position { | 106 | struct extent_position { |
109 | struct buffer_head *bh; | 107 | struct buffer_head *bh; |
110 | uint32_t offset; | 108 | uint32_t offset; |
111 | kernel_lb_addr block; | 109 | struct kernel_lb_addr block; |
112 | }; | 110 | }; |
113 | 111 | ||
114 | /* super.c */ | 112 | /* super.c */ |
115 | extern void udf_warning(struct super_block *, const char *, const char *, ...); | 113 | extern void udf_warning(struct super_block *, const char *, const char *, ...); |
114 | static inline void udf_updated_lvid(struct super_block *sb) | ||
115 | { | ||
116 | struct buffer_head *bh = UDF_SB(sb)->s_lvid_bh; | ||
117 | |||
118 | BUG_ON(!bh); | ||
119 | WARN_ON_ONCE(((struct logicalVolIntegrityDesc *) | ||
120 | bh->b_data)->integrityType != | ||
121 | cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN)); | ||
122 | sb->s_dirt = 1; | ||
123 | UDF_SB(sb)->s_lvid_dirty = 1; | ||
124 | } | ||
116 | 125 | ||
117 | /* namei.c */ | 126 | /* namei.c */ |
118 | extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, | 127 | extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, |
@@ -124,7 +133,7 @@ extern int udf_ioctl(struct inode *, struct file *, unsigned int, | |||
124 | unsigned long); | 133 | unsigned long); |
125 | 134 | ||
126 | /* inode.c */ | 135 | /* inode.c */ |
127 | extern struct inode *udf_iget(struct super_block *, kernel_lb_addr); | 136 | extern struct inode *udf_iget(struct super_block *, struct kernel_lb_addr *); |
128 | extern int udf_sync_inode(struct inode *); | 137 | extern int udf_sync_inode(struct inode *); |
129 | extern void udf_expand_file_adinicb(struct inode *, int, int *); | 138 | extern void udf_expand_file_adinicb(struct inode *, int, int *); |
130 | extern struct buffer_head *udf_expand_dir_adinicb(struct inode *, int *, int *); | 139 | extern struct buffer_head *udf_expand_dir_adinicb(struct inode *, int *, int *); |
@@ -136,19 +145,19 @@ extern void udf_clear_inode(struct inode *); | |||
136 | extern int udf_write_inode(struct inode *, int); | 145 | extern int udf_write_inode(struct inode *, int); |
137 | extern long udf_block_map(struct inode *, sector_t); | 146 | extern long udf_block_map(struct inode *, sector_t); |
138 | extern int udf_extend_file(struct inode *, struct extent_position *, | 147 | extern int udf_extend_file(struct inode *, struct extent_position *, |
139 | kernel_long_ad *, sector_t); | 148 | struct kernel_long_ad *, sector_t); |
140 | extern int8_t inode_bmap(struct inode *, sector_t, struct extent_position *, | 149 | extern int8_t inode_bmap(struct inode *, sector_t, struct extent_position *, |
141 | kernel_lb_addr *, uint32_t *, sector_t *); | 150 | struct kernel_lb_addr *, uint32_t *, sector_t *); |
142 | extern int8_t udf_add_aext(struct inode *, struct extent_position *, | 151 | extern int8_t udf_add_aext(struct inode *, struct extent_position *, |
143 | kernel_lb_addr, uint32_t, int); | 152 | struct kernel_lb_addr *, uint32_t, int); |
144 | extern int8_t udf_write_aext(struct inode *, struct extent_position *, | 153 | extern int8_t udf_write_aext(struct inode *, struct extent_position *, |
145 | kernel_lb_addr, uint32_t, int); | 154 | struct kernel_lb_addr *, uint32_t, int); |
146 | extern int8_t udf_delete_aext(struct inode *, struct extent_position, | 155 | extern int8_t udf_delete_aext(struct inode *, struct extent_position, |
147 | kernel_lb_addr, uint32_t); | 156 | struct kernel_lb_addr, uint32_t); |
148 | extern int8_t udf_next_aext(struct inode *, struct extent_position *, | 157 | extern int8_t udf_next_aext(struct inode *, struct extent_position *, |
149 | kernel_lb_addr *, uint32_t *, int); | 158 | struct kernel_lb_addr *, uint32_t *, int); |
150 | extern int8_t udf_current_aext(struct inode *, struct extent_position *, | 159 | extern int8_t udf_current_aext(struct inode *, struct extent_position *, |
151 | kernel_lb_addr *, uint32_t *, int); | 160 | struct kernel_lb_addr *, uint32_t *, int); |
152 | 161 | ||
153 | /* misc.c */ | 162 | /* misc.c */ |
154 | extern struct buffer_head *udf_tgetblk(struct super_block *, int); | 163 | extern struct buffer_head *udf_tgetblk(struct super_block *, int); |
@@ -160,7 +169,7 @@ extern struct genericFormat *udf_get_extendedattr(struct inode *, uint32_t, | |||
160 | extern struct buffer_head *udf_read_tagged(struct super_block *, uint32_t, | 169 | extern struct buffer_head *udf_read_tagged(struct super_block *, uint32_t, |
161 | uint32_t, uint16_t *); | 170 | uint32_t, uint16_t *); |
162 | extern struct buffer_head *udf_read_ptagged(struct super_block *, | 171 | extern struct buffer_head *udf_read_ptagged(struct super_block *, |
163 | kernel_lb_addr, uint32_t, | 172 | struct kernel_lb_addr *, uint32_t, |
164 | uint16_t *); | 173 | uint16_t *); |
165 | extern void udf_update_tag(char *, int); | 174 | extern void udf_update_tag(char *, int); |
166 | extern void udf_new_tag(char *, uint16_t, uint16_t, uint16_t, uint32_t, int); | 175 | extern void udf_new_tag(char *, uint16_t, uint16_t, uint16_t, uint32_t, int); |
@@ -182,6 +191,14 @@ extern uint32_t udf_get_pblock_meta25(struct super_block *, uint32_t, uint16_t, | |||
182 | uint32_t); | 191 | uint32_t); |
183 | extern int udf_relocate_blocks(struct super_block *, long, long *); | 192 | extern int udf_relocate_blocks(struct super_block *, long, long *); |
184 | 193 | ||
194 | static inline uint32_t | ||
195 | udf_get_lb_pblock(struct super_block *sb, struct kernel_lb_addr *loc, | ||
196 | uint32_t offset) | ||
197 | { | ||
198 | return udf_get_pblock(sb, loc->logicalBlockNum, | ||
199 | loc->partitionReferenceNum, offset); | ||
200 | } | ||
201 | |||
185 | /* unicode.c */ | 202 | /* unicode.c */ |
186 | extern int udf_get_filename(struct super_block *, uint8_t *, uint8_t *, int); | 203 | extern int udf_get_filename(struct super_block *, uint8_t *, uint8_t *, int); |
187 | extern int udf_put_filename(struct super_block *, const uint8_t *, uint8_t *, | 204 | extern int udf_put_filename(struct super_block *, const uint8_t *, uint8_t *, |
@@ -200,7 +217,7 @@ extern void udf_truncate_extents(struct inode *); | |||
200 | 217 | ||
201 | /* balloc.c */ | 218 | /* balloc.c */ |
202 | extern void udf_free_blocks(struct super_block *, struct inode *, | 219 | extern void udf_free_blocks(struct super_block *, struct inode *, |
203 | kernel_lb_addr, uint32_t, uint32_t); | 220 | struct kernel_lb_addr *, uint32_t, uint32_t); |
204 | extern int udf_prealloc_blocks(struct super_block *, struct inode *, uint16_t, | 221 | extern int udf_prealloc_blocks(struct super_block *, struct inode *, uint16_t, |
205 | uint32_t, uint32_t); | 222 | uint32_t, uint32_t); |
206 | extern int udf_new_block(struct super_block *, struct inode *, uint16_t, | 223 | extern int udf_new_block(struct super_block *, struct inode *, uint16_t, |
@@ -214,16 +231,16 @@ extern struct fileIdentDesc *udf_fileident_read(struct inode *, loff_t *, | |||
214 | struct udf_fileident_bh *, | 231 | struct udf_fileident_bh *, |
215 | struct fileIdentDesc *, | 232 | struct fileIdentDesc *, |
216 | struct extent_position *, | 233 | struct extent_position *, |
217 | kernel_lb_addr *, uint32_t *, | 234 | struct kernel_lb_addr *, uint32_t *, |
218 | sector_t *); | 235 | sector_t *); |
219 | extern struct fileIdentDesc *udf_get_fileident(void *buffer, int bufsize, | 236 | extern struct fileIdentDesc *udf_get_fileident(void *buffer, int bufsize, |
220 | int *offset); | 237 | int *offset); |
221 | extern long_ad *udf_get_filelongad(uint8_t *, int, uint32_t *, int); | 238 | extern struct long_ad *udf_get_filelongad(uint8_t *, int, uint32_t *, int); |
222 | extern short_ad *udf_get_fileshortad(uint8_t *, int, uint32_t *, int); | 239 | extern struct short_ad *udf_get_fileshortad(uint8_t *, int, uint32_t *, int); |
223 | 240 | ||
224 | /* udftime.c */ | 241 | /* udftime.c */ |
225 | extern struct timespec *udf_disk_stamp_to_time(struct timespec *dest, | 242 | extern struct timespec *udf_disk_stamp_to_time(struct timespec *dest, |
226 | timestamp src); | 243 | struct timestamp src); |
227 | extern timestamp *udf_time_to_disk_stamp(timestamp *dest, struct timespec src); | 244 | extern struct timestamp *udf_time_to_disk_stamp(struct timestamp *dest, struct timespec src); |
228 | 245 | ||
229 | #endif /* __UDF_DECL_H */ | 246 | #endif /* __UDF_DECL_H */ |
diff --git a/fs/udf/udfend.h b/fs/udf/udfend.h index 489f52fb428c..6a9f3a9cc428 100644 --- a/fs/udf/udfend.h +++ b/fs/udf/udfend.h | |||
@@ -4,9 +4,9 @@ | |||
4 | #include <asm/byteorder.h> | 4 | #include <asm/byteorder.h> |
5 | #include <linux/string.h> | 5 | #include <linux/string.h> |
6 | 6 | ||
7 | static inline kernel_lb_addr lelb_to_cpu(lb_addr in) | 7 | static inline struct kernel_lb_addr lelb_to_cpu(struct lb_addr in) |
8 | { | 8 | { |
9 | kernel_lb_addr out; | 9 | struct kernel_lb_addr out; |
10 | 10 | ||
11 | out.logicalBlockNum = le32_to_cpu(in.logicalBlockNum); | 11 | out.logicalBlockNum = le32_to_cpu(in.logicalBlockNum); |
12 | out.partitionReferenceNum = le16_to_cpu(in.partitionReferenceNum); | 12 | out.partitionReferenceNum = le16_to_cpu(in.partitionReferenceNum); |
@@ -14,9 +14,9 @@ static inline kernel_lb_addr lelb_to_cpu(lb_addr in) | |||
14 | return out; | 14 | return out; |
15 | } | 15 | } |
16 | 16 | ||
17 | static inline lb_addr cpu_to_lelb(kernel_lb_addr in) | 17 | static inline struct lb_addr cpu_to_lelb(struct kernel_lb_addr in) |
18 | { | 18 | { |
19 | lb_addr out; | 19 | struct lb_addr out; |
20 | 20 | ||
21 | out.logicalBlockNum = cpu_to_le32(in.logicalBlockNum); | 21 | out.logicalBlockNum = cpu_to_le32(in.logicalBlockNum); |
22 | out.partitionReferenceNum = cpu_to_le16(in.partitionReferenceNum); | 22 | out.partitionReferenceNum = cpu_to_le16(in.partitionReferenceNum); |
@@ -24,9 +24,9 @@ static inline lb_addr cpu_to_lelb(kernel_lb_addr in) | |||
24 | return out; | 24 | return out; |
25 | } | 25 | } |
26 | 26 | ||
27 | static inline short_ad lesa_to_cpu(short_ad in) | 27 | static inline struct short_ad lesa_to_cpu(struct short_ad in) |
28 | { | 28 | { |
29 | short_ad out; | 29 | struct short_ad out; |
30 | 30 | ||
31 | out.extLength = le32_to_cpu(in.extLength); | 31 | out.extLength = le32_to_cpu(in.extLength); |
32 | out.extPosition = le32_to_cpu(in.extPosition); | 32 | out.extPosition = le32_to_cpu(in.extPosition); |
@@ -34,9 +34,9 @@ static inline short_ad lesa_to_cpu(short_ad in) | |||
34 | return out; | 34 | return out; |
35 | } | 35 | } |
36 | 36 | ||
37 | static inline short_ad cpu_to_lesa(short_ad in) | 37 | static inline struct short_ad cpu_to_lesa(struct short_ad in) |
38 | { | 38 | { |
39 | short_ad out; | 39 | struct short_ad out; |
40 | 40 | ||
41 | out.extLength = cpu_to_le32(in.extLength); | 41 | out.extLength = cpu_to_le32(in.extLength); |
42 | out.extPosition = cpu_to_le32(in.extPosition); | 42 | out.extPosition = cpu_to_le32(in.extPosition); |
@@ -44,9 +44,9 @@ static inline short_ad cpu_to_lesa(short_ad in) | |||
44 | return out; | 44 | return out; |
45 | } | 45 | } |
46 | 46 | ||
47 | static inline kernel_long_ad lela_to_cpu(long_ad in) | 47 | static inline struct kernel_long_ad lela_to_cpu(struct long_ad in) |
48 | { | 48 | { |
49 | kernel_long_ad out; | 49 | struct kernel_long_ad out; |
50 | 50 | ||
51 | out.extLength = le32_to_cpu(in.extLength); | 51 | out.extLength = le32_to_cpu(in.extLength); |
52 | out.extLocation = lelb_to_cpu(in.extLocation); | 52 | out.extLocation = lelb_to_cpu(in.extLocation); |
@@ -54,9 +54,9 @@ static inline kernel_long_ad lela_to_cpu(long_ad in) | |||
54 | return out; | 54 | return out; |
55 | } | 55 | } |
56 | 56 | ||
57 | static inline long_ad cpu_to_lela(kernel_long_ad in) | 57 | static inline struct long_ad cpu_to_lela(struct kernel_long_ad in) |
58 | { | 58 | { |
59 | long_ad out; | 59 | struct long_ad out; |
60 | 60 | ||
61 | out.extLength = cpu_to_le32(in.extLength); | 61 | out.extLength = cpu_to_le32(in.extLength); |
62 | out.extLocation = cpu_to_lelb(in.extLocation); | 62 | out.extLocation = cpu_to_lelb(in.extLocation); |
@@ -64,9 +64,9 @@ static inline long_ad cpu_to_lela(kernel_long_ad in) | |||
64 | return out; | 64 | return out; |
65 | } | 65 | } |
66 | 66 | ||
67 | static inline kernel_extent_ad leea_to_cpu(extent_ad in) | 67 | static inline struct kernel_extent_ad leea_to_cpu(struct extent_ad in) |
68 | { | 68 | { |
69 | kernel_extent_ad out; | 69 | struct kernel_extent_ad out; |
70 | 70 | ||
71 | out.extLength = le32_to_cpu(in.extLength); | 71 | out.extLength = le32_to_cpu(in.extLength); |
72 | out.extLocation = le32_to_cpu(in.extLocation); | 72 | out.extLocation = le32_to_cpu(in.extLocation); |
diff --git a/fs/udf/udftime.c b/fs/udf/udftime.c index 5f811655c9b5..b8c828c4d200 100644 --- a/fs/udf/udftime.c +++ b/fs/udf/udftime.c | |||
@@ -85,7 +85,8 @@ extern struct timezone sys_tz; | |||
85 | #define SECS_PER_HOUR (60 * 60) | 85 | #define SECS_PER_HOUR (60 * 60) |
86 | #define SECS_PER_DAY (SECS_PER_HOUR * 24) | 86 | #define SECS_PER_DAY (SECS_PER_HOUR * 24) |
87 | 87 | ||
88 | struct timespec *udf_disk_stamp_to_time(struct timespec *dest, timestamp src) | 88 | struct timespec * |
89 | udf_disk_stamp_to_time(struct timespec *dest, struct timestamp src) | ||
89 | { | 90 | { |
90 | int yday; | 91 | int yday; |
91 | u16 typeAndTimezone = le16_to_cpu(src.typeAndTimezone); | 92 | u16 typeAndTimezone = le16_to_cpu(src.typeAndTimezone); |
@@ -116,7 +117,8 @@ struct timespec *udf_disk_stamp_to_time(struct timespec *dest, timestamp src) | |||
116 | return dest; | 117 | return dest; |
117 | } | 118 | } |
118 | 119 | ||
119 | timestamp *udf_time_to_disk_stamp(timestamp *dest, struct timespec ts) | 120 | struct timestamp * |
121 | udf_time_to_disk_stamp(struct timestamp *dest, struct timespec ts) | ||
120 | { | 122 | { |
121 | long int days, rem, y; | 123 | long int days, rem, y; |
122 | const unsigned short int *ip; | 124 | const unsigned short int *ip; |
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c index 9fdf8c93c58e..cefa8c8913e6 100644 --- a/fs/udf/unicode.c +++ b/fs/udf/unicode.c | |||
@@ -254,7 +254,7 @@ static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o, | |||
254 | { | 254 | { |
255 | const uint8_t *ocu; | 255 | const uint8_t *ocu; |
256 | uint8_t cmp_id, ocu_len; | 256 | uint8_t cmp_id, ocu_len; |
257 | int i; | 257 | int i, len; |
258 | 258 | ||
259 | 259 | ||
260 | ocu_len = ocu_i->u_len; | 260 | ocu_len = ocu_i->u_len; |
@@ -279,8 +279,13 @@ static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o, | |||
279 | if (cmp_id == 16) | 279 | if (cmp_id == 16) |
280 | c = (c << 8) | ocu[i++]; | 280 | c = (c << 8) | ocu[i++]; |
281 | 281 | ||
282 | utf_o->u_len += nls->uni2char(c, &utf_o->u_name[utf_o->u_len], | 282 | len = nls->uni2char(c, &utf_o->u_name[utf_o->u_len], |
283 | UDF_NAME_LEN - utf_o->u_len); | 283 | UDF_NAME_LEN - utf_o->u_len); |
284 | /* Valid character? */ | ||
285 | if (len >= 0) | ||
286 | utf_o->u_len += len; | ||
287 | else | ||
288 | utf_o->u_name[utf_o->u_len++] = '?'; | ||
284 | } | 289 | } |
285 | utf_o->u_cmpID = 8; | 290 | utf_o->u_cmpID = 8; |
286 | 291 | ||
@@ -290,7 +295,8 @@ static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o, | |||
290 | static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni, | 295 | static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni, |
291 | int length) | 296 | int length) |
292 | { | 297 | { |
293 | unsigned len, i, max_val; | 298 | int len; |
299 | unsigned i, max_val; | ||
294 | uint16_t uni_char; | 300 | uint16_t uni_char; |
295 | int u_len; | 301 | int u_len; |
296 | 302 | ||
@@ -302,8 +308,13 @@ try_again: | |||
302 | u_len = 0U; | 308 | u_len = 0U; |
303 | for (i = 0U; i < uni->u_len; i++) { | 309 | for (i = 0U; i < uni->u_len; i++) { |
304 | len = nls->char2uni(&uni->u_name[i], uni->u_len - i, &uni_char); | 310 | len = nls->char2uni(&uni->u_name[i], uni->u_len - i, &uni_char); |
305 | if (len <= 0) | 311 | if (!len) |
306 | continue; | 312 | continue; |
313 | /* Invalid character, deal with it */ | ||
314 | if (len < 0) { | ||
315 | len = 1; | ||
316 | uni_char = '?'; | ||
317 | } | ||
307 | 318 | ||
308 | if (uni_char > max_val) { | 319 | if (uni_char > max_val) { |
309 | max_val = 0xffffU; | 320 | max_val = 0xffffU; |
@@ -324,34 +335,43 @@ try_again: | |||
324 | int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, | 335 | int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname, |
325 | int flen) | 336 | int flen) |
326 | { | 337 | { |
327 | struct ustr filename, unifilename; | 338 | struct ustr *filename, *unifilename; |
328 | int len; | 339 | int len = 0; |
329 | 340 | ||
330 | if (udf_build_ustr_exact(&unifilename, sname, flen)) | 341 | filename = kmalloc(sizeof(struct ustr), GFP_NOFS); |
342 | if (!filename) | ||
331 | return 0; | 343 | return 0; |
332 | 344 | ||
345 | unifilename = kmalloc(sizeof(struct ustr), GFP_NOFS); | ||
346 | if (!unifilename) | ||
347 | goto out1; | ||
348 | |||
349 | if (udf_build_ustr_exact(unifilename, sname, flen)) | ||
350 | goto out2; | ||
351 | |||
333 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { | 352 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { |
334 | if (!udf_CS0toUTF8(&filename, &unifilename)) { | 353 | if (!udf_CS0toUTF8(filename, unifilename)) { |
335 | udf_debug("Failed in udf_get_filename: sname = %s\n", | 354 | udf_debug("Failed in udf_get_filename: sname = %s\n", |
336 | sname); | 355 | sname); |
337 | return 0; | 356 | goto out2; |
338 | } | 357 | } |
339 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { | 358 | } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { |
340 | if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, &filename, | 359 | if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, filename, |
341 | &unifilename)) { | 360 | unifilename)) { |
342 | udf_debug("Failed in udf_get_filename: sname = %s\n", | 361 | udf_debug("Failed in udf_get_filename: sname = %s\n", |
343 | sname); | 362 | sname); |
344 | return 0; | 363 | goto out2; |
345 | } | 364 | } |
346 | } else | 365 | } else |
347 | return 0; | 366 | goto out2; |
348 | 367 | ||
349 | len = udf_translate_to_linux(dname, filename.u_name, filename.u_len, | 368 | len = udf_translate_to_linux(dname, filename->u_name, filename->u_len, |
350 | unifilename.u_name, unifilename.u_len); | 369 | unifilename->u_name, unifilename->u_len); |
351 | if (len) | 370 | out2: |
352 | return len; | 371 | kfree(unifilename); |
353 | 372 | out1: | |
354 | return 0; | 373 | kfree(filename); |
374 | return len; | ||
355 | } | 375 | } |
356 | 376 | ||
357 | int udf_put_filename(struct super_block *sb, const uint8_t *sname, | 377 | int udf_put_filename(struct super_block *sb, const uint8_t *sname, |