| .. | .. |
|---|
| 175 | 175 | { |
|---|
| 176 | 176 | struct udf_sb_info *sbi = UDF_SB(sb); |
|---|
| 177 | 177 | int alloc_count = 0; |
|---|
| 178 | | - int bit, block, block_group, group_start; |
|---|
| 179 | | - int nr_groups, bitmap_nr; |
|---|
| 178 | + int bit, block, block_group; |
|---|
| 179 | + int bitmap_nr; |
|---|
| 180 | 180 | struct buffer_head *bh; |
|---|
| 181 | 181 | __u32 part_len; |
|---|
| 182 | 182 | |
|---|
| .. | .. |
|---|
| 189 | 189 | block_count = part_len - first_block; |
|---|
| 190 | 190 | |
|---|
| 191 | 191 | do { |
|---|
| 192 | | - nr_groups = udf_compute_nr_groups(sb, partition); |
|---|
| 193 | 192 | block = first_block + (sizeof(struct spaceBitmapDesc) << 3); |
|---|
| 194 | 193 | block_group = block >> (sb->s_blocksize_bits + 3); |
|---|
| 195 | | - group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc); |
|---|
| 196 | 194 | |
|---|
| 197 | 195 | bitmap_nr = load_block_bitmap(sb, bitmap, block_group); |
|---|
| 198 | 196 | if (bitmap_nr < 0) |
|---|
| .. | .. |
|---|
| 326 | 324 | got_block: |
|---|
| 327 | 325 | newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) - |
|---|
| 328 | 326 | (sizeof(struct spaceBitmapDesc) << 3); |
|---|
| 327 | + |
|---|
| 328 | + if (newblock >= sbi->s_partmaps[partition].s_partition_len) { |
|---|
| 329 | + /* |
|---|
| 330 | + * Ran off the end of the bitmap, and bits following are |
|---|
| 331 | + * non-compliant (not all zero) |
|---|
| 332 | + */ |
|---|
| 333 | + udf_err(sb, "bitmap for partition %d corrupted (block %u marked" |
|---|
| 334 | + " as free, partition length is %u)\n", partition, |
|---|
| 335 | + newblock, sbi->s_partmaps[partition].s_partition_len); |
|---|
| 336 | + goto error_return; |
|---|
| 337 | + } |
|---|
| 329 | 338 | |
|---|
| 330 | 339 | if (!udf_clear_bit(bit, bh->b_data)) { |
|---|
| 331 | 340 | udf_debug("bit already cleared for block %d\n", bit); |
|---|
| .. | .. |
|---|
| 555 | 564 | udf_pblk_t newblock = 0; |
|---|
| 556 | 565 | uint32_t adsize; |
|---|
| 557 | 566 | uint32_t elen, goal_elen = 0; |
|---|
| 558 | | - struct kernel_lb_addr eloc, uninitialized_var(goal_eloc); |
|---|
| 567 | + struct kernel_lb_addr eloc, goal_eloc; |
|---|
| 559 | 568 | struct extent_position epos, goal_epos; |
|---|
| 560 | 569 | int8_t etype; |
|---|
| 561 | 570 | struct udf_inode_info *iinfo = UDF_I(table); |
|---|
| .. | .. |
|---|
| 652 | 661 | } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) { |
|---|
| 653 | 662 | udf_table_free_blocks(sb, map->s_uspace.s_table, |
|---|
| 654 | 663 | bloc, offset, count); |
|---|
| 655 | | - } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) { |
|---|
| 656 | | - udf_bitmap_free_blocks(sb, map->s_fspace.s_bitmap, |
|---|
| 657 | | - bloc, offset, count); |
|---|
| 658 | | - } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) { |
|---|
| 659 | | - udf_table_free_blocks(sb, map->s_fspace.s_table, |
|---|
| 660 | | - bloc, offset, count); |
|---|
| 661 | 664 | } |
|---|
| 662 | 665 | |
|---|
| 663 | 666 | if (inode) { |
|---|
| .. | .. |
|---|
| 684 | 687 | map->s_uspace.s_table, |
|---|
| 685 | 688 | partition, first_block, |
|---|
| 686 | 689 | block_count); |
|---|
| 687 | | - else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) |
|---|
| 688 | | - allocated = udf_bitmap_prealloc_blocks(sb, |
|---|
| 689 | | - map->s_fspace.s_bitmap, |
|---|
| 690 | | - partition, first_block, |
|---|
| 691 | | - block_count); |
|---|
| 692 | | - else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) |
|---|
| 693 | | - allocated = udf_table_prealloc_blocks(sb, |
|---|
| 694 | | - map->s_fspace.s_table, |
|---|
| 695 | | - partition, first_block, |
|---|
| 696 | | - block_count); |
|---|
| 697 | 690 | else |
|---|
| 698 | 691 | return 0; |
|---|
| 699 | 692 | |
|---|
| .. | .. |
|---|
| 716 | 709 | else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) |
|---|
| 717 | 710 | block = udf_table_new_block(sb, |
|---|
| 718 | 711 | map->s_uspace.s_table, |
|---|
| 719 | | - partition, goal, err); |
|---|
| 720 | | - else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) |
|---|
| 721 | | - block = udf_bitmap_new_block(sb, |
|---|
| 722 | | - map->s_fspace.s_bitmap, |
|---|
| 723 | | - partition, goal, err); |
|---|
| 724 | | - else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) |
|---|
| 725 | | - block = udf_table_new_block(sb, |
|---|
| 726 | | - map->s_fspace.s_table, |
|---|
| 727 | 712 | partition, goal, err); |
|---|
| 728 | 713 | else { |
|---|
| 729 | 714 | *err = -EIO; |
|---|