diff options
| -rw-r--r-- | fs/udf/balloc.c | 136 | ||||
| -rw-r--r-- | fs/udf/file.c | 2 | ||||
| -rw-r--r-- | fs/udf/ialloc.c | 33 | ||||
| -rw-r--r-- | fs/udf/inode.c | 34 | ||||
| -rw-r--r-- | fs/udf/misc.c | 15 | ||||
| -rw-r--r-- | fs/udf/namei.c | 24 | ||||
| -rw-r--r-- | fs/udf/partition.c | 67 | ||||
| -rw-r--r-- | fs/udf/super.c | 546 | ||||
| -rw-r--r-- | fs/udf/truncate.c | 7 | ||||
| -rw-r--r-- | fs/udf/udf_sb.h | 75 | ||||
| -rw-r--r-- | include/linux/udf_fs_sb.h | 12 |
11 files changed, 509 insertions, 442 deletions
diff --git a/fs/udf/balloc.c b/fs/udf/balloc.c index ab26176f6b91..8c0c27912278 100644 --- a/fs/udf/balloc.c +++ b/fs/udf/balloc.c | |||
| @@ -88,7 +88,7 @@ static int read_block_bitmap(struct super_block *sb, | |||
| 88 | kernel_lb_addr loc; | 88 | kernel_lb_addr loc; |
| 89 | 89 | ||
| 90 | loc.logicalBlockNum = bitmap->s_extPosition; | 90 | loc.logicalBlockNum = bitmap->s_extPosition; |
| 91 | loc.partitionReferenceNum = UDF_SB_PARTITION(sb); | 91 | loc.partitionReferenceNum = UDF_SB(sb)->s_partition; |
| 92 | 92 | ||
| 93 | bh = udf_tread(sb, udf_get_lb_pblock(sb, loc, block)); | 93 | bh = udf_tread(sb, udf_get_lb_pblock(sb, loc, block)); |
| 94 | if (!bh) { | 94 | if (!bh) { |
| @@ -155,10 +155,10 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
| 155 | 155 | ||
| 156 | mutex_lock(&sbi->s_alloc_mutex); | 156 | mutex_lock(&sbi->s_alloc_mutex); |
| 157 | if (bloc.logicalBlockNum < 0 || | 157 | if (bloc.logicalBlockNum < 0 || |
| 158 | (bloc.logicalBlockNum + count) > UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)) { | 158 | (bloc.logicalBlockNum + count) > sbi->s_partmaps[bloc.partitionReferenceNum].s_partition_len) { |
| 159 | udf_debug("%d < %d || %d + %d > %d\n", | 159 | udf_debug("%d < %d || %d + %d > %d\n", |
| 160 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, | 160 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, |
| 161 | UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)); | 161 | sbi->s_partmaps[bloc.partitionReferenceNum].s_partition_len); |
| 162 | goto error_return; | 162 | goto error_return; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| @@ -188,9 +188,10 @@ do_more: | |||
| 188 | } else { | 188 | } else { |
| 189 | if (inode) | 189 | if (inode) |
| 190 | DQUOT_FREE_BLOCK(inode, 1); | 190 | DQUOT_FREE_BLOCK(inode, 1); |
| 191 | if (UDF_SB_LVIDBH(sb)) { | 191 | if (sbi->s_lvid_bh) { |
| 192 | UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)] = | 192 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
| 193 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]) + 1); | 193 | lvid->freeSpaceTable[sbi->s_partition] = |
| 194 | cpu_to_le32(le32_to_cpu(lvid->freeSpaceTable[sbi->s_partition]) + 1); | ||
| 194 | } | 195 | } |
| 195 | } | 196 | } |
| 196 | } | 197 | } |
| @@ -202,8 +203,8 @@ do_more: | |||
| 202 | } | 203 | } |
| 203 | error_return: | 204 | error_return: |
| 204 | sb->s_dirt = 1; | 205 | sb->s_dirt = 1; |
| 205 | if (UDF_SB_LVIDBH(sb)) | 206 | if (sbi->s_lvid_bh) |
| 206 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 207 | mark_buffer_dirty(sbi->s_lvid_bh); |
| 207 | mutex_unlock(&sbi->s_alloc_mutex); | 208 | mutex_unlock(&sbi->s_alloc_mutex); |
| 208 | return; | 209 | return; |
| 209 | } | 210 | } |
| @@ -219,16 +220,18 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, | |||
| 219 | int bit, block, block_group, group_start; | 220 | int bit, block, block_group, group_start; |
| 220 | int nr_groups, bitmap_nr; | 221 | int nr_groups, bitmap_nr; |
| 221 | struct buffer_head *bh; | 222 | struct buffer_head *bh; |
| 223 | __u32 part_len; | ||
| 222 | 224 | ||
| 223 | mutex_lock(&sbi->s_alloc_mutex); | 225 | mutex_lock(&sbi->s_alloc_mutex); |
| 224 | if (first_block < 0 || first_block >= UDF_SB_PARTLEN(sb, partition)) | 226 | part_len = sbi->s_partmaps[partition].s_partition_len; |
| 227 | if (first_block < 0 || first_block >= part_len) | ||
| 225 | goto out; | 228 | goto out; |
| 226 | 229 | ||
| 227 | if (first_block + block_count > UDF_SB_PARTLEN(sb, partition)) | 230 | if (first_block + block_count > part_len) |
| 228 | block_count = UDF_SB_PARTLEN(sb, partition) - first_block; | 231 | block_count = part_len - first_block; |
| 229 | 232 | ||
| 230 | repeat: | 233 | repeat: |
| 231 | nr_groups = (UDF_SB_PARTLEN(sb, partition) + | 234 | nr_groups = (sbi->s_partmaps[partition].s_partition_len + |
| 232 | (sizeof(struct spaceBitmapDesc) << 3) + | 235 | (sizeof(struct spaceBitmapDesc) << 3) + |
| 233 | (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); | 236 | (sb->s_blocksize * 8) - 1) / (sb->s_blocksize * 8); |
| 234 | block = first_block + (sizeof(struct spaceBitmapDesc) << 3); | 237 | block = first_block + (sizeof(struct spaceBitmapDesc) << 3); |
| @@ -261,10 +264,11 @@ repeat: | |||
| 261 | if (block_count > 0) | 264 | if (block_count > 0) |
| 262 | goto repeat; | 265 | goto repeat; |
| 263 | out: | 266 | out: |
| 264 | if (UDF_SB_LVIDBH(sb)) { | 267 | if (sbi->s_lvid_bh) { |
| 265 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 268 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
| 266 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - alloc_count); | 269 | lvid->freeSpaceTable[partition] = |
| 267 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 270 | cpu_to_le32(le32_to_cpu(lvid->freeSpaceTable[partition]) - alloc_count); |
| 271 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
| 268 | } | 272 | } |
| 269 | sb->s_dirt = 1; | 273 | sb->s_dirt = 1; |
| 270 | mutex_unlock(&sbi->s_alloc_mutex); | 274 | mutex_unlock(&sbi->s_alloc_mutex); |
| @@ -287,7 +291,7 @@ static int udf_bitmap_new_block(struct super_block *sb, | |||
| 287 | mutex_lock(&sbi->s_alloc_mutex); | 291 | mutex_lock(&sbi->s_alloc_mutex); |
| 288 | 292 | ||
| 289 | repeat: | 293 | repeat: |
| 290 | if (goal < 0 || goal >= UDF_SB_PARTLEN(sb, partition)) | 294 | if (goal < 0 || goal >= sbi->s_partmaps[partition].s_partition_len) |
| 291 | goal = 0; | 295 | goal = 0; |
| 292 | 296 | ||
| 293 | nr_groups = bitmap->s_nr_groups; | 297 | nr_groups = bitmap->s_nr_groups; |
| @@ -389,10 +393,11 @@ got_block: | |||
| 389 | 393 | ||
| 390 | mark_buffer_dirty(bh); | 394 | mark_buffer_dirty(bh); |
| 391 | 395 | ||
| 392 | if (UDF_SB_LVIDBH(sb)) { | 396 | if (sbi->s_lvid_bh) { |
| 393 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 397 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
| 394 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - 1); | 398 | lvid->freeSpaceTable[partition] = |
| 395 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 399 | cpu_to_le32(le32_to_cpu(lvid->freeSpaceTable[partition]) - 1); |
| 400 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
| 396 | } | 401 | } |
| 397 | sb->s_dirt = 1; | 402 | sb->s_dirt = 1; |
| 398 | mutex_unlock(&sbi->s_alloc_mutex); | 403 | mutex_unlock(&sbi->s_alloc_mutex); |
| @@ -421,10 +426,10 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 421 | 426 | ||
| 422 | mutex_lock(&sbi->s_alloc_mutex); | 427 | mutex_lock(&sbi->s_alloc_mutex); |
| 423 | if (bloc.logicalBlockNum < 0 || | 428 | if (bloc.logicalBlockNum < 0 || |
| 424 | (bloc.logicalBlockNum + count) > UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)) { | 429 | (bloc.logicalBlockNum + count) > sbi->s_partmaps[bloc.partitionReferenceNum].s_partition_len) { |
| 425 | udf_debug("%d < %d || %d + %d > %d\n", | 430 | udf_debug("%d < %d || %d + %d > %d\n", |
| 426 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, | 431 | bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count, |
| 427 | UDF_SB_PARTLEN(sb, bloc.partitionReferenceNum)); | 432 | sbi->s_partmaps[bloc.partitionReferenceNum]->s_partition_len); |
| 428 | goto error_return; | 433 | goto error_return; |
| 429 | } | 434 | } |
| 430 | 435 | ||
| @@ -432,10 +437,11 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 432 | but.. oh well */ | 437 | but.. oh well */ |
| 433 | if (inode) | 438 | if (inode) |
| 434 | DQUOT_FREE_BLOCK(inode, count); | 439 | DQUOT_FREE_BLOCK(inode, count); |
| 435 | if (UDF_SB_LVIDBH(sb)) { | 440 | if (sbi->s_lvid_bh) { |
| 436 | UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)] = | 441 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
| 437 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]) + count); | 442 | lvid->freeSpaceTable[sbi->s_partition] = |
| 438 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 443 | cpu_to_le32(le32_to_cpu(lvid->freeSpaceTable[sbi->s_partition]) + count); |
| 444 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
| 439 | } | 445 | } |
| 440 | 446 | ||
| 441 | start = bloc.logicalBlockNum + offset; | 447 | start = bloc.logicalBlockNum + offset; |
| @@ -559,7 +565,7 @@ static void udf_table_free_blocks(struct super_block *sb, | |||
| 559 | } | 565 | } |
| 560 | epos.offset = sizeof(struct allocExtDesc); | 566 | epos.offset = sizeof(struct allocExtDesc); |
| 561 | } | 567 | } |
| 562 | if (UDF_SB_UDFREV(sb) >= 0x0200) | 568 | if (sbi->s_udfrev >= 0x0200) |
| 563 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, 3, 1, | 569 | udf_new_tag(epos.bh->b_data, TAG_IDENT_AED, 3, 1, |
| 564 | epos.block.logicalBlockNum, sizeof(tag)); | 570 | epos.block.logicalBlockNum, sizeof(tag)); |
| 565 | else | 571 | else |
| @@ -627,7 +633,7 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
| 627 | struct extent_position epos; | 633 | struct extent_position epos; |
| 628 | int8_t etype = -1; | 634 | int8_t etype = -1; |
| 629 | 635 | ||
| 630 | if (first_block < 0 || first_block >= UDF_SB_PARTLEN(sb, partition)) | 636 | if (first_block < 0 || first_block >= sbi->s_partmaps[partition].s_partition_len) |
| 631 | return 0; | 637 | return 0; |
| 632 | 638 | ||
| 633 | if (UDF_I_ALLOCTYPE(table) == ICBTAG_FLAG_AD_SHORT) | 639 | if (UDF_I_ALLOCTYPE(table) == ICBTAG_FLAG_AD_SHORT) |
| @@ -670,10 +676,11 @@ static int udf_table_prealloc_blocks(struct super_block *sb, | |||
| 670 | 676 | ||
| 671 | brelse(epos.bh); | 677 | brelse(epos.bh); |
| 672 | 678 | ||
| 673 | if (alloc_count && UDF_SB_LVIDBH(sb)) { | 679 | if (alloc_count && sbi->s_lvid_bh) { |
| 674 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 680 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
| 675 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - alloc_count); | 681 | lvid->freeSpaceTable[partition] = |
| 676 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 682 | cpu_to_le32(le32_to_cpu(lvid->freeSpaceTable[partition]) - alloc_count); |
| 683 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
| 677 | sb->s_dirt = 1; | 684 | sb->s_dirt = 1; |
| 678 | } | 685 | } |
| 679 | mutex_unlock(&sbi->s_alloc_mutex); | 686 | mutex_unlock(&sbi->s_alloc_mutex); |
| @@ -703,7 +710,7 @@ static int udf_table_new_block(struct super_block *sb, | |||
| 703 | return newblock; | 710 | return newblock; |
| 704 | 711 | ||
| 705 | mutex_lock(&sbi->s_alloc_mutex); | 712 | mutex_lock(&sbi->s_alloc_mutex); |
| 706 | if (goal < 0 || goal >= UDF_SB_PARTLEN(sb, partition)) | 713 | if (goal < 0 || goal >= sbi->s_partmaps[partition].s_partition_len) |
| 707 | goal = 0; | 714 | goal = 0; |
| 708 | 715 | ||
| 709 | /* We search for the closest matching block to goal. If we find a exact hit, | 716 | /* We search for the closest matching block to goal. If we find a exact hit, |
| @@ -771,10 +778,11 @@ static int udf_table_new_block(struct super_block *sb, | |||
| 771 | udf_delete_aext(table, goal_epos, goal_eloc, goal_elen); | 778 | udf_delete_aext(table, goal_epos, goal_eloc, goal_elen); |
| 772 | brelse(goal_epos.bh); | 779 | brelse(goal_epos.bh); |
| 773 | 780 | ||
| 774 | if (UDF_SB_LVIDBH(sb)) { | 781 | if (sbi->s_lvid_bh) { |
| 775 | UDF_SB_LVID(sb)->freeSpaceTable[partition] = | 782 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
| 776 | cpu_to_le32(le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[partition]) - 1); | 783 | lvid->freeSpaceTable[partition] = |
| 777 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 784 | cpu_to_le32(le32_to_cpu(lvid->freeSpaceTable[partition]) - 1); |
| 785 | mark_buffer_dirty(sbi->s_lvid_bh); | ||
| 778 | } | 786 | } |
| 779 | 787 | ||
| 780 | sb->s_dirt = 1; | 788 | sb->s_dirt = 1; |
| @@ -789,22 +797,23 @@ inline void udf_free_blocks(struct super_block *sb, | |||
| 789 | uint32_t count) | 797 | uint32_t count) |
| 790 | { | 798 | { |
| 791 | uint16_t partition = bloc.partitionReferenceNum; | 799 | uint16_t partition = bloc.partitionReferenceNum; |
| 800 | struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; | ||
| 792 | 801 | ||
| 793 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { | 802 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { |
| 794 | return udf_bitmap_free_blocks(sb, inode, | 803 | return udf_bitmap_free_blocks(sb, inode, |
| 795 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_bitmap, | 804 | map->s_uspace.s_bitmap, |
| 796 | bloc, offset, count); | 805 | bloc, offset, count); |
| 797 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) { | 806 | } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 798 | return udf_table_free_blocks(sb, inode, | 807 | return udf_table_free_blocks(sb, inode, |
| 799 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_table, | 808 | map->s_uspace.s_table, |
| 800 | bloc, offset, count); | 809 | bloc, offset, count); |
| 801 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { | 810 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { |
| 802 | return udf_bitmap_free_blocks(sb, inode, | 811 | return udf_bitmap_free_blocks(sb, inode, |
| 803 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_bitmap, | 812 | map->s_fspace.s_bitmap, |
| 804 | bloc, offset, count); | 813 | bloc, offset, count); |
| 805 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { | 814 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { |
| 806 | return udf_table_free_blocks(sb, inode, | 815 | return udf_table_free_blocks(sb, inode, |
| 807 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_table, | 816 | map->s_fspace.s_table, |
| 808 | bloc, offset, count); | 817 | bloc, offset, count); |
| 809 | } else { | 818 | } else { |
| 810 | return; | 819 | return; |
| @@ -816,21 +825,23 @@ inline int udf_prealloc_blocks(struct super_block *sb, | |||
| 816 | uint16_t partition, uint32_t first_block, | 825 | uint16_t partition, uint32_t first_block, |
| 817 | uint32_t block_count) | 826 | uint32_t block_count) |
| 818 | { | 827 | { |
| 819 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { | 828 | struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; |
| 829 | |||
| 830 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { | ||
| 820 | return udf_bitmap_prealloc_blocks(sb, inode, | 831 | return udf_bitmap_prealloc_blocks(sb, inode, |
| 821 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_bitmap, | 832 | map->s_uspace.s_bitmap, |
| 822 | partition, first_block, block_count); | 833 | partition, first_block, block_count); |
| 823 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) { | 834 | } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 824 | return udf_table_prealloc_blocks(sb, inode, | 835 | return udf_table_prealloc_blocks(sb, inode, |
| 825 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_table, | 836 | map->s_uspace.s_table, |
| 826 | partition, first_block, block_count); | 837 | partition, first_block, block_count); |
| 827 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { | 838 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { |
| 828 | return udf_bitmap_prealloc_blocks(sb, inode, | 839 | return udf_bitmap_prealloc_blocks(sb, inode, |
| 829 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_bitmap, | 840 | map->s_fspace.s_bitmap, |
| 830 | partition, first_block, block_count); | 841 | partition, first_block, block_count); |
| 831 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { | 842 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { |
| 832 | return udf_table_prealloc_blocks(sb, inode, | 843 | return udf_table_prealloc_blocks(sb, inode, |
| 833 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_table, | 844 | map->s_fspace.s_table, |
| 834 | partition, first_block, block_count); | 845 | partition, first_block, block_count); |
| 835 | } else { | 846 | } else { |
| 836 | return 0; | 847 | return 0; |
| @@ -842,23 +853,24 @@ inline int udf_new_block(struct super_block *sb, | |||
| 842 | uint16_t partition, uint32_t goal, int *err) | 853 | uint16_t partition, uint32_t goal, int *err) |
| 843 | { | 854 | { |
| 844 | int ret; | 855 | int ret; |
| 856 | struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition]; | ||
| 845 | 857 | ||
| 846 | if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_BITMAP) { | 858 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { |
| 847 | ret = udf_bitmap_new_block(sb, inode, | 859 | ret = udf_bitmap_new_block(sb, inode, |
| 848 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_bitmap, | 860 | map->s_uspace.s_bitmap, |
| 849 | partition, goal, err); | 861 | partition, goal, err); |
| 850 | return ret; | 862 | return ret; |
| 851 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_UNALLOC_TABLE) { | 863 | } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 852 | return udf_table_new_block(sb, inode, | 864 | return udf_table_new_block(sb, inode, |
| 853 | UDF_SB_PARTMAPS(sb)[partition].s_uspace.s_table, | 865 | map->s_uspace.s_table, |
| 854 | partition, goal, err); | 866 | partition, goal, err); |
| 855 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_BITMAP) { | 867 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { |
| 856 | return udf_bitmap_new_block(sb, inode, | 868 | return udf_bitmap_new_block(sb, inode, |
| 857 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_bitmap, | 869 | map->s_fspace.s_bitmap, |
| 858 | partition, goal, err); | 870 | partition, goal, err); |
| 859 | } else if (UDF_SB_PARTFLAGS(sb, partition) & UDF_PART_FLAG_FREED_TABLE) { | 871 | } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { |
| 860 | return udf_table_new_block(sb, inode, | 872 | return udf_table_new_block(sb, inode, |
| 861 | UDF_SB_PARTMAPS(sb)[partition].s_fspace.s_table, | 873 | map->s_fspace.s_table, |
| 862 | partition, goal, err); | 874 | partition, goal, err); |
| 863 | } else { | 875 | } else { |
| 864 | *err = -EIO; | 876 | *err = -EIO; |
diff --git a/fs/udf/file.c b/fs/udf/file.c index 7c7a1b39d56c..3bd5068877fa 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -192,7 +192,7 @@ int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
| 192 | switch (cmd) { | 192 | switch (cmd) { |
| 193 | case UDF_GETVOLIDENT: | 193 | case UDF_GETVOLIDENT: |
| 194 | return copy_to_user((char __user *)arg, | 194 | return copy_to_user((char __user *)arg, |
| 195 | UDF_SB_VOLIDENT(inode->i_sb), 32) ? -EFAULT : 0; | 195 | UDF_SB(inode->i_sb)->s_volume_ident, 32) ? -EFAULT : 0; |
| 196 | case UDF_RELOCATE_BLOCKS: | 196 | case UDF_RELOCATE_BLOCKS: |
| 197 | if (!capable(CAP_SYS_ADMIN)) | 197 | if (!capable(CAP_SYS_ADMIN)) |
| 198 | return -EACCES; | 198 | return -EACCES; |
diff --git a/fs/udf/ialloc.c b/fs/udf/ialloc.c index 636d8f613929..8145e943be61 100644 --- a/fs/udf/ialloc.c +++ b/fs/udf/ialloc.c | |||
| @@ -43,15 +43,17 @@ void udf_free_inode(struct inode *inode) | |||
| 43 | clear_inode(inode); | 43 | clear_inode(inode); |
| 44 | 44 | ||
| 45 | mutex_lock(&sbi->s_alloc_mutex); | 45 | mutex_lock(&sbi->s_alloc_mutex); |
| 46 | if (sbi->s_lvidbh) { | 46 | if (sbi->s_lvid_bh) { |
| 47 | struct logicalVolIntegrityDescImpUse *lvidiu = | ||
| 48 | udf_sb_lvidiu(sbi); | ||
| 47 | if (S_ISDIR(inode->i_mode)) | 49 | if (S_ISDIR(inode->i_mode)) |
| 48 | UDF_SB_LVIDIU(sb)->numDirs = | 50 | lvidiu->numDirs = |
| 49 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs) - 1); | 51 | cpu_to_le32(le32_to_cpu(lvidiu->numDirs) - 1); |
| 50 | else | 52 | else |
| 51 | UDF_SB_LVIDIU(sb)->numFiles = | 53 | lvidiu->numFiles = |
| 52 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) - 1); | 54 | cpu_to_le32(le32_to_cpu(lvidiu->numFiles) - 1); |
| 53 | 55 | ||
| 54 | mark_buffer_dirty(sbi->s_lvidbh); | 56 | mark_buffer_dirty(sbi->s_lvid_bh); |
| 55 | } | 57 | } |
| 56 | mutex_unlock(&sbi->s_alloc_mutex); | 58 | mutex_unlock(&sbi->s_alloc_mutex); |
| 57 | 59 | ||
| @@ -88,21 +90,23 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 88 | } | 90 | } |
| 89 | 91 | ||
| 90 | mutex_lock(&sbi->s_alloc_mutex); | 92 | mutex_lock(&sbi->s_alloc_mutex); |
| 91 | if (UDF_SB_LVIDBH(sb)) { | 93 | if (sbi->s_lvid_bh) { |
| 94 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; | ||
| 95 | struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sbi); | ||
| 92 | struct logicalVolHeaderDesc *lvhd; | 96 | struct logicalVolHeaderDesc *lvhd; |
| 93 | uint64_t uniqueID; | 97 | uint64_t uniqueID; |
| 94 | lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(sb)->logicalVolContentsUse); | 98 | lvhd = (struct logicalVolHeaderDesc *)(lvid->logicalVolContentsUse); |
| 95 | if (S_ISDIR(mode)) | 99 | if (S_ISDIR(mode)) |
| 96 | UDF_SB_LVIDIU(sb)->numDirs = | 100 | lvidiu->numDirs = |
| 97 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs) + 1); | 101 | cpu_to_le32(le32_to_cpu(lvidiu->numDirs) + 1); |
| 98 | else | 102 | else |
| 99 | UDF_SB_LVIDIU(sb)->numFiles = | 103 | lvidiu->numFiles = |
| 100 | cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) + 1); | 104 | cpu_to_le32(le32_to_cpu(lvidiu->numFiles) + 1); |
| 101 | UDF_I_UNIQUE(inode) = uniqueID = le64_to_cpu(lvhd->uniqueID); | 105 | UDF_I_UNIQUE(inode) = uniqueID = le64_to_cpu(lvhd->uniqueID); |
| 102 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) | 106 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) |
| 103 | uniqueID += 16; | 107 | uniqueID += 16; |
| 104 | lvhd->uniqueID = cpu_to_le64(uniqueID); | 108 | lvhd->uniqueID = cpu_to_le64(uniqueID); |
| 105 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 109 | mark_buffer_dirty(sbi->s_lvid_bh); |
| 106 | } | 110 | } |
| 107 | inode->i_mode = mode; | 111 | inode->i_mode = mode; |
| 108 | inode->i_uid = current->fsuid; | 112 | inode->i_uid = current->fsuid; |
| @@ -123,7 +127,8 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err) | |||
| 123 | UDF_I_USE(inode) = 0; | 127 | UDF_I_USE(inode) = 0; |
| 124 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { | 128 | if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_EXTENDED_FE)) { |
| 125 | UDF_I_EFE(inode) = 1; | 129 | UDF_I_EFE(inode) = 1; |
| 126 | UDF_UPDATE_UDFREV(inode->i_sb, UDF_VERS_USE_EXTENDED_FE); | 130 | if (UDF_VERS_USE_EXTENDED_FE > sbi->s_udfrev) |
| 131 | sbi->s_udfrev = UDF_VERS_USE_EXTENDED_FE; | ||
| 127 | UDF_I_DATA(inode) = kzalloc(inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry), GFP_KERNEL); | 132 | UDF_I_DATA(inode) = kzalloc(inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry), GFP_KERNEL); |
| 128 | } else { | 133 | } else { |
| 129 | UDF_I_EFE(inode) = 0; | 134 | UDF_I_EFE(inode) = 0; |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 6ff8151984cf..2eb1220e4236 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -1081,6 +1081,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1081 | time_t convtime; | 1081 | time_t convtime; |
| 1082 | long convtime_usec; | 1082 | long convtime_usec; |
| 1083 | int offset; | 1083 | int offset; |
| 1084 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); | ||
| 1084 | 1085 | ||
| 1085 | fe = (struct fileEntry *)bh->b_data; | 1086 | fe = (struct fileEntry *)bh->b_data; |
| 1086 | efe = (struct extendedFileEntry *)bh->b_data; | 1087 | efe = (struct extendedFileEntry *)bh->b_data; |
| @@ -1160,7 +1161,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1160 | inode->i_atime.tv_sec = convtime; | 1161 | inode->i_atime.tv_sec = convtime; |
| 1161 | inode->i_atime.tv_nsec = convtime_usec * 1000; | 1162 | inode->i_atime.tv_nsec = convtime_usec * 1000; |
| 1162 | } else { | 1163 | } else { |
| 1163 | inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb); | 1164 | inode->i_atime = sbi->s_record_time; |
| 1164 | } | 1165 | } |
| 1165 | 1166 | ||
| 1166 | if (udf_stamp_to_time(&convtime, &convtime_usec, | 1167 | if (udf_stamp_to_time(&convtime, &convtime_usec, |
| @@ -1168,7 +1169,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1168 | inode->i_mtime.tv_sec = convtime; | 1169 | inode->i_mtime.tv_sec = convtime; |
| 1169 | inode->i_mtime.tv_nsec = convtime_usec * 1000; | 1170 | inode->i_mtime.tv_nsec = convtime_usec * 1000; |
| 1170 | } else { | 1171 | } else { |
| 1171 | inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb); | 1172 | inode->i_mtime = sbi->s_record_time; |
| 1172 | } | 1173 | } |
| 1173 | 1174 | ||
| 1174 | if (udf_stamp_to_time(&convtime, &convtime_usec, | 1175 | if (udf_stamp_to_time(&convtime, &convtime_usec, |
| @@ -1176,7 +1177,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1176 | inode->i_ctime.tv_sec = convtime; | 1177 | inode->i_ctime.tv_sec = convtime; |
| 1177 | inode->i_ctime.tv_nsec = convtime_usec * 1000; | 1178 | inode->i_ctime.tv_nsec = convtime_usec * 1000; |
| 1178 | } else { | 1179 | } else { |
| 1179 | inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb); | 1180 | inode->i_ctime = sbi->s_record_time; |
| 1180 | } | 1181 | } |
| 1181 | 1182 | ||
| 1182 | UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID); | 1183 | UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID); |
| @@ -1192,7 +1193,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1192 | inode->i_atime.tv_sec = convtime; | 1193 | inode->i_atime.tv_sec = convtime; |
| 1193 | inode->i_atime.tv_nsec = convtime_usec * 1000; | 1194 | inode->i_atime.tv_nsec = convtime_usec * 1000; |
| 1194 | } else { | 1195 | } else { |
| 1195 | inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb); | 1196 | inode->i_atime = sbi->s_record_time; |
| 1196 | } | 1197 | } |
| 1197 | 1198 | ||
| 1198 | if (udf_stamp_to_time(&convtime, &convtime_usec, | 1199 | if (udf_stamp_to_time(&convtime, &convtime_usec, |
| @@ -1200,7 +1201,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1200 | inode->i_mtime.tv_sec = convtime; | 1201 | inode->i_mtime.tv_sec = convtime; |
| 1201 | inode->i_mtime.tv_nsec = convtime_usec * 1000; | 1202 | inode->i_mtime.tv_nsec = convtime_usec * 1000; |
| 1202 | } else { | 1203 | } else { |
| 1203 | inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb); | 1204 | inode->i_mtime = sbi->s_record_time; |
| 1204 | } | 1205 | } |
| 1205 | 1206 | ||
| 1206 | if (udf_stamp_to_time(&convtime, &convtime_usec, | 1207 | if (udf_stamp_to_time(&convtime, &convtime_usec, |
| @@ -1208,7 +1209,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1208 | UDF_I_CRTIME(inode).tv_sec = convtime; | 1209 | UDF_I_CRTIME(inode).tv_sec = convtime; |
| 1209 | UDF_I_CRTIME(inode).tv_nsec = convtime_usec * 1000; | 1210 | UDF_I_CRTIME(inode).tv_nsec = convtime_usec * 1000; |
| 1210 | } else { | 1211 | } else { |
| 1211 | UDF_I_CRTIME(inode) = UDF_SB_RECORDTIME(inode->i_sb); | 1212 | UDF_I_CRTIME(inode) = sbi->s_record_time; |
| 1212 | } | 1213 | } |
| 1213 | 1214 | ||
| 1214 | if (udf_stamp_to_time(&convtime, &convtime_usec, | 1215 | if (udf_stamp_to_time(&convtime, &convtime_usec, |
| @@ -1216,7 +1217,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1216 | inode->i_ctime.tv_sec = convtime; | 1217 | inode->i_ctime.tv_sec = convtime; |
| 1217 | inode->i_ctime.tv_nsec = convtime_usec * 1000; | 1218 | inode->i_ctime.tv_nsec = convtime_usec * 1000; |
| 1218 | } else { | 1219 | } else { |
| 1219 | inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb); | 1220 | inode->i_ctime = sbi->s_record_time; |
| 1220 | } | 1221 | } |
| 1221 | 1222 | ||
| 1222 | UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID); | 1223 | UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID); |
| @@ -1353,6 +1354,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1353 | int i; | 1354 | int i; |
| 1354 | kernel_timestamp cpu_time; | 1355 | kernel_timestamp cpu_time; |
| 1355 | int err = 0; | 1356 | int err = 0; |
| 1357 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); | ||
| 1356 | 1358 | ||
| 1357 | bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0)); | 1359 | bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0)); |
| 1358 | if (!bh) { | 1360 | if (!bh) { |
| @@ -1537,11 +1539,11 @@ static int udf_update_inode(struct inode *inode, int do_sync) | |||
| 1537 | ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY)); | 1539 | ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY)); |
| 1538 | 1540 | ||
| 1539 | fe->icbTag.flags = cpu_to_le16(icbflags); | 1541 | fe->icbTag.flags = cpu_to_le16(icbflags); |
| 1540 | if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200) | 1542 | if (sbi->s_udfrev >= 0x0200) |
| 1541 | fe->descTag.descVersion = cpu_to_le16(3); | 1543 | fe->descTag.descVersion = cpu_to_le16(3); |
| 1542 | else | 1544 | else |
| 1543 | fe->descTag.descVersion = cpu_to_le16(2); | 1545 | fe->descTag.descVersion = cpu_to_le16(2); |
| 1544 | fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb)); | 1546 | fe->descTag.tagSerialNum = cpu_to_le16(sbi->s_serial_number); |
| 1545 | fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); | 1547 | fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); |
| 1546 | crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag); | 1548 | crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag); |
| 1547 | fe->descTag.descCRCLength = cpu_to_le16(crclen); | 1549 | fe->descTag.descCRCLength = cpu_to_le16(crclen); |
| @@ -1585,7 +1587,7 @@ struct inode *udf_iget(struct super_block *sb, kernel_lb_addr ino) | |||
| 1585 | if (is_bad_inode(inode)) | 1587 | if (is_bad_inode(inode)) |
| 1586 | goto out_iput; | 1588 | goto out_iput; |
| 1587 | 1589 | ||
| 1588 | if (ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) { | 1590 | if (ino.logicalBlockNum >= UDF_SB(sb)->s_partmaps[ino.partitionReferenceNum].s_partition_len) { |
| 1589 | udf_debug("block=%d, partition=%d out of range\n", | 1591 | udf_debug("block=%d, partition=%d out of range\n", |
| 1590 | ino.logicalBlockNum, ino.partitionReferenceNum); | 1592 | ino.logicalBlockNum, ino.partitionReferenceNum); |
| 1591 | make_bad_inode(inode); | 1593 | make_bad_inode(inode); |
| @@ -1667,7 +1669,7 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1667 | mark_inode_dirty(inode); | 1669 | mark_inode_dirty(inode); |
| 1668 | } | 1670 | } |
| 1669 | } | 1671 | } |
| 1670 | if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200) | 1672 | if (UDF_SB(inode->i_sb)->s_udfrev >= 0x0200) |
| 1671 | udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1, | 1673 | udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1, |
| 1672 | epos->block.logicalBlockNum, sizeof(tag)); | 1674 | epos->block.logicalBlockNum, sizeof(tag)); |
| 1673 | else | 1675 | else |
| @@ -1690,7 +1692,7 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1690 | } | 1692 | } |
| 1691 | if (epos->bh) { | 1693 | if (epos->bh) { |
| 1692 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || | 1694 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 1693 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1695 | UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) |
| 1694 | udf_update_tag(epos->bh->b_data, loffset); | 1696 | udf_update_tag(epos->bh->b_data, loffset); |
| 1695 | else | 1697 | else |
| 1696 | udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc)); | 1698 | udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc)); |
| @@ -1711,7 +1713,7 @@ int8_t udf_add_aext(struct inode * inode, struct extent_position * epos, | |||
| 1711 | aed = (struct allocExtDesc *)epos->bh->b_data; | 1713 | aed = (struct allocExtDesc *)epos->bh->b_data; |
| 1712 | aed->lengthAllocDescs = | 1714 | aed->lengthAllocDescs = |
| 1713 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); | 1715 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize); |
| 1714 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1716 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) |
| 1715 | udf_update_tag(epos->bh->b_data, epos->offset + (inc ? 0 : adsize)); | 1717 | udf_update_tag(epos->bh->b_data, epos->offset + (inc ? 0 : adsize)); |
| 1716 | else | 1718 | else |
| 1717 | udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc)); | 1719 | udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc)); |
| @@ -1754,7 +1756,7 @@ int8_t udf_write_aext(struct inode * inode, struct extent_position * epos, | |||
| 1754 | 1756 | ||
| 1755 | if (epos->bh) { | 1757 | if (epos->bh) { |
| 1756 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || | 1758 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 1757 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) { | 1759 | UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) { |
| 1758 | struct allocExtDesc *aed = (struct allocExtDesc *)epos->bh->b_data; | 1760 | struct allocExtDesc *aed = (struct allocExtDesc *)epos->bh->b_data; |
| 1759 | udf_update_tag(epos->bh->b_data, | 1761 | udf_update_tag(epos->bh->b_data, |
| 1760 | le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc)); | 1762 | le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc)); |
| @@ -1907,7 +1909,7 @@ int8_t udf_delete_aext(struct inode * inode, struct extent_position epos, | |||
| 1907 | aed->lengthAllocDescs = | 1909 | aed->lengthAllocDescs = |
| 1908 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2 * adsize)); | 1910 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2 * adsize)); |
| 1909 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || | 1911 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 1910 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1912 | UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) |
| 1911 | udf_update_tag(oepos.bh->b_data, oepos.offset - (2 * adsize)); | 1913 | udf_update_tag(oepos.bh->b_data, oepos.offset - (2 * adsize)); |
| 1912 | else | 1914 | else |
| 1913 | udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc)); | 1915 | udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc)); |
| @@ -1923,7 +1925,7 @@ int8_t udf_delete_aext(struct inode * inode, struct extent_position epos, | |||
| 1923 | aed->lengthAllocDescs = | 1925 | aed->lengthAllocDescs = |
| 1924 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize); | 1926 | cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize); |
| 1925 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || | 1927 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 1926 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 1928 | UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) |
| 1927 | udf_update_tag(oepos.bh->b_data, epos.offset - adsize); | 1929 | udf_update_tag(oepos.bh->b_data, epos.offset - adsize); |
| 1928 | else | 1930 | else |
| 1929 | udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc)); | 1931 | udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc)); |
diff --git a/fs/udf/misc.c b/fs/udf/misc.c index 15297deb5051..7cecb3098061 100644 --- a/fs/udf/misc.c +++ b/fs/udf/misc.c | |||
| @@ -81,14 +81,16 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size, | |||
| 81 | return NULL; | 81 | return NULL; |
| 82 | } | 82 | } |
| 83 | } else { | 83 | } else { |
| 84 | struct udf_sb_info *sbi = UDF_SB(inode->i_sb); | ||
| 85 | |||
| 84 | size -= sizeof(struct extendedAttrHeaderDesc); | 86 | size -= sizeof(struct extendedAttrHeaderDesc); |
| 85 | UDF_I_LENEATTR(inode) += sizeof(struct extendedAttrHeaderDesc); | 87 | UDF_I_LENEATTR(inode) += sizeof(struct extendedAttrHeaderDesc); |
| 86 | eahd->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EAHD); | 88 | eahd->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EAHD); |
| 87 | if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200) | 89 | if (sbi->s_udfrev >= 0x0200) |
| 88 | eahd->descTag.descVersion = cpu_to_le16(3); | 90 | eahd->descTag.descVersion = cpu_to_le16(3); |
| 89 | else | 91 | else |
| 90 | eahd->descTag.descVersion = cpu_to_le16(2); | 92 | eahd->descTag.descVersion = cpu_to_le16(2); |
| 91 | eahd->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb)); | 93 | eahd->descTag.tagSerialNum = cpu_to_le16(sbi->s_serial_number); |
| 92 | eahd->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); | 94 | eahd->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum); |
| 93 | eahd->impAttrLocation = cpu_to_le32(0xFFFFFFFF); | 95 | eahd->impAttrLocation = cpu_to_le32(0xFFFFFFFF); |
| 94 | eahd->appAttrLocation = cpu_to_le32(0xFFFFFFFF); | 96 | eahd->appAttrLocation = cpu_to_le32(0xFFFFFFFF); |
| @@ -192,15 +194,16 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | |||
| 192 | struct buffer_head *bh = NULL; | 194 | struct buffer_head *bh = NULL; |
| 193 | register uint8_t checksum; | 195 | register uint8_t checksum; |
| 194 | register int i; | 196 | register int i; |
| 197 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 195 | 198 | ||
| 196 | /* Read the block */ | 199 | /* Read the block */ |
| 197 | if (block == 0xFFFFFFFF) | 200 | if (block == 0xFFFFFFFF) |
| 198 | return NULL; | 201 | return NULL; |
| 199 | 202 | ||
| 200 | bh = udf_tread(sb, block + UDF_SB_SESSION(sb)); | 203 | bh = udf_tread(sb, block + sbi->s_session); |
| 201 | if (!bh) { | 204 | if (!bh) { |
| 202 | udf_debug("block=%d, location=%d: read failed\n", | 205 | udf_debug("block=%d, location=%d: read failed\n", |
| 203 | block + UDF_SB_SESSION(sb), location); | 206 | block + sbi->s_session, location); |
| 204 | return NULL; | 207 | return NULL; |
| 205 | } | 208 | } |
| 206 | 209 | ||
| @@ -210,7 +213,7 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | |||
| 210 | 213 | ||
| 211 | if (location != le32_to_cpu(tag_p->tagLocation)) { | 214 | if (location != le32_to_cpu(tag_p->tagLocation)) { |
| 212 | udf_debug("location mismatch block %u, tag %u != %u\n", | 215 | udf_debug("location mismatch block %u, tag %u != %u\n", |
| 213 | block + UDF_SB_SESSION(sb), le32_to_cpu(tag_p->tagLocation), location); | 216 | block + sbi->s_session, le32_to_cpu(tag_p->tagLocation), location); |
| 214 | goto error_out; | 217 | goto error_out; |
| 215 | } | 218 | } |
| 216 | 219 | ||
| @@ -240,7 +243,7 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block, | |||
| 240 | return bh; | 243 | return bh; |
| 241 | } | 244 | } |
| 242 | udf_debug("Crc failure block %d: crc = %d, crclen = %d\n", | 245 | udf_debug("Crc failure block %d: crc = %d, crclen = %d\n", |
| 243 | block + UDF_SB_SESSION(sb), le16_to_cpu(tag_p->descCRC), | 246 | block + sbi->s_session, le16_to_cpu(tag_p->descCRC), |
| 244 | le16_to_cpu(tag_p->descCRCLength)); | 247 | le16_to_cpu(tag_p->descCRCLength)); |
| 245 | 248 | ||
| 246 | error_out: | 249 | error_out: |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index bec96a6b3343..86033d92824c 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
| @@ -325,7 +325,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 325 | struct udf_fileident_bh *fibh, | 325 | struct udf_fileident_bh *fibh, |
| 326 | struct fileIdentDesc *cfi, int *err) | 326 | struct fileIdentDesc *cfi, int *err) |
| 327 | { | 327 | { |
| 328 | struct super_block *sb; | 328 | struct super_block *sb = dir->i_sb; |
| 329 | struct fileIdentDesc *fi = NULL; | 329 | struct fileIdentDesc *fi = NULL; |
| 330 | char name[UDF_NAME_LEN], fname[UDF_NAME_LEN]; | 330 | char name[UDF_NAME_LEN], fname[UDF_NAME_LEN]; |
| 331 | int namelen; | 331 | int namelen; |
| @@ -342,8 +342,6 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
| 342 | sector_t offset; | 342 | sector_t offset; |
| 343 | struct extent_position epos = {}; | 343 | struct extent_position epos = {}; |
| 344 | 344 | ||
| 345 | sb = dir->i_sb; | ||
| 346 | |||
| 347 | if (dentry) { | 345 | if (dentry) { |
| 348 | if (!dentry->d_name.len) { | 346 | if (!dentry->d_name.len) { |
| 349 | *err = -EINVAL; | 347 | *err = -EINVAL; |
| @@ -535,7 +533,7 @@ add: | |||
| 535 | } | 533 | } |
| 536 | 534 | ||
| 537 | memset(cfi, 0, sizeof(struct fileIdentDesc)); | 535 | memset(cfi, 0, sizeof(struct fileIdentDesc)); |
| 538 | if (UDF_SB_UDFREV(sb) >= 0x0200) | 536 | if (UDF_SB(sb)->s_udfrev >= 0x0200) |
| 539 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, sizeof(tag)); | 537 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, sizeof(tag)); |
| 540 | else | 538 | else |
| 541 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, sizeof(tag)); | 539 | udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, sizeof(tag)); |
| @@ -901,6 +899,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 901 | int block; | 899 | int block; |
| 902 | char name[UDF_NAME_LEN]; | 900 | char name[UDF_NAME_LEN]; |
| 903 | int namelen; | 901 | int namelen; |
| 902 | struct buffer_head *bh; | ||
| 904 | 903 | ||
| 905 | lock_kernel(); | 904 | lock_kernel(); |
| 906 | if (!(inode = udf_new_inode(dir, S_IFLNK, &err))) | 905 | if (!(inode = udf_new_inode(dir, S_IFLNK, &err))) |
| @@ -1014,17 +1013,19 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry, | |||
| 1014 | goto out_no_entry; | 1013 | goto out_no_entry; |
| 1015 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); | 1014 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); |
| 1016 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); | 1015 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); |
| 1017 | if (UDF_SB_LVIDBH(inode->i_sb)) { | 1016 | bh = UDF_SB(inode->i_sb)->s_lvid_bh; |
| 1017 | if (bh) { | ||
| 1018 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)bh->b_data; | ||
| 1018 | struct logicalVolHeaderDesc *lvhd; | 1019 | struct logicalVolHeaderDesc *lvhd; |
| 1019 | uint64_t uniqueID; | 1020 | uint64_t uniqueID; |
| 1020 | lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse); | 1021 | lvhd = (struct logicalVolHeaderDesc *)(lvid->logicalVolContentsUse); |
| 1021 | uniqueID = le64_to_cpu(lvhd->uniqueID); | 1022 | uniqueID = le64_to_cpu(lvhd->uniqueID); |
| 1022 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 1023 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 1023 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); | 1024 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); |
| 1024 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) | 1025 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) |
| 1025 | uniqueID += 16; | 1026 | uniqueID += 16; |
| 1026 | lvhd->uniqueID = cpu_to_le64(uniqueID); | 1027 | lvhd->uniqueID = cpu_to_le64(uniqueID); |
| 1027 | mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb)); | 1028 | mark_buffer_dirty(bh); |
| 1028 | } | 1029 | } |
| 1029 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 1030 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
| 1030 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { | 1031 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
| @@ -1053,6 +1054,7 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1053 | struct udf_fileident_bh fibh; | 1054 | struct udf_fileident_bh fibh; |
| 1054 | struct fileIdentDesc cfi, *fi; | 1055 | struct fileIdentDesc cfi, *fi; |
| 1055 | int err; | 1056 | int err; |
| 1057 | struct buffer_head *bh; | ||
| 1056 | 1058 | ||
| 1057 | lock_kernel(); | 1059 | lock_kernel(); |
| 1058 | if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { | 1060 | if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { |
| @@ -1066,17 +1068,19 @@ static int udf_link(struct dentry *old_dentry, struct inode *dir, | |||
| 1066 | } | 1068 | } |
| 1067 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); | 1069 | cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); |
| 1068 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); | 1070 | cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); |
| 1069 | if (UDF_SB_LVIDBH(inode->i_sb)) { | 1071 | bh = UDF_SB(inode->i_sb)->s_lvid_bh; |
| 1072 | if (bh) { | ||
| 1073 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)bh->b_data; | ||
| 1070 | struct logicalVolHeaderDesc *lvhd; | 1074 | struct logicalVolHeaderDesc *lvhd; |
| 1071 | uint64_t uniqueID; | 1075 | uint64_t uniqueID; |
| 1072 | lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse); | 1076 | lvhd = (struct logicalVolHeaderDesc *)(lvid->logicalVolContentsUse); |
| 1073 | uniqueID = le64_to_cpu(lvhd->uniqueID); | 1077 | uniqueID = le64_to_cpu(lvhd->uniqueID); |
| 1074 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = | 1078 | *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = |
| 1075 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); | 1079 | cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); |
| 1076 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) | 1080 | if (!(++uniqueID & 0x00000000FFFFFFFFUL)) |
| 1077 | uniqueID += 16; | 1081 | uniqueID += 16; |
| 1078 | lvhd->uniqueID = cpu_to_le64(uniqueID); | 1082 | lvhd->uniqueID = cpu_to_le64(uniqueID); |
| 1079 | mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb)); | 1083 | mark_buffer_dirty(bh); |
| 1080 | } | 1084 | } |
| 1081 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); | 1085 | udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); |
| 1082 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { | 1086 | if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { |
diff --git a/fs/udf/partition.c b/fs/udf/partition.c index aaab24c8c498..eeb4714b3641 100644 --- a/fs/udf/partition.c +++ b/fs/udf/partition.c | |||
| @@ -31,15 +31,18 @@ | |||
| 31 | inline uint32_t udf_get_pblock(struct super_block *sb, uint32_t block, | 31 | inline uint32_t udf_get_pblock(struct super_block *sb, uint32_t block, |
| 32 | uint16_t partition, uint32_t offset) | 32 | uint16_t partition, uint32_t offset) |
| 33 | { | 33 | { |
| 34 | if (partition >= UDF_SB_NUMPARTS(sb)) { | 34 | struct udf_sb_info *sbi = UDF_SB(sb); |
| 35 | struct udf_part_map *map; | ||
| 36 | if (partition >= sbi->s_partitions) { | ||
| 35 | udf_debug("block=%d, partition=%d, offset=%d: invalid partition\n", | 37 | udf_debug("block=%d, partition=%d, offset=%d: invalid partition\n", |
| 36 | block, partition, offset); | 38 | block, partition, offset); |
| 37 | return 0xFFFFFFFF; | 39 | return 0xFFFFFFFF; |
| 38 | } | 40 | } |
| 39 | if (UDF_SB_PARTFUNC(sb, partition)) | 41 | map = &sbi->s_partmaps[partition]; |
| 40 | return UDF_SB_PARTFUNC(sb, partition)(sb, block, partition, offset); | 42 | if (map->s_partition_func) |
| 43 | return map->s_partition_func(sb, block, partition, offset); | ||
| 41 | else | 44 | else |
| 42 | return UDF_SB_PARTROOT(sb, partition) + block + offset; | 45 | return map->s_partition_root + block + offset; |
| 43 | } | 46 | } |
| 44 | 47 | ||
| 45 | uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block, | 48 | uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block, |
| @@ -49,12 +52,15 @@ uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block, | |||
| 49 | uint32_t newblock; | 52 | uint32_t newblock; |
| 50 | uint32_t index; | 53 | uint32_t index; |
| 51 | uint32_t loc; | 54 | uint32_t loc; |
| 55 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 56 | struct udf_part_map *map; | ||
| 52 | 57 | ||
| 53 | index = (sb->s_blocksize - UDF_SB_TYPEVIRT(sb,partition).s_start_offset) / sizeof(uint32_t); | 58 | map = &sbi->s_partmaps[partition]; |
| 59 | index = (sb->s_blocksize - map->s_type_specific.s_virtual.s_start_offset) / sizeof(uint32_t); | ||
| 54 | 60 | ||
| 55 | if (block > UDF_SB_TYPEVIRT(sb,partition).s_num_entries) { | 61 | if (block > map->s_type_specific.s_virtual.s_num_entries) { |
| 56 | udf_debug("Trying to access block beyond end of VAT (%d max %d)\n", | 62 | udf_debug("Trying to access block beyond end of VAT (%d max %d)\n", |
| 57 | block, UDF_SB_TYPEVIRT(sb,partition).s_num_entries); | 63 | block, map->s_type_specific.s_virtual.s_num_entries); |
| 58 | return 0xFFFFFFFF; | 64 | return 0xFFFFFFFF; |
| 59 | } | 65 | } |
| 60 | 66 | ||
| @@ -64,10 +70,10 @@ uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block, | |||
| 64 | index = block % (sb->s_blocksize / sizeof(uint32_t)); | 70 | index = block % (sb->s_blocksize / sizeof(uint32_t)); |
| 65 | } else { | 71 | } else { |
| 66 | newblock = 0; | 72 | newblock = 0; |
| 67 | index = UDF_SB_TYPEVIRT(sb,partition).s_start_offset / sizeof(uint32_t) + block; | 73 | index = map->s_type_specific.s_virtual.s_start_offset / sizeof(uint32_t) + block; |
| 68 | } | 74 | } |
| 69 | 75 | ||
| 70 | loc = udf_block_map(UDF_SB_VAT(sb), newblock); | 76 | loc = udf_block_map(sbi->s_vat_inode, newblock); |
| 71 | 77 | ||
| 72 | if (!(bh = sb_bread(sb, loc))) { | 78 | if (!(bh = sb_bread(sb, loc))) { |
| 73 | udf_debug("get_pblock(UDF_VIRTUAL_MAP:%p,%d,%d) VAT: %d[%d]\n", | 79 | udf_debug("get_pblock(UDF_VIRTUAL_MAP:%p,%d,%d) VAT: %d[%d]\n", |
| @@ -79,13 +85,13 @@ uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block, | |||
| 79 | 85 | ||
| 80 | brelse(bh); | 86 | brelse(bh); |
| 81 | 87 | ||
| 82 | if (UDF_I_LOCATION(UDF_SB_VAT(sb)).partitionReferenceNum == partition) { | 88 | if (UDF_I_LOCATION(sbi->s_vat_inode).partitionReferenceNum == partition) { |
| 83 | udf_debug("recursive call to udf_get_pblock!\n"); | 89 | udf_debug("recursive call to udf_get_pblock!\n"); |
| 84 | return 0xFFFFFFFF; | 90 | return 0xFFFFFFFF; |
| 85 | } | 91 | } |
| 86 | 92 | ||
| 87 | return udf_get_pblock(sb, loc, | 93 | return udf_get_pblock(sb, loc, |
| 88 | UDF_I_LOCATION(UDF_SB_VAT(sb)).partitionReferenceNum, | 94 | UDF_I_LOCATION(sbi->s_vat_inode).partitionReferenceNum, |
| 89 | offset); | 95 | offset); |
| 90 | } | 96 | } |
| 91 | 97 | ||
| @@ -95,16 +101,21 @@ inline uint32_t udf_get_pblock_virt20(struct super_block * sb, uint32_t block, | |||
| 95 | return udf_get_pblock_virt15(sb, block, partition, offset); | 101 | return udf_get_pblock_virt15(sb, block, partition, offset); |
| 96 | } | 102 | } |
| 97 | 103 | ||
| 98 | uint32_t udf_get_pblock_spar15(struct super_block * sb, uint32_t block, | 104 | uint32_t udf_get_pblock_spar15(struct super_block *sb, uint32_t block, |
| 99 | uint16_t partition, uint32_t offset) | 105 | uint16_t partition, uint32_t offset) |
| 100 | { | 106 | { |
| 101 | int i; | 107 | int i; |
| 102 | struct sparingTable *st = NULL; | 108 | struct sparingTable *st = NULL; |
| 103 | uint32_t packet = (block + offset) & ~(UDF_SB_TYPESPAR(sb,partition).s_packet_len - 1); | 109 | struct udf_sb_info *sbi = UDF_SB(sb); |
| 110 | struct udf_part_map *map; | ||
| 111 | uint32_t packet; | ||
| 112 | |||
| 113 | map = &sbi->s_partmaps[partition]; | ||
| 114 | packet = (block + offset) & ~(map->s_type_specific.s_sparing.s_packet_len - 1); | ||
| 104 | 115 | ||
| 105 | for (i = 0; i < 4; i++) { | 116 | for (i = 0; i < 4; i++) { |
| 106 | if (UDF_SB_TYPESPAR(sb,partition).s_spar_map[i] != NULL) { | 117 | if (map->s_type_specific.s_sparing.s_spar_map[i] != NULL) { |
| 107 | st = (struct sparingTable *)UDF_SB_TYPESPAR(sb,partition).s_spar_map[i]->b_data; | 118 | st = (struct sparingTable *)map->s_type_specific.s_sparing.s_spar_map[i]->b_data; |
| 108 | break; | 119 | break; |
| 109 | } | 120 | } |
| 110 | } | 121 | } |
| @@ -115,14 +126,14 @@ uint32_t udf_get_pblock_spar15(struct super_block * sb, uint32_t block, | |||
| 115 | break; | 126 | break; |
| 116 | } else if (le32_to_cpu(st->mapEntry[i].origLocation) == packet) { | 127 | } else if (le32_to_cpu(st->mapEntry[i].origLocation) == packet) { |
| 117 | return le32_to_cpu(st->mapEntry[i].mappedLocation) + | 128 | return le32_to_cpu(st->mapEntry[i].mappedLocation) + |
| 118 | ((block + offset) & (UDF_SB_TYPESPAR(sb,partition).s_packet_len - 1)); | 129 | ((block + offset) & (map->s_type_specific.s_sparing.s_packet_len - 1)); |
| 119 | } else if (le32_to_cpu(st->mapEntry[i].origLocation) > packet) { | 130 | } else if (le32_to_cpu(st->mapEntry[i].origLocation) > packet) { |
| 120 | break; | 131 | break; |
| 121 | } | 132 | } |
| 122 | } | 133 | } |
| 123 | } | 134 | } |
| 124 | 135 | ||
| 125 | return UDF_SB_PARTROOT(sb,partition) + block + offset; | 136 | return map->s_partition_root + block + offset; |
| 126 | } | 137 | } |
| 127 | 138 | ||
| 128 | int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | 139 | int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) |
| @@ -132,15 +143,17 @@ int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | |||
| 132 | struct sparingEntry mapEntry; | 143 | struct sparingEntry mapEntry; |
| 133 | uint32_t packet; | 144 | uint32_t packet; |
| 134 | int i, j, k, l; | 145 | int i, j, k, l; |
| 146 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 135 | 147 | ||
| 136 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { | 148 | for (i = 0; i < sbi->s_partitions; i++) { |
| 137 | if (old_block > UDF_SB_PARTROOT(sb,i) && | 149 | struct udf_part_map *map = &sbi->s_partmaps[i]; |
| 138 | old_block < UDF_SB_PARTROOT(sb,i) + UDF_SB_PARTLEN(sb,i)) { | 150 | if (old_block > map->s_partition_root && |
| 139 | sdata = &UDF_SB_TYPESPAR(sb,i); | 151 | old_block < map->s_partition_root + map->s_partition_len) { |
| 140 | packet = (old_block - UDF_SB_PARTROOT(sb,i)) & ~(sdata->s_packet_len - 1); | 152 | sdata = &map->s_type_specific.s_sparing; |
| 153 | packet = (old_block - map->s_partition_root) & ~(sdata->s_packet_len - 1); | ||
| 141 | 154 | ||
| 142 | for (j = 0; j < 4; j++) { | 155 | for (j = 0; j < 4; j++) { |
| 143 | if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL) { | 156 | if (map->s_type_specific.s_sparing.s_spar_map[j] != NULL) { |
| 144 | st = (struct sparingTable *)sdata->s_spar_map[j]->b_data; | 157 | st = (struct sparingTable *)sdata->s_spar_map[j]->b_data; |
| 145 | break; | 158 | break; |
| 146 | } | 159 | } |
| @@ -160,11 +173,11 @@ int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | |||
| 160 | } | 173 | } |
| 161 | } | 174 | } |
| 162 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + | 175 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + |
| 163 | ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); | 176 | ((old_block - map->s_partition_root) & (sdata->s_packet_len - 1)); |
| 164 | return 0; | 177 | return 0; |
| 165 | } else if (le32_to_cpu(st->mapEntry[k].origLocation) == packet) { | 178 | } else if (le32_to_cpu(st->mapEntry[k].origLocation) == packet) { |
| 166 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + | 179 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + |
| 167 | ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); | 180 | ((old_block - map->s_partition_root) & (sdata->s_packet_len - 1)); |
| 168 | return 0; | 181 | return 0; |
| 169 | } else if (le32_to_cpu(st->mapEntry[k].origLocation) > packet) { | 182 | } else if (le32_to_cpu(st->mapEntry[k].origLocation) > packet) { |
| 170 | break; | 183 | break; |
| @@ -185,7 +198,7 @@ int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | |||
| 185 | } | 198 | } |
| 186 | } | 199 | } |
| 187 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + | 200 | *new_block = le32_to_cpu(st->mapEntry[k].mappedLocation) + |
| 188 | ((old_block - UDF_SB_PARTROOT(sb,i)) & (sdata->s_packet_len - 1)); | 201 | ((old_block - map->s_partition_root) & (sdata->s_packet_len - 1)); |
| 189 | return 0; | 202 | return 0; |
| 190 | } | 203 | } |
| 191 | } | 204 | } |
| @@ -194,7 +207,7 @@ int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block) | |||
| 194 | } /* if old_block */ | 207 | } /* if old_block */ |
| 195 | } | 208 | } |
| 196 | 209 | ||
| 197 | if (i == UDF_SB_NUMPARTS(sb)) { | 210 | if (i == sbi->s_partitions) { |
| 198 | /* outside of partitions */ | 211 | /* outside of partitions */ |
| 199 | /* for now, fail =) */ | 212 | /* for now, fail =) */ |
| 200 | return 1; | 213 | return 1; |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 57788f1ba2da..0ca2deb5b992 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -95,6 +95,14 @@ static void udf_close_lvid(struct super_block *); | |||
| 95 | static unsigned int udf_count_free(struct super_block *); | 95 | static unsigned int udf_count_free(struct super_block *); |
| 96 | static int udf_statfs(struct dentry *, struct kstatfs *); | 96 | static int udf_statfs(struct dentry *, struct kstatfs *); |
| 97 | 97 | ||
| 98 | struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi) | ||
| 99 | { | ||
| 100 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; | ||
| 101 | __u32 number_of_partitions = le32_to_cpu(lvid->numOfPartitions); | ||
| 102 | __u32 offset = number_of_partitions * 2 * sizeof(uint32_t)/sizeof(uint8_t); | ||
| 103 | return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]); | ||
| 104 | } | ||
| 105 | |||
| 98 | /* UDF filesystem type */ | 106 | /* UDF filesystem type */ |
| 99 | static int udf_get_sb(struct file_system_type *fs_type, | 107 | static int udf_get_sb(struct file_system_type *fs_type, |
| 100 | int flags, const char *dev_name, void *data, | 108 | int flags, const char *dev_name, void *data, |
| @@ -461,22 +469,23 @@ void udf_write_super(struct super_block *sb) | |||
| 461 | static int udf_remount_fs(struct super_block *sb, int *flags, char *options) | 469 | static int udf_remount_fs(struct super_block *sb, int *flags, char *options) |
| 462 | { | 470 | { |
| 463 | struct udf_options uopt; | 471 | struct udf_options uopt; |
| 472 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 464 | 473 | ||
| 465 | uopt.flags = UDF_SB(sb)->s_flags; | 474 | uopt.flags = sbi->s_flags; |
| 466 | uopt.uid = UDF_SB(sb)->s_uid; | 475 | uopt.uid = sbi->s_uid; |
| 467 | uopt.gid = UDF_SB(sb)->s_gid; | 476 | uopt.gid = sbi->s_gid; |
| 468 | uopt.umask = UDF_SB(sb)->s_umask; | 477 | uopt.umask = sbi->s_umask; |
| 469 | 478 | ||
| 470 | if (!udf_parse_options(options, &uopt)) | 479 | if (!udf_parse_options(options, &uopt)) |
| 471 | return -EINVAL; | 480 | return -EINVAL; |
| 472 | 481 | ||
| 473 | UDF_SB(sb)->s_flags = uopt.flags; | 482 | sbi->s_flags = uopt.flags; |
| 474 | UDF_SB(sb)->s_uid = uopt.uid; | 483 | sbi->s_uid = uopt.uid; |
| 475 | UDF_SB(sb)->s_gid = uopt.gid; | 484 | sbi->s_gid = uopt.gid; |
| 476 | UDF_SB(sb)->s_umask = uopt.umask; | 485 | sbi->s_umask = uopt.umask; |
| 477 | 486 | ||
| 478 | if (UDF_SB_LVIDBH(sb)) { | 487 | if (sbi->s_lvid_bh) { |
| 479 | int write_rev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev); | 488 | int write_rev = le16_to_cpu(udf_sb_lvidiu(sbi)->minUDFWriteRev); |
| 480 | if (write_rev > UDF_MAX_WRITE_VERSION) | 489 | if (write_rev > UDF_MAX_WRITE_VERSION) |
| 481 | *flags |= MS_RDONLY; | 490 | *flags |= MS_RDONLY; |
| 482 | } | 491 | } |
| @@ -538,17 +547,19 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
| 538 | int iso9660 = 0; | 547 | int iso9660 = 0; |
| 539 | int nsr02 = 0; | 548 | int nsr02 = 0; |
| 540 | int nsr03 = 0; | 549 | int nsr03 = 0; |
| 550 | struct udf_sb_info *sbi; | ||
| 541 | 551 | ||
| 542 | /* Block size must be a multiple of 512 */ | 552 | /* Block size must be a multiple of 512 */ |
| 543 | if (sb->s_blocksize & 511) | 553 | if (sb->s_blocksize & 511) |
| 544 | return 0; | 554 | return 0; |
| 555 | sbi = UDF_SB(sb); | ||
| 545 | 556 | ||
| 546 | if (sb->s_blocksize < sizeof(struct volStructDesc)) | 557 | if (sb->s_blocksize < sizeof(struct volStructDesc)) |
| 547 | sectorsize = sizeof(struct volStructDesc); | 558 | sectorsize = sizeof(struct volStructDesc); |
| 548 | else | 559 | else |
| 549 | sectorsize = sb->s_blocksize; | 560 | sectorsize = sb->s_blocksize; |
| 550 | 561 | ||
| 551 | sector += (UDF_SB_SESSION(sb) << sb->s_blocksize_bits); | 562 | sector += (sbi->s_session << sb->s_blocksize_bits); |
| 552 | 563 | ||
| 553 | udf_debug("Starting at sector %u (%ld byte sectors)\n", | 564 | udf_debug("Starting at sector %u (%ld byte sectors)\n", |
| 554 | (sector >> sb->s_blocksize_bits), sb->s_blocksize); | 565 | (sector >> sb->s_blocksize_bits), sb->s_blocksize); |
| @@ -614,7 +625,7 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
| 614 | return nsr03; | 625 | return nsr03; |
| 615 | else if (nsr02) | 626 | else if (nsr02) |
| 616 | return nsr02; | 627 | return nsr02; |
| 617 | else if (sector - (UDF_SB_SESSION(sb) << sb->s_blocksize_bits) == 32768) | 628 | else if (sector - (sbi->s_session << sb->s_blocksize_bits) == 32768) |
| 618 | return -1; | 629 | return -1; |
| 619 | else | 630 | else |
| 620 | return 0; | 631 | return 0; |
| @@ -639,11 +650,15 @@ static int udf_vrs(struct super_block *sb, int silent) | |||
| 639 | */ | 650 | */ |
| 640 | static void udf_find_anchor(struct super_block *sb) | 651 | static void udf_find_anchor(struct super_block *sb) |
| 641 | { | 652 | { |
| 642 | int lastblock = UDF_SB_LASTBLOCK(sb); | 653 | int lastblock; |
| 643 | struct buffer_head *bh = NULL; | 654 | struct buffer_head *bh = NULL; |
| 644 | uint16_t ident; | 655 | uint16_t ident; |
| 645 | uint32_t location; | 656 | uint32_t location; |
| 646 | int i; | 657 | int i; |
| 658 | struct udf_sb_info *sbi; | ||
| 659 | |||
| 660 | sbi = UDF_SB(sb); | ||
| 661 | lastblock = sbi->s_last_block; | ||
| 647 | 662 | ||
| 648 | if (lastblock) { | 663 | if (lastblock) { |
| 649 | int varlastblock = udf_variable_to_fixed(lastblock); | 664 | int varlastblock = udf_variable_to_fixed(lastblock); |
| @@ -675,22 +690,22 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 675 | } | 690 | } |
| 676 | 691 | ||
| 677 | if (ident == TAG_IDENT_AVDP) { | 692 | if (ident == TAG_IDENT_AVDP) { |
| 678 | if (location == last[i] - UDF_SB_SESSION(sb)) { | 693 | if (location == last[i] - sbi->s_session) { |
| 679 | lastblock = last[i] - UDF_SB_SESSION(sb); | 694 | lastblock = last[i] - sbi->s_session; |
| 680 | UDF_SB_ANCHOR(sb)[0] = lastblock; | 695 | sbi->s_anchor[0] = lastblock; |
| 681 | UDF_SB_ANCHOR(sb)[1] = lastblock - 256; | 696 | sbi->s_anchor[1] = lastblock - 256; |
| 682 | } else if (location == udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb)) { | 697 | } else if (location == udf_variable_to_fixed(last[i]) - sbi->s_session) { |
| 683 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | 698 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); |
| 684 | lastblock = udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb); | 699 | lastblock = udf_variable_to_fixed(last[i]) - sbi->s_session; |
| 685 | UDF_SB_ANCHOR(sb)[0] = lastblock; | 700 | sbi->s_anchor[0] = lastblock; |
| 686 | UDF_SB_ANCHOR(sb)[1] = lastblock - 256 - UDF_SB_SESSION(sb); | 701 | sbi->s_anchor[1] = lastblock - 256 - sbi->s_session; |
| 687 | } else { | 702 | } else { |
| 688 | udf_debug("Anchor found at block %d, location mismatch %d.\n", | 703 | udf_debug("Anchor found at block %d, location mismatch %d.\n", |
| 689 | last[i], location); | 704 | last[i], location); |
| 690 | } | 705 | } |
| 691 | } else if (ident == TAG_IDENT_FE || ident == TAG_IDENT_EFE) { | 706 | } else if (ident == TAG_IDENT_FE || ident == TAG_IDENT_EFE) { |
| 692 | lastblock = last[i]; | 707 | lastblock = last[i]; |
| 693 | UDF_SB_ANCHOR(sb)[3] = 512; | 708 | sbi->s_anchor[3] = 512; |
| 694 | } else { | 709 | } else { |
| 695 | ident = location = 0; | 710 | ident = location = 0; |
| 696 | if (last[i] >= 256) { | 711 | if (last[i] >= 256) { |
| @@ -704,13 +719,13 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 704 | } | 719 | } |
| 705 | 720 | ||
| 706 | if (ident == TAG_IDENT_AVDP && | 721 | if (ident == TAG_IDENT_AVDP && |
| 707 | location == last[i] - 256 - UDF_SB_SESSION(sb)) { | 722 | location == last[i] - 256 - sbi->s_session) { |
| 708 | lastblock = last[i]; | 723 | lastblock = last[i]; |
| 709 | UDF_SB_ANCHOR(sb)[1] = last[i] - 256; | 724 | sbi->s_anchor[1] = last[i] - 256; |
| 710 | } else { | 725 | } else { |
| 711 | ident = location = 0; | 726 | ident = location = 0; |
| 712 | if (last[i] >= 312 + UDF_SB_SESSION(sb)) { | 727 | if (last[i] >= 312 + sbi->s_session) { |
| 713 | bh = sb_bread(sb, last[i] - 312 - UDF_SB_SESSION(sb)); | 728 | bh = sb_bread(sb, last[i] - 312 - sbi->s_session); |
| 714 | if (bh) { | 729 | if (bh) { |
| 715 | tag *t = (tag *)bh->b_data; | 730 | tag *t = (tag *)bh->b_data; |
| 716 | ident = le16_to_cpu(t->tagIdent); | 731 | ident = le16_to_cpu(t->tagIdent); |
| @@ -723,7 +738,7 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 723 | location == udf_variable_to_fixed(last[i]) - 256) { | 738 | location == udf_variable_to_fixed(last[i]) - 256) { |
| 724 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); | 739 | UDF_SET_FLAG(sb, UDF_FLAG_VARCONV); |
| 725 | lastblock = udf_variable_to_fixed(last[i]); | 740 | lastblock = udf_variable_to_fixed(last[i]); |
| 726 | UDF_SB_ANCHOR(sb)[1] = lastblock - 256; | 741 | sbi->s_anchor[1] = lastblock - 256; |
| 727 | } | 742 | } |
| 728 | } | 743 | } |
| 729 | } | 744 | } |
| @@ -732,7 +747,7 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 732 | 747 | ||
| 733 | if (!lastblock) { | 748 | if (!lastblock) { |
| 734 | /* We haven't found the lastblock. check 312 */ | 749 | /* We haven't found the lastblock. check 312 */ |
| 735 | bh = sb_bread(sb, 312 + UDF_SB_SESSION(sb)); | 750 | bh = sb_bread(sb, 312 + sbi->s_session); |
| 736 | if (bh) { | 751 | if (bh) { |
| 737 | tag *t = (tag *)bh->b_data; | 752 | tag *t = (tag *)bh->b_data; |
| 738 | ident = le16_to_cpu(t->tagIdent); | 753 | ident = le16_to_cpu(t->tagIdent); |
| @@ -744,22 +759,22 @@ static void udf_find_anchor(struct super_block *sb) | |||
| 744 | } | 759 | } |
| 745 | } | 760 | } |
| 746 | 761 | ||
| 747 | for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) { | 762 | for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) { |
| 748 | if (UDF_SB_ANCHOR(sb)[i]) { | 763 | if (sbi->s_anchor[i]) { |
| 749 | bh = udf_read_tagged(sb, UDF_SB_ANCHOR(sb)[i], | 764 | bh = udf_read_tagged(sb, sbi->s_anchor[i], |
| 750 | UDF_SB_ANCHOR(sb)[i], &ident); | 765 | sbi->s_anchor[i], &ident); |
| 751 | if (!bh) | 766 | if (!bh) |
| 752 | UDF_SB_ANCHOR(sb)[i] = 0; | 767 | sbi->s_anchor[i] = 0; |
| 753 | else { | 768 | else { |
| 754 | brelse(bh); | 769 | brelse(bh); |
| 755 | if ((ident != TAG_IDENT_AVDP) && | 770 | if ((ident != TAG_IDENT_AVDP) && |
| 756 | (i || (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE))) | 771 | (i || (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE))) |
| 757 | UDF_SB_ANCHOR(sb)[i] = 0; | 772 | sbi->s_anchor[i] = 0; |
| 758 | } | 773 | } |
| 759 | } | 774 | } |
| 760 | } | 775 | } |
| 761 | 776 | ||
| 762 | UDF_SB_LASTBLOCK(sb) = lastblock; | 777 | sbi->s_last_block = lastblock; |
| 763 | } | 778 | } |
| 764 | 779 | ||
| 765 | static int udf_find_fileset(struct super_block *sb, | 780 | static int udf_find_fileset(struct super_block *sb, |
| @@ -769,6 +784,7 @@ static int udf_find_fileset(struct super_block *sb, | |||
| 769 | struct buffer_head *bh = NULL; | 784 | struct buffer_head *bh = NULL; |
| 770 | long lastblock; | 785 | long lastblock; |
| 771 | uint16_t ident; | 786 | uint16_t ident; |
| 787 | struct udf_sb_info *sbi; | ||
| 772 | 788 | ||
| 773 | if (fileset->logicalBlockNum != 0xFFFFFFFF || | 789 | if (fileset->logicalBlockNum != 0xFFFFFFFF || |
| 774 | fileset->partitionReferenceNum != 0xFFFF) { | 790 | fileset->partitionReferenceNum != 0xFFFF) { |
| @@ -783,6 +799,7 @@ static int udf_find_fileset(struct super_block *sb, | |||
| 783 | 799 | ||
| 784 | } | 800 | } |
| 785 | 801 | ||
| 802 | sbi = UDF_SB(sb); | ||
| 786 | if (!bh) { | 803 | if (!bh) { |
| 787 | /* Search backwards through the partitions */ | 804 | /* Search backwards through the partitions */ |
| 788 | kernel_lb_addr newfileset; | 805 | kernel_lb_addr newfileset; |
| @@ -790,13 +807,14 @@ static int udf_find_fileset(struct super_block *sb, | |||
| 790 | /* --> cvg: FIXME - is it reasonable? */ | 807 | /* --> cvg: FIXME - is it reasonable? */ |
| 791 | return 1; | 808 | return 1; |
| 792 | 809 | ||
| 793 | for (newfileset.partitionReferenceNum = UDF_SB_NUMPARTS(sb) - 1; | 810 | for (newfileset.partitionReferenceNum = sbi->s_partitions - 1; |
| 794 | (newfileset.partitionReferenceNum != 0xFFFF && | 811 | (newfileset.partitionReferenceNum != 0xFFFF && |
| 795 | fileset->logicalBlockNum == 0xFFFFFFFF && | 812 | fileset->logicalBlockNum == 0xFFFFFFFF && |
| 796 | fileset->partitionReferenceNum == 0xFFFF); | 813 | fileset->partitionReferenceNum == 0xFFFF); |
| 797 | newfileset.partitionReferenceNum--) { | 814 | newfileset.partitionReferenceNum--) { |
| 798 | lastblock = UDF_SB_PARTLEN(sb, | 815 | lastblock = sbi->s_partmaps |
| 799 | newfileset.partitionReferenceNum); | 816 | [newfileset.partitionReferenceNum] |
| 817 | .s_partition_len; | ||
| 800 | newfileset.logicalBlockNum = 0; | 818 | newfileset.logicalBlockNum = 0; |
| 801 | 819 | ||
| 802 | do { | 820 | do { |
| @@ -840,7 +858,7 @@ static int udf_find_fileset(struct super_block *sb, | |||
| 840 | fileset->logicalBlockNum, | 858 | fileset->logicalBlockNum, |
| 841 | fileset->partitionReferenceNum); | 859 | fileset->partitionReferenceNum); |
| 842 | 860 | ||
| 843 | UDF_SB_PARTITION(sb) = fileset->partitionReferenceNum; | 861 | sbi->s_partition = fileset->partitionReferenceNum; |
| 844 | udf_load_fileset(sb, bh, root); | 862 | udf_load_fileset(sb, bh, root); |
| 845 | brelse(bh); | 863 | brelse(bh); |
| 846 | return 0; | 864 | return 0; |
| @@ -867,15 +885,15 @@ static void udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh) | |||
| 867 | recording, recording_usec, | 885 | recording, recording_usec, |
| 868 | ts.year, ts.month, ts.day, ts.hour, | 886 | ts.year, ts.month, ts.day, ts.hour, |
| 869 | ts.minute, ts.typeAndTimezone); | 887 | ts.minute, ts.typeAndTimezone); |
| 870 | UDF_SB_RECORDTIME(sb).tv_sec = recording; | 888 | UDF_SB(sb)->s_record_time.tv_sec = recording; |
| 871 | UDF_SB_RECORDTIME(sb).tv_nsec = recording_usec * 1000; | 889 | UDF_SB(sb)->s_record_time.tv_nsec = recording_usec * 1000; |
| 872 | } | 890 | } |
| 873 | 891 | ||
| 874 | if (!udf_build_ustr(&instr, pvoldesc->volIdent, 32)) { | 892 | if (!udf_build_ustr(&instr, pvoldesc->volIdent, 32)) { |
| 875 | if (udf_CS0toUTF8(&outstr, &instr)) { | 893 | if (udf_CS0toUTF8(&outstr, &instr)) { |
| 876 | strncpy(UDF_SB_VOLIDENT(sb), outstr.u_name, | 894 | strncpy(UDF_SB(sb)->s_volume_ident, outstr.u_name, |
| 877 | outstr.u_len > 31 ? 31 : outstr.u_len); | 895 | outstr.u_len > 31 ? 31 : outstr.u_len); |
| 878 | udf_debug("volIdent[] = '%s'\n", UDF_SB_VOLIDENT(sb)); | 896 | udf_debug("volIdent[] = '%s'\n", UDF_SB(sb)->s_volume_ident); |
| 879 | } | 897 | } |
| 880 | } | 898 | } |
| 881 | 899 | ||
| @@ -894,7 +912,7 @@ static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh, | |||
| 894 | 912 | ||
| 895 | *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation); | 913 | *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation); |
| 896 | 914 | ||
| 897 | UDF_SB_SERIALNUM(sb) = le16_to_cpu(fset->descTag.tagSerialNum); | 915 | UDF_SB(sb)->s_serial_number = le16_to_cpu(fset->descTag.tagSerialNum); |
| 898 | 916 | ||
| 899 | udf_debug("Rootdir at block=%d, partition=%d\n", | 917 | udf_debug("Rootdir at block=%d, partition=%d\n", |
| 900 | root->logicalBlockNum, root->partitionReferenceNum); | 918 | root->logicalBlockNum, root->partitionReferenceNum); |
| @@ -904,23 +922,27 @@ static int udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) | |||
| 904 | { | 922 | { |
| 905 | struct partitionDesc *p; | 923 | struct partitionDesc *p; |
| 906 | int i; | 924 | int i; |
| 925 | struct udf_part_map *map; | ||
| 926 | struct udf_sb_info *sbi; | ||
| 907 | 927 | ||
| 908 | p = (struct partitionDesc *)bh->b_data; | 928 | p = (struct partitionDesc *)bh->b_data; |
| 929 | sbi = UDF_SB(sb); | ||
| 909 | 930 | ||
| 910 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { | 931 | for (i = 0; i < sbi->s_partitions; i++) { |
| 932 | map = &sbi->s_partmaps[i]; | ||
| 911 | udf_debug("Searching map: (%d == %d)\n", | 933 | udf_debug("Searching map: (%d == %d)\n", |
| 912 | UDF_SB_PARTMAPS(sb)[i].s_partition_num, le16_to_cpu(p->partitionNumber)); | 934 | map->s_partition_num, le16_to_cpu(p->partitionNumber)); |
| 913 | if (UDF_SB_PARTMAPS(sb)[i].s_partition_num == le16_to_cpu(p->partitionNumber)) { | 935 | if (map->s_partition_num == le16_to_cpu(p->partitionNumber)) { |
| 914 | UDF_SB_PARTLEN(sb, i) = le32_to_cpu(p->partitionLength); /* blocks */ | 936 | map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */ |
| 915 | UDF_SB_PARTROOT(sb, i) = le32_to_cpu(p->partitionStartingLocation); | 937 | map->s_partition_root = le32_to_cpu(p->partitionStartingLocation); |
| 916 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_READ_ONLY) | 938 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_READ_ONLY) |
| 917 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_READ_ONLY; | 939 | map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY; |
| 918 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_WRITE_ONCE) | 940 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_WRITE_ONCE) |
| 919 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_WRITE_ONCE; | 941 | map->s_partition_flags |= UDF_PART_FLAG_WRITE_ONCE; |
| 920 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_REWRITABLE) | 942 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_REWRITABLE) |
| 921 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_REWRITABLE; | 943 | map->s_partition_flags |= UDF_PART_FLAG_REWRITABLE; |
| 922 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_OVERWRITABLE) | 944 | if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_OVERWRITABLE) |
| 923 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_OVERWRITABLE; | 945 | map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE; |
| 924 | 946 | ||
| 925 | if (!strcmp(p->partitionContents.ident, | 947 | if (!strcmp(p->partitionContents.ident, |
| 926 | PD_PARTITION_CONTENTS_NSR02) || | 948 | PD_PARTITION_CONTENTS_NSR02) || |
| @@ -935,26 +957,26 @@ static int udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) | |||
| 935 | .partitionReferenceNum = i, | 957 | .partitionReferenceNum = i, |
| 936 | }; | 958 | }; |
| 937 | 959 | ||
| 938 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table = | 960 | map->s_uspace.s_table = |
| 939 | udf_iget(sb, loc); | 961 | udf_iget(sb, loc); |
| 940 | if (!UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table) { | 962 | if (!map->s_uspace.s_table) { |
| 941 | udf_debug("cannot load unallocSpaceTable (part %d)\n", i); | 963 | udf_debug("cannot load unallocSpaceTable (part %d)\n", i); |
| 942 | return 1; | 964 | return 1; |
| 943 | } | 965 | } |
| 944 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_UNALLOC_TABLE; | 966 | map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE; |
| 945 | udf_debug("unallocSpaceTable (part %d) @ %ld\n", | 967 | udf_debug("unallocSpaceTable (part %d) @ %ld\n", |
| 946 | i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table->i_ino); | 968 | i, map->s_uspace.s_table->i_ino); |
| 947 | } | 969 | } |
| 948 | if (phd->unallocSpaceBitmap.extLength) { | 970 | if (phd->unallocSpaceBitmap.extLength) { |
| 949 | UDF_SB_ALLOC_BITMAP(sb, i, s_uspace); | 971 | UDF_SB_ALLOC_BITMAP(sb, i, s_uspace); |
| 950 | if (UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap != NULL) { | 972 | if (map->s_uspace.s_bitmap != NULL) { |
| 951 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extLength = | 973 | map->s_uspace.s_bitmap->s_extLength = |
| 952 | le32_to_cpu(phd->unallocSpaceBitmap.extLength); | 974 | le32_to_cpu(phd->unallocSpaceBitmap.extLength); |
| 953 | UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition = | 975 | map->s_uspace.s_bitmap->s_extPosition = |
| 954 | le32_to_cpu(phd->unallocSpaceBitmap.extPosition); | 976 | le32_to_cpu(phd->unallocSpaceBitmap.extPosition); |
| 955 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_UNALLOC_BITMAP; | 977 | map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP; |
| 956 | udf_debug("unallocSpaceBitmap (part %d) @ %d\n", | 978 | udf_debug("unallocSpaceBitmap (part %d) @ %d\n", |
| 957 | i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition); | 979 | i, map->s_uspace.s_bitmap->s_extPosition); |
| 958 | } | 980 | } |
| 959 | } | 981 | } |
| 960 | if (phd->partitionIntegrityTable.extLength) | 982 | if (phd->partitionIntegrityTable.extLength) |
| @@ -965,41 +987,42 @@ static int udf_load_partdesc(struct super_block *sb, struct buffer_head *bh) | |||
| 965 | .partitionReferenceNum = i, | 987 | .partitionReferenceNum = i, |
| 966 | }; | 988 | }; |
| 967 | 989 | ||
| 968 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table = | 990 | map->s_fspace.s_table = |
| 969 | udf_iget(sb, loc); | 991 | udf_iget(sb, loc); |
| 970 | if (!UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table) { | 992 | if (!map->s_fspace.s_table) { |
| 971 | udf_debug("cannot load freedSpaceTable (part %d)\n", i); | 993 | udf_debug("cannot load freedSpaceTable (part %d)\n", i); |
| 972 | return 1; | 994 | return 1; |
| 973 | } | 995 | } |
| 974 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_FREED_TABLE; | 996 | map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE; |
| 975 | udf_debug("freedSpaceTable (part %d) @ %ld\n", | 997 | udf_debug("freedSpaceTable (part %d) @ %ld\n", |
| 976 | i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table->i_ino); | 998 | i, map->s_fspace.s_table->i_ino); |
| 977 | } | 999 | } |
| 978 | if (phd->freedSpaceBitmap.extLength) { | 1000 | if (phd->freedSpaceBitmap.extLength) { |
| 979 | UDF_SB_ALLOC_BITMAP(sb, i, s_fspace); | 1001 | UDF_SB_ALLOC_BITMAP(sb, i, s_fspace); |
| 980 | if (UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap != NULL) { | 1002 | if (map->s_fspace.s_bitmap != NULL) { |
| 981 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extLength = | 1003 | map->s_fspace.s_bitmap->s_extLength = |
| 982 | le32_to_cpu(phd->freedSpaceBitmap.extLength); | 1004 | le32_to_cpu(phd->freedSpaceBitmap.extLength); |
| 983 | UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition = | 1005 | map->s_fspace.s_bitmap->s_extPosition = |
| 984 | le32_to_cpu(phd->freedSpaceBitmap.extPosition); | 1006 | le32_to_cpu(phd->freedSpaceBitmap.extPosition); |
| 985 | UDF_SB_PARTFLAGS(sb, i) |= UDF_PART_FLAG_FREED_BITMAP; | 1007 | map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP; |
| 986 | udf_debug("freedSpaceBitmap (part %d) @ %d\n", | 1008 | udf_debug("freedSpaceBitmap (part %d) @ %d\n", |
| 987 | i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition); | 1009 | i, map->s_fspace.s_bitmap->s_extPosition); |
| 988 | } | 1010 | } |
| 989 | } | 1011 | } |
| 990 | } | 1012 | } |
| 991 | break; | 1013 | break; |
| 992 | } | 1014 | } |
| 993 | } | 1015 | } |
| 994 | if (i == UDF_SB_NUMPARTS(sb)) { | 1016 | if (i == sbi->s_partitions) { |
| 995 | udf_debug("Partition (%d) not found in partition map\n", | 1017 | udf_debug("Partition (%d) not found in partition map\n", |
| 996 | le16_to_cpu(p->partitionNumber)); | 1018 | le16_to_cpu(p->partitionNumber)); |
| 997 | } else { | 1019 | } else { |
| 998 | udf_debug("Partition (%d:%d type %x) starts at physical %d, " | 1020 | udf_debug("Partition (%d:%d type %x) starts at physical %d, " |
| 999 | "block length %d\n", | 1021 | "block length %d\n", |
| 1000 | le16_to_cpu(p->partitionNumber), i, | 1022 | le16_to_cpu(p->partitionNumber), i, |
| 1001 | UDF_SB_PARTTYPE(sb, i), UDF_SB_PARTROOT(sb, i), | 1023 | map->s_partition_type, |
| 1002 | UDF_SB_PARTLEN(sb, i)); | 1024 | map->s_partition_root, |
| 1025 | map->s_partition_len); | ||
| 1003 | } | 1026 | } |
| 1004 | return 0; | 1027 | return 0; |
| 1005 | } | 1028 | } |
| @@ -1010,30 +1033,32 @@ static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh, | |||
| 1010 | struct logicalVolDesc *lvd; | 1033 | struct logicalVolDesc *lvd; |
| 1011 | int i, j, offset; | 1034 | int i, j, offset; |
| 1012 | uint8_t type; | 1035 | uint8_t type; |
| 1036 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 1013 | 1037 | ||
| 1014 | lvd = (struct logicalVolDesc *)bh->b_data; | 1038 | lvd = (struct logicalVolDesc *)bh->b_data; |
| 1015 | 1039 | ||
| 1016 | UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps)); | 1040 | UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps)); |
| 1017 | 1041 | ||
| 1018 | for (i = 0, offset = 0; | 1042 | for (i = 0, offset = 0; |
| 1019 | i < UDF_SB_NUMPARTS(sb) && offset < le32_to_cpu(lvd->mapTableLength); | 1043 | i < sbi->s_partitions && offset < le32_to_cpu(lvd->mapTableLength); |
| 1020 | i++, offset += ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapLength) { | 1044 | i++, offset += ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapLength) { |
| 1045 | struct udf_part_map *map = &sbi->s_partmaps[i]; | ||
| 1021 | type = ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapType; | 1046 | type = ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapType; |
| 1022 | if (type == 1) { | 1047 | if (type == 1) { |
| 1023 | struct genericPartitionMap1 *gpm1 = (struct genericPartitionMap1 *)&(lvd->partitionMaps[offset]); | 1048 | struct genericPartitionMap1 *gpm1 = (struct genericPartitionMap1 *)&(lvd->partitionMaps[offset]); |
| 1024 | UDF_SB_PARTTYPE(sb, i) = UDF_TYPE1_MAP15; | 1049 | map->s_partition_type = UDF_TYPE1_MAP15; |
| 1025 | UDF_SB_PARTVSN(sb, i) = le16_to_cpu(gpm1->volSeqNum); | 1050 | map->s_volumeseqnum = le16_to_cpu(gpm1->volSeqNum); |
| 1026 | UDF_SB_PARTNUM(sb, i) = le16_to_cpu(gpm1->partitionNum); | 1051 | map->s_partition_num = le16_to_cpu(gpm1->partitionNum); |
| 1027 | UDF_SB_PARTFUNC(sb, i) = NULL; | 1052 | map->s_partition_func = NULL; |
| 1028 | } else if (type == 2) { | 1053 | } else if (type == 2) { |
| 1029 | struct udfPartitionMap2 *upm2 = (struct udfPartitionMap2 *)&(lvd->partitionMaps[offset]); | 1054 | struct udfPartitionMap2 *upm2 = (struct udfPartitionMap2 *)&(lvd->partitionMaps[offset]); |
| 1030 | if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL, strlen(UDF_ID_VIRTUAL))) { | 1055 | if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL, strlen(UDF_ID_VIRTUAL))) { |
| 1031 | if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0150) { | 1056 | if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0150) { |
| 1032 | UDF_SB_PARTTYPE(sb, i) = UDF_VIRTUAL_MAP15; | 1057 | map->s_partition_type = UDF_VIRTUAL_MAP15; |
| 1033 | UDF_SB_PARTFUNC(sb, i) = udf_get_pblock_virt15; | 1058 | map->s_partition_func = udf_get_pblock_virt15; |
| 1034 | } else if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0200) { | 1059 | } else if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0200) { |
| 1035 | UDF_SB_PARTTYPE(sb, i) = UDF_VIRTUAL_MAP20; | 1060 | map->s_partition_type = UDF_VIRTUAL_MAP20; |
| 1036 | UDF_SB_PARTFUNC(sb, i) = udf_get_pblock_virt20; | 1061 | map->s_partition_func = udf_get_pblock_virt20; |
| 1037 | } | 1062 | } |
| 1038 | } else if (!strncmp(upm2->partIdent.ident, UDF_ID_SPARABLE, strlen(UDF_ID_SPARABLE))) { | 1063 | } else if (!strncmp(upm2->partIdent.ident, UDF_ID_SPARABLE, strlen(UDF_ID_SPARABLE))) { |
| 1039 | uint32_t loc; | 1064 | uint32_t loc; |
| @@ -1041,33 +1066,33 @@ static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh, | |||
| 1041 | struct sparingTable *st; | 1066 | struct sparingTable *st; |
| 1042 | struct sparablePartitionMap *spm = (struct sparablePartitionMap *)&(lvd->partitionMaps[offset]); | 1067 | struct sparablePartitionMap *spm = (struct sparablePartitionMap *)&(lvd->partitionMaps[offset]); |
| 1043 | 1068 | ||
| 1044 | UDF_SB_PARTTYPE(sb, i) = UDF_SPARABLE_MAP15; | 1069 | map->s_partition_type = UDF_SPARABLE_MAP15; |
| 1045 | UDF_SB_TYPESPAR(sb, i).s_packet_len = le16_to_cpu(spm->packetLength); | 1070 | map->s_type_specific.s_sparing.s_packet_len = le16_to_cpu(spm->packetLength); |
| 1046 | for (j = 0; j < spm->numSparingTables; j++) { | 1071 | for (j = 0; j < spm->numSparingTables; j++) { |
| 1047 | loc = le32_to_cpu(spm->locSparingTable[j]); | 1072 | loc = le32_to_cpu(spm->locSparingTable[j]); |
| 1048 | UDF_SB_TYPESPAR(sb, i).s_spar_map[j] = | 1073 | map->s_type_specific.s_sparing.s_spar_map[j] = |
| 1049 | udf_read_tagged(sb, loc, loc, &ident); | 1074 | udf_read_tagged(sb, loc, loc, &ident); |
| 1050 | if (UDF_SB_TYPESPAR(sb, i).s_spar_map[j] != NULL) { | 1075 | if (map->s_type_specific.s_sparing.s_spar_map[j] != NULL) { |
| 1051 | st = (struct sparingTable *)UDF_SB_TYPESPAR(sb, i).s_spar_map[j]->b_data; | 1076 | st = (struct sparingTable *)map->s_type_specific.s_sparing.s_spar_map[j]->b_data; |
| 1052 | if (ident != 0 || | 1077 | if (ident != 0 || |
| 1053 | strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING))) { | 1078 | strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING))) { |
| 1054 | brelse(UDF_SB_TYPESPAR(sb, i).s_spar_map[j]); | 1079 | brelse(map->s_type_specific.s_sparing.s_spar_map[j]); |
| 1055 | UDF_SB_TYPESPAR(sb, i).s_spar_map[j] = NULL; | 1080 | map->s_type_specific.s_sparing.s_spar_map[j] = NULL; |
| 1056 | } | 1081 | } |
| 1057 | } | 1082 | } |
| 1058 | } | 1083 | } |
| 1059 | UDF_SB_PARTFUNC(sb, i) = udf_get_pblock_spar15; | 1084 | map->s_partition_func = udf_get_pblock_spar15; |
| 1060 | } else { | 1085 | } else { |
| 1061 | udf_debug("Unknown ident: %s\n", | 1086 | udf_debug("Unknown ident: %s\n", |
| 1062 | upm2->partIdent.ident); | 1087 | upm2->partIdent.ident); |
| 1063 | continue; | 1088 | continue; |
| 1064 | } | 1089 | } |
| 1065 | UDF_SB_PARTVSN(sb, i) = le16_to_cpu(upm2->volSeqNum); | 1090 | map->s_volumeseqnum = le16_to_cpu(upm2->volSeqNum); |
| 1066 | UDF_SB_PARTNUM(sb, i) = le16_to_cpu(upm2->partitionNum); | 1091 | map->s_partition_num = le16_to_cpu(upm2->partitionNum); |
| 1067 | } | 1092 | } |
| 1068 | udf_debug("Partition (%d:%d) type %d on volume %d\n", | 1093 | udf_debug("Partition (%d:%d) type %d on volume %d\n", |
| 1069 | i, UDF_SB_PARTNUM(sb, i), type, | 1094 | i, map->s_partition_num, type, |
| 1070 | UDF_SB_PARTVSN(sb, i)); | 1095 | map->s_volumeseqnum); |
| 1071 | } | 1096 | } |
| 1072 | 1097 | ||
| 1073 | if (fileset) { | 1098 | if (fileset) { |
| @@ -1092,23 +1117,26 @@ static void udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc) | |||
| 1092 | { | 1117 | { |
| 1093 | struct buffer_head *bh = NULL; | 1118 | struct buffer_head *bh = NULL; |
| 1094 | uint16_t ident; | 1119 | uint16_t ident; |
| 1120 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 1121 | struct logicalVolIntegrityDesc *lvid; | ||
| 1095 | 1122 | ||
| 1096 | while (loc.extLength > 0 && | 1123 | while (loc.extLength > 0 && |
| 1097 | (bh = udf_read_tagged(sb, loc.extLocation, | 1124 | (bh = udf_read_tagged(sb, loc.extLocation, |
| 1098 | loc.extLocation, &ident)) && | 1125 | loc.extLocation, &ident)) && |
| 1099 | ident == TAG_IDENT_LVID) { | 1126 | ident == TAG_IDENT_LVID) { |
| 1100 | UDF_SB_LVIDBH(sb) = bh; | 1127 | sbi->s_lvid_bh = bh; |
| 1128 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; | ||
| 1101 | 1129 | ||
| 1102 | if (UDF_SB_LVID(sb)->nextIntegrityExt.extLength) | 1130 | if (lvid->nextIntegrityExt.extLength) |
| 1103 | udf_load_logicalvolint(sb, | 1131 | udf_load_logicalvolint(sb, |
| 1104 | leea_to_cpu(UDF_SB_LVID(sb)->nextIntegrityExt)); | 1132 | leea_to_cpu(lvid->nextIntegrityExt)); |
| 1105 | 1133 | ||
| 1106 | if (UDF_SB_LVIDBH(sb) != bh) | 1134 | if (sbi->s_lvid_bh != bh) |
| 1107 | brelse(bh); | 1135 | brelse(bh); |
| 1108 | loc.extLength -= sb->s_blocksize; | 1136 | loc.extLength -= sb->s_blocksize; |
| 1109 | loc.extLocation++; | 1137 | loc.extLocation++; |
| 1110 | } | 1138 | } |
| 1111 | if (UDF_SB_LVIDBH(sb) != bh) | 1139 | if (sbi->s_lvid_bh != bh) |
| 1112 | brelse(bh); | 1140 | brelse(bh); |
| 1113 | } | 1141 | } |
| 1114 | 1142 | ||
| @@ -1259,10 +1287,11 @@ static int udf_check_valid(struct super_block *sb, int novrs, int silent) | |||
| 1259 | else { | 1287 | else { |
| 1260 | block = udf_vrs(sb, silent); | 1288 | block = udf_vrs(sb, silent); |
| 1261 | if (block == -1) { | 1289 | if (block == -1) { |
| 1290 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 1262 | udf_debug("Failed to read byte 32768. Assuming open " | 1291 | udf_debug("Failed to read byte 32768. Assuming open " |
| 1263 | "disc. Skipping validity check\n"); | 1292 | "disc. Skipping validity check\n"); |
| 1264 | if (!UDF_SB_LASTBLOCK(sb)) | 1293 | if (!sbi->s_last_block) |
| 1265 | UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb); | 1294 | sbi->s_last_block = udf_get_last_block(sb); |
| 1266 | return 0; | 1295 | return 0; |
| 1267 | } else | 1296 | } else |
| 1268 | return !block; | 1297 | return !block; |
| @@ -1276,14 +1305,16 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) | |||
| 1276 | struct buffer_head *bh; | 1305 | struct buffer_head *bh; |
| 1277 | long main_s, main_e, reserve_s, reserve_e; | 1306 | long main_s, main_e, reserve_s, reserve_e; |
| 1278 | int i, j; | 1307 | int i, j; |
| 1308 | struct udf_sb_info *sbi; | ||
| 1279 | 1309 | ||
| 1280 | if (!sb) | 1310 | if (!sb) |
| 1281 | return 1; | 1311 | return 1; |
| 1312 | sbi = UDF_SB(sb); | ||
| 1282 | 1313 | ||
| 1283 | for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) { | 1314 | for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) { |
| 1284 | if (UDF_SB_ANCHOR(sb)[i] && | 1315 | if (sbi->s_anchor[i] && |
| 1285 | (bh = udf_read_tagged(sb, UDF_SB_ANCHOR(sb)[i], | 1316 | (bh = udf_read_tagged(sb, sbi->s_anchor[i], |
| 1286 | UDF_SB_ANCHOR(sb)[i], &ident))) { | 1317 | sbi->s_anchor[i], &ident))) { |
| 1287 | anchor = (struct anchorVolDescPtr *)bh->b_data; | 1318 | anchor = (struct anchorVolDescPtr *)bh->b_data; |
| 1288 | 1319 | ||
| 1289 | /* Locate the main sequence */ | 1320 | /* Locate the main sequence */ |
| @@ -1308,68 +1339,72 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) | |||
| 1308 | } | 1339 | } |
| 1309 | } | 1340 | } |
| 1310 | 1341 | ||
| 1311 | if (i == ARRAY_SIZE(UDF_SB_ANCHOR(sb))) { | 1342 | if (i == ARRAY_SIZE(sbi->s_anchor)) { |
| 1312 | udf_debug("No Anchor block found\n"); | 1343 | udf_debug("No Anchor block found\n"); |
| 1313 | return 1; | 1344 | return 1; |
| 1314 | } else | 1345 | } else |
| 1315 | udf_debug("Using anchor in block %d\n", UDF_SB_ANCHOR(sb)[i]); | 1346 | udf_debug("Using anchor in block %d\n", sbi->s_anchor[i]); |
| 1316 | 1347 | ||
| 1317 | for (i = 0; i < UDF_SB_NUMPARTS(sb); i++) { | 1348 | for (i = 0; i < sbi->s_partitions; i++) { |
| 1318 | kernel_lb_addr uninitialized_var(ino); | 1349 | kernel_lb_addr uninitialized_var(ino); |
| 1319 | switch (UDF_SB_PARTTYPE(sb, i)) { | 1350 | struct udf_part_map *map = &sbi->s_partmaps[i]; |
| 1351 | switch (map->s_partition_type) { | ||
| 1320 | case UDF_VIRTUAL_MAP15: | 1352 | case UDF_VIRTUAL_MAP15: |
| 1321 | case UDF_VIRTUAL_MAP20: | 1353 | case UDF_VIRTUAL_MAP20: |
| 1322 | if (!UDF_SB_LASTBLOCK(sb)) { | 1354 | if (!sbi->s_last_block) { |
| 1323 | UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb); | 1355 | sbi->s_last_block = udf_get_last_block(sb); |
| 1324 | udf_find_anchor(sb); | 1356 | udf_find_anchor(sb); |
| 1325 | } | 1357 | } |
| 1326 | 1358 | ||
| 1327 | if (!UDF_SB_LASTBLOCK(sb)) { | 1359 | if (!sbi->s_last_block) { |
| 1328 | udf_debug("Unable to determine Lastblock (For " | 1360 | udf_debug("Unable to determine Lastblock (For " |
| 1329 | "Virtual Partition)\n"); | 1361 | "Virtual Partition)\n"); |
| 1330 | return 1; | 1362 | return 1; |
| 1331 | } | 1363 | } |
| 1332 | 1364 | ||
| 1333 | for (j = 0; j < UDF_SB_NUMPARTS(sb); j++) { | 1365 | for (j = 0; j < sbi->s_partitions; j++) { |
| 1366 | struct udf_part_map *map2 = &sbi->s_partmaps[j]; | ||
| 1334 | if (j != i && | 1367 | if (j != i && |
| 1335 | UDF_SB_PARTVSN(sb, i) == UDF_SB_PARTVSN(sb, j) && | 1368 | map->s_volumeseqnum == map2->s_volumeseqnum && |
| 1336 | UDF_SB_PARTNUM(sb, i) == UDF_SB_PARTNUM(sb, j)) { | 1369 | map->s_partition_num == map2->s_partition_num) { |
| 1337 | ino.partitionReferenceNum = j; | 1370 | ino.partitionReferenceNum = j; |
| 1338 | ino.logicalBlockNum = UDF_SB_LASTBLOCK(sb) - UDF_SB_PARTROOT(sb, j); | 1371 | ino.logicalBlockNum = sbi->s_last_block - map2->s_partition_root; |
| 1339 | break; | 1372 | break; |
| 1340 | } | 1373 | } |
| 1341 | } | 1374 | } |
| 1342 | 1375 | ||
| 1343 | if (j == UDF_SB_NUMPARTS(sb)) | 1376 | if (j == sbi->s_partitions) |
| 1344 | return 1; | 1377 | return 1; |
| 1345 | 1378 | ||
| 1346 | UDF_SB_VAT(sb) = udf_iget(sb, ino); | 1379 | sbi->s_vat_inode = udf_iget(sb, ino); |
| 1347 | if (!UDF_SB_VAT(sb)) | 1380 | if (!sbi->s_vat_inode) |
| 1348 | return 1; | 1381 | return 1; |
| 1349 | 1382 | ||
| 1350 | if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP15) { | 1383 | if (map->s_partition_type == UDF_VIRTUAL_MAP15) { |
| 1351 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = | 1384 | map->s_type_specific.s_virtual.s_start_offset = |
| 1352 | udf_ext0_offset(UDF_SB_VAT(sb)); | 1385 | udf_ext0_offset(sbi->s_vat_inode); |
| 1353 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = | 1386 | map->s_type_specific.s_virtual.s_num_entries = |
| 1354 | (UDF_SB_VAT(sb)->i_size - 36) >> 2; | 1387 | (sbi->s_vat_inode->i_size - 36) >> 2; |
| 1355 | } else if (UDF_SB_PARTTYPE(sb, i) == UDF_VIRTUAL_MAP20) { | 1388 | } else if (map->s_partition_type == UDF_VIRTUAL_MAP20) { |
| 1356 | struct buffer_head *bh = NULL; | 1389 | struct buffer_head *bh = NULL; |
| 1357 | uint32_t pos; | 1390 | uint32_t pos; |
| 1358 | 1391 | ||
| 1359 | pos = udf_block_map(UDF_SB_VAT(sb), 0); | 1392 | pos = udf_block_map(sbi->s_vat_inode, 0); |
| 1360 | bh = sb_bread(sb, pos); | 1393 | bh = sb_bread(sb, pos); |
| 1361 | if (!bh) | 1394 | if (!bh) |
| 1362 | return 1; | 1395 | return 1; |
| 1363 | UDF_SB_TYPEVIRT(sb, i).s_start_offset = | 1396 | map->s_type_specific.s_virtual.s_start_offset = |
| 1364 | le16_to_cpu(((struct virtualAllocationTable20 *)bh->b_data + | 1397 | le16_to_cpu(((struct virtualAllocationTable20 *)bh->b_data + |
| 1365 | udf_ext0_offset(UDF_SB_VAT(sb)))->lengthHeader) + | 1398 | udf_ext0_offset(sbi->s_vat_inode))->lengthHeader) + |
| 1366 | udf_ext0_offset(UDF_SB_VAT(sb)); | 1399 | udf_ext0_offset(sbi->s_vat_inode); |
| 1367 | UDF_SB_TYPEVIRT(sb, i).s_num_entries = (UDF_SB_VAT(sb)->i_size - | 1400 | map->s_type_specific.s_virtual.s_num_entries = (sbi->s_vat_inode->i_size - |
| 1368 | UDF_SB_TYPEVIRT(sb, i).s_start_offset) >> 2; | 1401 | map->s_type_specific.s_virtual.s_start_offset) >> 2; |
| 1369 | brelse(bh); | 1402 | brelse(bh); |
| 1370 | } | 1403 | } |
| 1371 | UDF_SB_PARTROOT(sb, i) = udf_get_pblock(sb, 0, i, 0); | 1404 | map->s_partition_root = udf_get_pblock(sb, 0, i, 0); |
| 1372 | UDF_SB_PARTLEN(sb, i) = UDF_SB_PARTLEN(sb, ino.partitionReferenceNum); | 1405 | map->s_partition_len = |
| 1406 | sbi->s_partmaps[ino.partitionReferenceNum]. | ||
| 1407 | s_partition_len; | ||
| 1373 | } | 1408 | } |
| 1374 | } | 1409 | } |
| 1375 | return 0; | 1410 | return 0; |
| @@ -1377,26 +1412,30 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) | |||
| 1377 | 1412 | ||
| 1378 | static void udf_open_lvid(struct super_block *sb) | 1413 | static void udf_open_lvid(struct super_block *sb) |
| 1379 | { | 1414 | { |
| 1380 | if (UDF_SB_LVIDBH(sb)) { | 1415 | struct udf_sb_info *sbi = UDF_SB(sb); |
| 1416 | struct buffer_head *bh = sbi->s_lvid_bh; | ||
| 1417 | if (bh) { | ||
| 1381 | int i; | 1418 | int i; |
| 1382 | kernel_timestamp cpu_time; | 1419 | kernel_timestamp cpu_time; |
| 1420 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)bh->b_data; | ||
| 1421 | struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sbi); | ||
| 1383 | 1422 | ||
| 1384 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | 1423 | lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; |
| 1385 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1424 | lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; |
| 1386 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) | 1425 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) |
| 1387 | UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time); | 1426 | lvid->recordingDateAndTime = cpu_to_lets(cpu_time); |
| 1388 | UDF_SB_LVID(sb)->integrityType = LVID_INTEGRITY_TYPE_OPEN; | 1427 | lvid->integrityType = LVID_INTEGRITY_TYPE_OPEN; |
| 1389 | 1428 | ||
| 1390 | UDF_SB_LVID(sb)->descTag.descCRC = cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), | 1429 | lvid->descTag.descCRC = cpu_to_le16(udf_crc((char *)lvid + sizeof(tag), |
| 1391 | le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0)); | 1430 | le16_to_cpu(lvid->descTag.descCRCLength), 0)); |
| 1392 | 1431 | ||
| 1393 | UDF_SB_LVID(sb)->descTag.tagChecksum = 0; | 1432 | lvid->descTag.tagChecksum = 0; |
| 1394 | for (i = 0; i < 16; i++) | 1433 | for (i = 0; i < 16; i++) |
| 1395 | if (i != 4) | 1434 | if (i != 4) |
| 1396 | UDF_SB_LVID(sb)->descTag.tagChecksum += | 1435 | lvid->descTag.tagChecksum += |
| 1397 | ((uint8_t *) &(UDF_SB_LVID(sb)->descTag))[i]; | 1436 | ((uint8_t *) &(lvid->descTag))[i]; |
| 1398 | 1437 | ||
| 1399 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 1438 | mark_buffer_dirty(bh); |
| 1400 | } | 1439 | } |
| 1401 | } | 1440 | } |
| 1402 | 1441 | ||
| @@ -1404,32 +1443,40 @@ static void udf_close_lvid(struct super_block *sb) | |||
| 1404 | { | 1443 | { |
| 1405 | kernel_timestamp cpu_time; | 1444 | kernel_timestamp cpu_time; |
| 1406 | int i; | 1445 | int i; |
| 1446 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 1447 | struct buffer_head *bh = sbi->s_lvid_bh; | ||
| 1448 | struct logicalVolIntegrityDesc *lvid; | ||
| 1407 | 1449 | ||
| 1408 | if (UDF_SB_LVIDBH(sb) && | 1450 | if (!bh) |
| 1409 | UDF_SB_LVID(sb)->integrityType == LVID_INTEGRITY_TYPE_OPEN) { | 1451 | return; |
| 1410 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | 1452 | |
| 1411 | UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | 1453 | lvid = (struct logicalVolIntegrityDesc *)bh->b_data; |
| 1454 | |||
| 1455 | if (lvid->integrityType == LVID_INTEGRITY_TYPE_OPEN) { | ||
| 1456 | struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sbi); | ||
| 1457 | lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX; | ||
| 1458 | lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX; | ||
| 1412 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) | 1459 | if (udf_time_to_stamp(&cpu_time, CURRENT_TIME)) |
| 1413 | UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time); | 1460 | lvid->recordingDateAndTime = cpu_to_lets(cpu_time); |
| 1414 | if (UDF_MAX_WRITE_VERSION > le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev)) | 1461 | if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev)) |
| 1415 | UDF_SB_LVIDIU(sb)->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION); | 1462 | lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION); |
| 1416 | if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev)) | 1463 | if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFReadRev)) |
| 1417 | UDF_SB_LVIDIU(sb)->minUDFReadRev = cpu_to_le16(UDF_SB_UDFREV(sb)); | 1464 | lvidiu->minUDFReadRev = cpu_to_le16(sbi->s_udfrev); |
| 1418 | if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev)) | 1465 | if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFWriteRev)) |
| 1419 | UDF_SB_LVIDIU(sb)->minUDFWriteRev = cpu_to_le16(UDF_SB_UDFREV(sb)); | 1466 | lvidiu->minUDFWriteRev = cpu_to_le16(sbi->s_udfrev); |
| 1420 | UDF_SB_LVID(sb)->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); | 1467 | lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE); |
| 1421 | 1468 | ||
| 1422 | UDF_SB_LVID(sb)->descTag.descCRC = | 1469 | lvid->descTag.descCRC = |
| 1423 | cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag), | 1470 | cpu_to_le16(udf_crc((char *)lvid + sizeof(tag), |
| 1424 | le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0)); | 1471 | le16_to_cpu(lvid->descTag.descCRCLength), 0)); |
| 1425 | 1472 | ||
| 1426 | UDF_SB_LVID(sb)->descTag.tagChecksum = 0; | 1473 | lvid->descTag.tagChecksum = 0; |
| 1427 | for (i = 0; i < 16; i++) | 1474 | for (i = 0; i < 16; i++) |
| 1428 | if (i != 4) | 1475 | if (i != 4) |
| 1429 | UDF_SB_LVID(sb)->descTag.tagChecksum += | 1476 | lvid->descTag.tagChecksum += |
| 1430 | ((uint8_t *)&(UDF_SB_LVID(sb)->descTag))[i]; | 1477 | ((uint8_t *)&(lvid->descTag))[i]; |
| 1431 | 1478 | ||
| 1432 | mark_buffer_dirty(UDF_SB_LVIDBH(sb)); | 1479 | mark_buffer_dirty(bh); |
| 1433 | } | 1480 | } |
| 1434 | } | 1481 | } |
| 1435 | 1482 | ||
| @@ -1462,12 +1509,11 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1462 | uopt.gid = -1; | 1509 | uopt.gid = -1; |
| 1463 | uopt.umask = 0; | 1510 | uopt.umask = 0; |
| 1464 | 1511 | ||
| 1465 | sbi = kmalloc(sizeof(struct udf_sb_info), GFP_KERNEL); | 1512 | sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); |
| 1466 | if (!sbi) | 1513 | if (!sbi) |
| 1467 | return -ENOMEM; | 1514 | return -ENOMEM; |
| 1468 | 1515 | ||
| 1469 | sb->s_fs_info = sbi; | 1516 | sb->s_fs_info = sbi; |
| 1470 | memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info)); | ||
| 1471 | 1517 | ||
| 1472 | mutex_init(&sbi->s_alloc_mutex); | 1518 | mutex_init(&sbi->s_alloc_mutex); |
| 1473 | 1519 | ||
| @@ -1495,27 +1541,27 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1495 | fileset.logicalBlockNum = 0xFFFFFFFF; | 1541 | fileset.logicalBlockNum = 0xFFFFFFFF; |
| 1496 | fileset.partitionReferenceNum = 0xFFFF; | 1542 | fileset.partitionReferenceNum = 0xFFFF; |
| 1497 | 1543 | ||
| 1498 | UDF_SB(sb)->s_flags = uopt.flags; | 1544 | sbi->s_flags = uopt.flags; |
| 1499 | UDF_SB(sb)->s_uid = uopt.uid; | 1545 | sbi->s_uid = uopt.uid; |
| 1500 | UDF_SB(sb)->s_gid = uopt.gid; | 1546 | sbi->s_gid = uopt.gid; |
| 1501 | UDF_SB(sb)->s_umask = uopt.umask; | 1547 | sbi->s_umask = uopt.umask; |
| 1502 | UDF_SB(sb)->s_nls_map = uopt.nls_map; | 1548 | sbi->s_nls_map = uopt.nls_map; |
| 1503 | 1549 | ||
| 1504 | /* Set the block size for all transfers */ | 1550 | /* Set the block size for all transfers */ |
| 1505 | if (!udf_set_blocksize(sb, uopt.blocksize)) | 1551 | if (!udf_set_blocksize(sb, uopt.blocksize)) |
| 1506 | goto error_out; | 1552 | goto error_out; |
| 1507 | 1553 | ||
| 1508 | if (uopt.session == 0xFFFFFFFF) | 1554 | if (uopt.session == 0xFFFFFFFF) |
| 1509 | UDF_SB_SESSION(sb) = udf_get_last_session(sb); | 1555 | sbi->s_session = udf_get_last_session(sb); |
| 1510 | else | 1556 | else |
| 1511 | UDF_SB_SESSION(sb) = uopt.session; | 1557 | sbi->s_session = uopt.session; |
| 1512 | 1558 | ||
| 1513 | udf_debug("Multi-session=%d\n", UDF_SB_SESSION(sb)); | 1559 | udf_debug("Multi-session=%d\n", sbi->s_session); |
| 1514 | 1560 | ||
| 1515 | UDF_SB_LASTBLOCK(sb) = uopt.lastblock; | 1561 | sbi->s_last_block = uopt.lastblock; |
| 1516 | UDF_SB_ANCHOR(sb)[0] = UDF_SB_ANCHOR(sb)[1] = 0; | 1562 | sbi->s_anchor[0] = sbi->s_anchor[1] = 0; |
| 1517 | UDF_SB_ANCHOR(sb)[2] = uopt.anchor; | 1563 | sbi->s_anchor[2] = uopt.anchor; |
| 1518 | UDF_SB_ANCHOR(sb)[3] = 256; | 1564 | sbi->s_anchor[3] = 256; |
| 1519 | 1565 | ||
| 1520 | if (udf_check_valid(sb, uopt.novrs, silent)) { | 1566 | if (udf_check_valid(sb, uopt.novrs, silent)) { |
| 1521 | /* read volume recognition sequences */ | 1567 | /* read volume recognition sequences */ |
| @@ -1537,23 +1583,24 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1537 | goto error_out; | 1583 | goto error_out; |
| 1538 | } | 1584 | } |
| 1539 | 1585 | ||
| 1540 | udf_debug("Lastblock=%d\n", UDF_SB_LASTBLOCK(sb)); | 1586 | udf_debug("Lastblock=%d\n", sbi->s_last_block); |
| 1541 | 1587 | ||
| 1542 | if (UDF_SB_LVIDBH(sb)) { | 1588 | if (sbi->s_lvid_bh) { |
| 1543 | uint16_t minUDFReadRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev); | 1589 | struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sbi); |
| 1544 | uint16_t minUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev); | 1590 | uint16_t minUDFReadRev = le16_to_cpu(lvidiu->minUDFReadRev); |
| 1545 | /* uint16_t maxUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev); */ | 1591 | uint16_t minUDFWriteRev = le16_to_cpu(lvidiu->minUDFWriteRev); |
| 1592 | /* uint16_t maxUDFWriteRev = le16_to_cpu(lvidiu->maxUDFWriteRev); */ | ||
| 1546 | 1593 | ||
| 1547 | if (minUDFReadRev > UDF_MAX_READ_VERSION) { | 1594 | if (minUDFReadRev > UDF_MAX_READ_VERSION) { |
| 1548 | printk(KERN_ERR "UDF-fs: minUDFReadRev=%x (max is %x)\n", | 1595 | printk(KERN_ERR "UDF-fs: minUDFReadRev=%x (max is %x)\n", |
| 1549 | le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev), | 1596 | le16_to_cpu(lvidiu->minUDFReadRev), |
| 1550 | UDF_MAX_READ_VERSION); | 1597 | UDF_MAX_READ_VERSION); |
| 1551 | goto error_out; | 1598 | goto error_out; |
| 1552 | } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION) { | 1599 | } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION) { |
| 1553 | sb->s_flags |= MS_RDONLY; | 1600 | sb->s_flags |= MS_RDONLY; |
| 1554 | } | 1601 | } |
| 1555 | 1602 | ||
| 1556 | UDF_SB_UDFREV(sb) = minUDFWriteRev; | 1603 | sbi->s_udfrev = minUDFWriteRev; |
| 1557 | 1604 | ||
| 1558 | if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE) | 1605 | if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE) |
| 1559 | UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE); | 1606 | UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE); |
| @@ -1561,12 +1608,12 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1561 | UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS); | 1608 | UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS); |
| 1562 | } | 1609 | } |
| 1563 | 1610 | ||
| 1564 | if (!UDF_SB_NUMPARTS(sb)) { | 1611 | if (!sbi->s_partitions) { |
| 1565 | printk(KERN_WARNING "UDF-fs: No partition found (2)\n"); | 1612 | printk(KERN_WARNING "UDF-fs: No partition found (2)\n"); |
| 1566 | goto error_out; | 1613 | goto error_out; |
| 1567 | } | 1614 | } |
| 1568 | 1615 | ||
| 1569 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_READ_ONLY) { | 1616 | if (sbi->s_partmaps[sbi->s_partition].s_partition_flags & UDF_PART_FLAG_READ_ONLY) { |
| 1570 | printk(KERN_NOTICE "UDF-fs: Partition marked readonly; forcing readonly mount\n"); | 1617 | printk(KERN_NOTICE "UDF-fs: Partition marked readonly; forcing readonly mount\n"); |
| 1571 | sb->s_flags |= MS_RDONLY; | 1618 | sb->s_flags |= MS_RDONLY; |
| 1572 | } | 1619 | } |
| @@ -1578,12 +1625,12 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1578 | 1625 | ||
| 1579 | if (!silent) { | 1626 | if (!silent) { |
| 1580 | kernel_timestamp ts; | 1627 | kernel_timestamp ts; |
| 1581 | udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb)); | 1628 | udf_time_to_stamp(&ts, sbi->s_record_time); |
| 1582 | udf_info("UDF %s (%s) Mounting volume '%s', " | 1629 | udf_info("UDF %s (%s) Mounting volume '%s', " |
| 1583 | "timestamp %04u/%02u/%02u %02u:%02u (%x)\n", | 1630 | "timestamp %04u/%02u/%02u %02u:%02u (%x)\n", |
| 1584 | UDFFS_VERSION, UDFFS_DATE, | 1631 | UDFFS_VERSION, UDFFS_DATE, |
| 1585 | UDF_SB_VOLIDENT(sb), ts.year, ts.month, ts.day, ts.hour, ts.minute, | 1632 | sbi->s_volume_ident, ts.year, ts.month, ts.day, |
| 1586 | ts.typeAndTimezone); | 1633 | ts.hour, ts.minute, ts.typeAndTimezone); |
| 1587 | } | 1634 | } |
| 1588 | if (!(sb->s_flags & MS_RDONLY)) | 1635 | if (!(sb->s_flags & MS_RDONLY)) |
| 1589 | udf_open_lvid(sb); | 1636 | udf_open_lvid(sb); |
| @@ -1609,30 +1656,31 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 1609 | return 0; | 1656 | return 0; |
| 1610 | 1657 | ||
| 1611 | error_out: | 1658 | error_out: |
| 1612 | if (UDF_SB_VAT(sb)) | 1659 | if (sbi->s_vat_inode) |
| 1613 | iput(UDF_SB_VAT(sb)); | 1660 | iput(sbi->s_vat_inode); |
| 1614 | if (UDF_SB_NUMPARTS(sb)) { | 1661 | if (sbi->s_partitions) { |
| 1615 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) | 1662 | struct udf_part_map *map = &sbi->s_partmaps[sbi->s_partition]; |
| 1616 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); | 1663 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) |
| 1617 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) | 1664 | iput(map->s_uspace.s_table); |
| 1618 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); | 1665 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) |
| 1619 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) | 1666 | iput(map->s_fspace.s_table); |
| 1620 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_uspace); | 1667 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) |
| 1621 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) | 1668 | UDF_SB_FREE_BITMAP(sb, sbi->s_partition, s_uspace); |
| 1622 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_fspace); | 1669 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) |
| 1623 | if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15) { | 1670 | UDF_SB_FREE_BITMAP(sb, sbi->s_partition, s_fspace); |
| 1671 | if (map->s_partition_type == UDF_SPARABLE_MAP15) | ||
| 1624 | for (i = 0; i < 4; i++) | 1672 | for (i = 0; i < 4; i++) |
| 1625 | brelse(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]); | 1673 | brelse(map->s_type_specific.s_sparing.s_spar_map[i]); |
| 1626 | } | ||
| 1627 | } | 1674 | } |
| 1628 | #ifdef CONFIG_UDF_NLS | 1675 | #ifdef CONFIG_UDF_NLS |
| 1629 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) | 1676 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) |
| 1630 | unload_nls(UDF_SB(sb)->s_nls_map); | 1677 | unload_nls(sbi->s_nls_map); |
| 1631 | #endif | 1678 | #endif |
| 1632 | if (!(sb->s_flags & MS_RDONLY)) | 1679 | if (!(sb->s_flags & MS_RDONLY)) |
| 1633 | udf_close_lvid(sb); | 1680 | udf_close_lvid(sb); |
| 1634 | brelse(UDF_SB_LVIDBH(sb)); | 1681 | brelse(sbi->s_lvid_bh); |
| 1635 | UDF_SB_FREE(sb); | 1682 | |
| 1683 | kfree(sbi->s_partmaps); | ||
| 1636 | kfree(sbi); | 1684 | kfree(sbi); |
| 1637 | sb->s_fs_info = NULL; | 1685 | sb->s_fs_info = NULL; |
| 1638 | 1686 | ||
| @@ -1683,31 +1731,33 @@ void udf_warning(struct super_block *sb, const char *function, | |||
| 1683 | static void udf_put_super(struct super_block *sb) | 1731 | static void udf_put_super(struct super_block *sb) |
| 1684 | { | 1732 | { |
| 1685 | int i; | 1733 | int i; |
| 1734 | struct udf_sb_info *sbi; | ||
| 1686 | 1735 | ||
| 1687 | if (UDF_SB_VAT(sb)) | 1736 | sbi = UDF_SB(sb); |
| 1688 | iput(UDF_SB_VAT(sb)); | 1737 | if (sbi->s_vat_inode) |
| 1689 | if (UDF_SB_NUMPARTS(sb)) { | 1738 | iput(sbi->s_vat_inode); |
| 1690 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) | 1739 | if (sbi->s_partitions) { |
| 1691 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); | 1740 | struct udf_part_map *map = &sbi->s_partmaps[sbi->s_partition]; |
| 1692 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) | 1741 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) |
| 1693 | iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); | 1742 | iput(map->s_uspace.s_table); |
| 1694 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) | 1743 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) |
| 1695 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_uspace); | 1744 | iput(map->s_fspace.s_table); |
| 1696 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) | 1745 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) |
| 1697 | UDF_SB_FREE_BITMAP(sb, UDF_SB_PARTITION(sb), s_fspace); | 1746 | UDF_SB_FREE_BITMAP(sb, sbi->s_partition, s_uspace); |
| 1698 | if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15) { | 1747 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) |
| 1748 | UDF_SB_FREE_BITMAP(sb, sbi->s_partition, s_fspace); | ||
| 1749 | if (map->s_partition_type == UDF_SPARABLE_MAP15) | ||
| 1699 | for (i = 0; i < 4; i++) | 1750 | for (i = 0; i < 4; i++) |
| 1700 | brelse(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]); | 1751 | brelse(map->s_type_specific.s_sparing.s_spar_map[i]); |
| 1701 | } | ||
| 1702 | } | 1752 | } |
| 1703 | #ifdef CONFIG_UDF_NLS | 1753 | #ifdef CONFIG_UDF_NLS |
| 1704 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) | 1754 | if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) |
| 1705 | unload_nls(UDF_SB(sb)->s_nls_map); | 1755 | unload_nls(sbi->s_nls_map); |
| 1706 | #endif | 1756 | #endif |
| 1707 | if (!(sb->s_flags & MS_RDONLY)) | 1757 | if (!(sb->s_flags & MS_RDONLY)) |
| 1708 | udf_close_lvid(sb); | 1758 | udf_close_lvid(sb); |
| 1709 | brelse(UDF_SB_LVIDBH(sb)); | 1759 | brelse(sbi->s_lvid_bh); |
| 1710 | UDF_SB_FREE(sb); | 1760 | kfree(sbi->s_partmaps); |
| 1711 | kfree(sb->s_fs_info); | 1761 | kfree(sb->s_fs_info); |
| 1712 | sb->s_fs_info = NULL; | 1762 | sb->s_fs_info = NULL; |
| 1713 | } | 1763 | } |
| @@ -1728,15 +1778,22 @@ static void udf_put_super(struct super_block *sb) | |||
| 1728 | static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) | 1778 | static int udf_statfs(struct dentry *dentry, struct kstatfs *buf) |
| 1729 | { | 1779 | { |
| 1730 | struct super_block *sb = dentry->d_sb; | 1780 | struct super_block *sb = dentry->d_sb; |
| 1781 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 1782 | struct logicalVolIntegrityDescImpUse *lvidiu; | ||
| 1783 | |||
| 1784 | if (sbi->s_lvid_bh != NULL) | ||
| 1785 | lvidiu = udf_sb_lvidiu(sbi); | ||
| 1786 | else | ||
| 1787 | lvidiu = NULL; | ||
| 1731 | 1788 | ||
| 1732 | buf->f_type = UDF_SUPER_MAGIC; | 1789 | buf->f_type = UDF_SUPER_MAGIC; |
| 1733 | buf->f_bsize = sb->s_blocksize; | 1790 | buf->f_bsize = sb->s_blocksize; |
| 1734 | buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb)); | 1791 | buf->f_blocks = sbi->s_partmaps[sbi->s_partition].s_partition_len; |
| 1735 | buf->f_bfree = udf_count_free(sb); | 1792 | buf->f_bfree = udf_count_free(sb); |
| 1736 | buf->f_bavail = buf->f_bfree; | 1793 | buf->f_bavail = buf->f_bfree; |
| 1737 | buf->f_files = (UDF_SB_LVIDBH(sb) ? | 1794 | buf->f_files = (lvidiu != NULL ? (le32_to_cpu(lvidiu->numFiles) + |
| 1738 | (le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) + | 1795 | le32_to_cpu(lvidiu->numDirs)) : 0) |
| 1739 | le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs)) : 0) + buf->f_bfree; | 1796 | + buf->f_bfree; |
| 1740 | buf->f_ffree = buf->f_bfree; | 1797 | buf->f_ffree = buf->f_bfree; |
| 1741 | /* __kernel_fsid_t f_fsid */ | 1798 | /* __kernel_fsid_t f_fsid */ |
| 1742 | buf->f_namelen = UDF_NAME_LEN - 2; | 1799 | buf->f_namelen = UDF_NAME_LEN - 2; |
| @@ -1764,7 +1821,7 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb, struct udf_bit | |||
| 1764 | lock_kernel(); | 1821 | lock_kernel(); |
| 1765 | 1822 | ||
| 1766 | loc.logicalBlockNum = bitmap->s_extPosition; | 1823 | loc.logicalBlockNum = bitmap->s_extPosition; |
| 1767 | loc.partitionReferenceNum = UDF_SB_PARTITION(sb); | 1824 | loc.partitionReferenceNum = UDF_SB(sb)->s_partition; |
| 1768 | bh = udf_read_ptagged(sb, loc, 0, &ident); | 1825 | bh = udf_read_ptagged(sb, loc, 0, &ident); |
| 1769 | 1826 | ||
| 1770 | if (!bh) { | 1827 | if (!bh) { |
| @@ -1836,10 +1893,14 @@ static unsigned int udf_count_free_table(struct super_block *sb, struct inode *t | |||
| 1836 | static unsigned int udf_count_free(struct super_block *sb) | 1893 | static unsigned int udf_count_free(struct super_block *sb) |
| 1837 | { | 1894 | { |
| 1838 | unsigned int accum = 0; | 1895 | unsigned int accum = 0; |
| 1896 | struct udf_sb_info *sbi; | ||
| 1897 | struct udf_part_map *map; | ||
| 1839 | 1898 | ||
| 1840 | if (UDF_SB_LVIDBH(sb)) { | 1899 | sbi = UDF_SB(sb); |
| 1841 | if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > UDF_SB_PARTITION(sb)) { | 1900 | if (sbi->s_lvid_bh) { |
| 1842 | accum = le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]); | 1901 | struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data; |
| 1902 | if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) { | ||
| 1903 | accum = le32_to_cpu(lvid->freeSpaceTable[sbi->s_partition]); | ||
| 1843 | if (accum == 0xFFFFFFFF) | 1904 | if (accum == 0xFFFFFFFF) |
| 1844 | accum = 0; | 1905 | accum = 0; |
| 1845 | } | 1906 | } |
| @@ -1848,24 +1909,25 @@ static unsigned int udf_count_free(struct super_block *sb) | |||
| 1848 | if (accum) | 1909 | if (accum) |
| 1849 | return accum; | 1910 | return accum; |
| 1850 | 1911 | ||
| 1851 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP) { | 1912 | map = &sbi->s_partmaps[sbi->s_partition]; |
| 1913 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { | ||
| 1852 | accum += udf_count_free_bitmap(sb, | 1914 | accum += udf_count_free_bitmap(sb, |
| 1853 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap); | 1915 | map->s_uspace.s_bitmap); |
| 1854 | } | 1916 | } |
| 1855 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP) { | 1917 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { |
| 1856 | accum += udf_count_free_bitmap(sb, | 1918 | accum += udf_count_free_bitmap(sb, |
| 1857 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap); | 1919 | map->s_fspace.s_bitmap); |
| 1858 | } | 1920 | } |
| 1859 | if (accum) | 1921 | if (accum) |
| 1860 | return accum; | 1922 | return accum; |
| 1861 | 1923 | ||
| 1862 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE) { | 1924 | if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { |
| 1863 | accum += udf_count_free_table(sb, | 1925 | accum += udf_count_free_table(sb, |
| 1864 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table); | 1926 | map->s_uspace.s_table); |
| 1865 | } | 1927 | } |
| 1866 | if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE) { | 1928 | if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { |
| 1867 | accum += udf_count_free_table(sb, | 1929 | accum += udf_count_free_table(sb, |
| 1868 | UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table); | 1930 | map->s_fspace.s_table); |
| 1869 | } | 1931 | } |
| 1870 | 1932 | ||
| 1871 | return accum; | 1933 | return accum; |
diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index 7fc3912885a5..6931f6bfa1ae 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c | |||
| @@ -163,7 +163,7 @@ void udf_discard_prealloc(struct inode *inode) | |||
| 163 | cpu_to_le32(epos.offset - | 163 | cpu_to_le32(epos.offset - |
| 164 | sizeof(struct allocExtDesc)); | 164 | sizeof(struct allocExtDesc)); |
| 165 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || | 165 | if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || |
| 166 | UDF_SB_UDFREV(inode->i_sb) >= 0x0201) | 166 | UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) |
| 167 | udf_update_tag(epos.bh->b_data, epos.offset); | 167 | udf_update_tag(epos.bh->b_data, epos.offset); |
| 168 | else | 168 | else |
| 169 | udf_update_tag(epos.bh->b_data, | 169 | udf_update_tag(epos.bh->b_data, |
| @@ -184,6 +184,7 @@ void udf_truncate_extents(struct inode *inode) | |||
| 184 | uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc; | 184 | uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc; |
| 185 | int8_t etype; | 185 | int8_t etype; |
| 186 | struct super_block *sb = inode->i_sb; | 186 | struct super_block *sb = inode->i_sb; |
| 187 | struct udf_sb_info *sbi = UDF_SB(sb); | ||
| 187 | sector_t first_block = inode->i_size >> sb->s_blocksize_bits, offset; | 188 | sector_t first_block = inode->i_size >> sb->s_blocksize_bits, offset; |
| 188 | loff_t byte_offset; | 189 | loff_t byte_offset; |
| 189 | int adsize; | 190 | int adsize; |
| @@ -232,7 +233,7 @@ void udf_truncate_extents(struct inode *inode) | |||
| 232 | aed->lengthAllocDescs = | 233 | aed->lengthAllocDescs = |
| 233 | cpu_to_le32(lenalloc); | 234 | cpu_to_le32(lenalloc); |
| 234 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || | 235 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || |
| 235 | UDF_SB_UDFREV(sb) >= 0x0201) | 236 | sbi->s_udfrev >= 0x0201) |
| 236 | udf_update_tag(epos.bh->b_data, | 237 | udf_update_tag(epos.bh->b_data, |
| 237 | lenalloc + | 238 | lenalloc + |
| 238 | sizeof(struct allocExtDesc)); | 239 | sizeof(struct allocExtDesc)); |
| @@ -271,7 +272,7 @@ void udf_truncate_extents(struct inode *inode) | |||
| 271 | (struct allocExtDesc *)(epos.bh->b_data); | 272 | (struct allocExtDesc *)(epos.bh->b_data); |
| 272 | aed->lengthAllocDescs = cpu_to_le32(lenalloc); | 273 | aed->lengthAllocDescs = cpu_to_le32(lenalloc); |
| 273 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || | 274 | if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || |
| 274 | UDF_SB_UDFREV(sb) >= 0x0201) | 275 | sbi->s_udfrev >= 0x0201) |
| 275 | udf_update_tag(epos.bh->b_data, | 276 | udf_update_tag(epos.bh->b_data, |
| 276 | lenalloc + sizeof(struct allocExtDesc)); | 277 | lenalloc + sizeof(struct allocExtDesc)); |
| 277 | else | 278 | else |
diff --git a/fs/udf/udf_sb.h b/fs/udf/udf_sb.h index 3c2982017c6d..92e6d75b0163 100644 --- a/fs/udf/udf_sb.h +++ b/fs/udf/udf_sb.h | |||
| @@ -41,40 +41,36 @@ static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | |||
| 41 | return sb->s_fs_info; | 41 | return sb->s_fs_info; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | #define UDF_SB_FREE(X)\ | 44 | struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi); |
| 45 | {\ | ||
| 46 | if (UDF_SB(X)) {\ | ||
| 47 | kfree(UDF_SB_PARTMAPS(X));\ | ||
| 48 | UDF_SB_PARTMAPS(X) = NULL;\ | ||
| 49 | }\ | ||
| 50 | } | ||
| 51 | 45 | ||
| 52 | #define UDF_SB_ALLOC_PARTMAPS(X,Y)\ | 46 | #define UDF_SB_ALLOC_PARTMAPS(X,Y)\ |
| 53 | {\ | 47 | {\ |
| 54 | UDF_SB_PARTMAPS(X) = kmalloc(sizeof(struct udf_part_map) * Y, GFP_KERNEL);\ | 48 | struct udf_sb_info *sbi = UDF_SB(X);\ |
| 55 | if (UDF_SB_PARTMAPS(X) != NULL) {\ | 49 | sbi->s_partmaps = kmalloc(sizeof(struct udf_part_map) * Y, GFP_KERNEL);\ |
| 56 | UDF_SB_NUMPARTS(X) = Y;\ | 50 | if (sbi->s_partmaps != NULL) {\ |
| 57 | memset(UDF_SB_PARTMAPS(X), 0x00, sizeof(struct udf_part_map) * Y);\ | 51 | sbi->s_partitions = Y;\ |
| 52 | memset(sbi->s_partmaps, 0x00, sizeof(struct udf_part_map) * Y);\ | ||
| 58 | } else {\ | 53 | } else {\ |
| 59 | UDF_SB_NUMPARTS(X) = 0;\ | 54 | sbi->s_partitions = 0;\ |
| 60 | udf_error(X, __FUNCTION__, "Unable to allocate space for %d partition maps", Y);\ | 55 | udf_error(X, __FUNCTION__, "Unable to allocate space for %d partition maps", Y);\ |
| 61 | }\ | 56 | }\ |
| 62 | } | 57 | } |
| 63 | 58 | ||
| 64 | #define UDF_SB_ALLOC_BITMAP(X,Y,Z)\ | 59 | #define UDF_SB_ALLOC_BITMAP(X,Y,Z)\ |
| 65 | {\ | 60 | {\ |
| 66 | int nr_groups = ((UDF_SB_PARTLEN((X),(Y)) + (sizeof(struct spaceBitmapDesc) << 3) +\ | 61 | struct udf_sb_info *sbi = UDF_SB(X);\ |
| 62 | int nr_groups = ((sbi->s_partmaps[(Y)].s_partition_len + (sizeof(struct spaceBitmapDesc) << 3) +\ | ||
| 67 | ((X)->s_blocksize * 8) - 1) / ((X)->s_blocksize * 8));\ | 63 | ((X)->s_blocksize * 8) - 1) / ((X)->s_blocksize * 8));\ |
| 68 | int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * nr_groups);\ | 64 | int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) * nr_groups);\ |
| 69 | if (size <= PAGE_SIZE)\ | 65 | if (size <= PAGE_SIZE)\ |
| 70 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap = kmalloc(size, GFP_KERNEL);\ | 66 | sbi->s_partmaps[(Y)].Z.s_bitmap = kmalloc(size, GFP_KERNEL);\ |
| 71 | else\ | 67 | else\ |
| 72 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap = vmalloc(size);\ | 68 | sbi->s_partmaps[(Y)].Z.s_bitmap = vmalloc(size);\ |
| 73 | if (UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap != NULL) {\ | 69 | if (sbi->s_partmaps[(Y)].Z.s_bitmap != NULL) {\ |
| 74 | memset(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap, 0x00, size);\ | 70 | memset(sbi->s_partmaps[(Y)].Z.s_bitmap, 0x00, size);\ |
| 75 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_block_bitmap =\ | 71 | sbi->s_partmaps[(Y)].Z.s_bitmap->s_block_bitmap =\ |
| 76 | (struct buffer_head **)(UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap + 1);\ | 72 | (struct buffer_head **)(sbi->s_partmaps[(Y)].Z.s_bitmap + 1);\ |
| 77 | UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_nr_groups = nr_groups;\ | 73 | sbi->s_partmaps[(Y)].Z.s_bitmap->s_nr_groups = nr_groups;\ |
| 78 | } else {\ | 74 | } else {\ |
| 79 | udf_error(X, __FUNCTION__, "Unable to allocate space for bitmap and %d buffer_head pointers", nr_groups);\ | 75 | udf_error(X, __FUNCTION__, "Unable to allocate space for bitmap and %d buffer_head pointers", nr_groups);\ |
| 80 | }\ | 76 | }\ |
| @@ -90,47 +86,16 @@ static inline struct udf_sb_info *UDF_SB(struct super_block *sb) | |||
| 90 | brelse(UDF_SB_BITMAP(X,Y,Z,i));\ | 86 | brelse(UDF_SB_BITMAP(X,Y,Z,i));\ |
| 91 | }\ | 87 | }\ |
| 92 | if (size <= PAGE_SIZE)\ | 88 | if (size <= PAGE_SIZE)\ |
| 93 | kfree(UDF_SB_PARTMAPS(X)[Y].Z.s_bitmap);\ | 89 | kfree(UDF_SB(X)->s_partmaps[Y].Z.s_bitmap);\ |
| 94 | else\ | 90 | else\ |
| 95 | vfree(UDF_SB_PARTMAPS(X)[Y].Z.s_bitmap);\ | 91 | vfree(UDF_SB(X)->s_partmaps[Y].Z.s_bitmap);\ |
| 96 | } | 92 | } |
| 97 | 93 | ||
| 98 | #define UDF_QUERY_FLAG(X,Y) ( UDF_SB(X)->s_flags & ( 1 << (Y) ) ) | 94 | #define UDF_QUERY_FLAG(X,Y) ( UDF_SB(X)->s_flags & ( 1 << (Y) ) ) |
| 99 | #define UDF_SET_FLAG(X,Y) ( UDF_SB(X)->s_flags |= ( 1 << (Y) ) ) | 95 | #define UDF_SET_FLAG(X,Y) ( UDF_SB(X)->s_flags |= ( 1 << (Y) ) ) |
| 100 | #define UDF_CLEAR_FLAG(X,Y) ( UDF_SB(X)->s_flags &= ~( 1 << (Y) ) ) | 96 | #define UDF_CLEAR_FLAG(X,Y) ( UDF_SB(X)->s_flags &= ~( 1 << (Y) ) ) |
| 101 | 97 | ||
| 102 | #define UDF_UPDATE_UDFREV(X,Y) ( ((Y) > UDF_SB_UDFREV(X)) ? UDF_SB_UDFREV(X) = (Y) : UDF_SB_UDFREV(X) ) | 98 | #define UDF_SB_BITMAP(X,Y,Z,I) ( UDF_SB(X)->s_partmaps[(Y)].Z.s_bitmap->s_block_bitmap[I] ) |
| 103 | 99 | #define UDF_SB_BITMAP_NR_GROUPS(X,Y,Z) ( UDF_SB(X)->s_partmaps[(Y)].Z.s_bitmap->s_nr_groups ) | |
| 104 | #define UDF_SB_PARTMAPS(X) ( UDF_SB(X)->s_partmaps ) | ||
| 105 | #define UDF_SB_PARTTYPE(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_type ) | ||
| 106 | #define UDF_SB_PARTROOT(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_root ) | ||
| 107 | #define UDF_SB_PARTLEN(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_len ) | ||
| 108 | #define UDF_SB_PARTVSN(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_volumeseqnum ) | ||
| 109 | #define UDF_SB_PARTNUM(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_num ) | ||
| 110 | #define UDF_SB_TYPESPAR(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_type_specific.s_sparing ) | ||
| 111 | #define UDF_SB_TYPEVIRT(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_type_specific.s_virtual ) | ||
| 112 | #define UDF_SB_PARTFUNC(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_func ) | ||
| 113 | #define UDF_SB_PARTFLAGS(X,Y) ( UDF_SB_PARTMAPS(X)[(Y)].s_partition_flags ) | ||
| 114 | #define UDF_SB_BITMAP(X,Y,Z,I) ( UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_block_bitmap[I] ) | ||
| 115 | #define UDF_SB_BITMAP_NR_GROUPS(X,Y,Z) ( UDF_SB_PARTMAPS(X)[(Y)].Z.s_bitmap->s_nr_groups ) | ||
| 116 | |||
| 117 | #define UDF_SB_VOLIDENT(X) ( UDF_SB(X)->s_volident ) | ||
| 118 | #define UDF_SB_NUMPARTS(X) ( UDF_SB(X)->s_partitions ) | ||
| 119 | #define UDF_SB_PARTITION(X) ( UDF_SB(X)->s_partition ) | ||
| 120 | #define UDF_SB_SESSION(X) ( UDF_SB(X)->s_session ) | ||
| 121 | #define UDF_SB_ANCHOR(X) ( UDF_SB(X)->s_anchor ) | ||
| 122 | #define UDF_SB_LASTBLOCK(X) ( UDF_SB(X)->s_lastblock ) | ||
| 123 | #define UDF_SB_LVIDBH(X) ( UDF_SB(X)->s_lvidbh ) | ||
| 124 | #define UDF_SB_LVID(X) ( (struct logicalVolIntegrityDesc *)UDF_SB_LVIDBH(X)->b_data ) | ||
| 125 | #define UDF_SB_LVIDIU(X) ( (struct logicalVolIntegrityDescImpUse *)&(UDF_SB_LVID(X)->impUse[le32_to_cpu(UDF_SB_LVID(X)->numOfPartitions) * 2 * sizeof(uint32_t)/sizeof(uint8_t)]) ) | ||
| 126 | |||
| 127 | #define UDF_SB_UMASK(X) ( UDF_SB(X)->s_umask ) | ||
| 128 | #define UDF_SB_GID(X) ( UDF_SB(X)->s_gid ) | ||
| 129 | #define UDF_SB_UID(X) ( UDF_SB(X)->s_uid ) | ||
| 130 | #define UDF_SB_RECORDTIME(X) ( UDF_SB(X)->s_recordtime ) | ||
| 131 | #define UDF_SB_SERIALNUM(X) ( UDF_SB(X)->s_serialnum ) | ||
| 132 | #define UDF_SB_UDFREV(X) ( UDF_SB(X)->s_udfrev ) | ||
| 133 | #define UDF_SB_FLAGS(X) ( UDF_SB(X)->s_flags ) | ||
| 134 | #define UDF_SB_VAT(X) ( UDF_SB(X)->s_vat ) | ||
| 135 | 100 | ||
| 136 | #endif /* __LINUX_UDF_SB_H */ | 101 | #endif /* __LINUX_UDF_SB_H */ |
diff --git a/include/linux/udf_fs_sb.h b/include/linux/udf_fs_sb.h index 80ae9ef940dc..9bc47352b6b4 100644 --- a/include/linux/udf_fs_sb.h +++ b/include/linux/udf_fs_sb.h | |||
| @@ -75,7 +75,7 @@ struct udf_part_map | |||
| 75 | struct udf_sb_info | 75 | struct udf_sb_info |
| 76 | { | 76 | { |
| 77 | struct udf_part_map *s_partmaps; | 77 | struct udf_part_map *s_partmaps; |
| 78 | __u8 s_volident[32]; | 78 | __u8 s_volume_ident[32]; |
| 79 | 79 | ||
| 80 | /* Overall info */ | 80 | /* Overall info */ |
| 81 | __u16 s_partitions; | 81 | __u16 s_partitions; |
| @@ -84,9 +84,9 @@ struct udf_sb_info | |||
| 84 | /* Sector headers */ | 84 | /* Sector headers */ |
| 85 | __s32 s_session; | 85 | __s32 s_session; |
| 86 | __u32 s_anchor[4]; | 86 | __u32 s_anchor[4]; |
| 87 | __u32 s_lastblock; | 87 | __u32 s_last_block; |
| 88 | 88 | ||
| 89 | struct buffer_head *s_lvidbh; | 89 | struct buffer_head *s_lvid_bh; |
| 90 | 90 | ||
| 91 | /* Default permissions */ | 91 | /* Default permissions */ |
| 92 | mode_t s_umask; | 92 | mode_t s_umask; |
| @@ -94,10 +94,10 @@ struct udf_sb_info | |||
| 94 | uid_t s_uid; | 94 | uid_t s_uid; |
| 95 | 95 | ||
| 96 | /* Root Info */ | 96 | /* Root Info */ |
| 97 | struct timespec s_recordtime; | 97 | struct timespec s_record_time; |
| 98 | 98 | ||
| 99 | /* Fileset Info */ | 99 | /* Fileset Info */ |
| 100 | __u16 s_serialnum; | 100 | __u16 s_serial_number; |
| 101 | 101 | ||
| 102 | /* highest UDF revision we have recorded to this media */ | 102 | /* highest UDF revision we have recorded to this media */ |
| 103 | __u16 s_udfrev; | 103 | __u16 s_udfrev; |
| @@ -109,7 +109,7 @@ struct udf_sb_info | |||
| 109 | struct nls_table *s_nls_map; | 109 | struct nls_table *s_nls_map; |
| 110 | 110 | ||
| 111 | /* VAT inode */ | 111 | /* VAT inode */ |
| 112 | struct inode *s_vat; | 112 | struct inode *s_vat_inode; |
| 113 | 113 | ||
| 114 | struct mutex s_alloc_mutex; | 114 | struct mutex s_alloc_mutex; |
| 115 | }; | 115 | }; |
