Commit 3fb38dfa authored by Jan Kara's avatar Jan Kara

udf: Move filling of partition descriptor info into a separate function

Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 2e0838fd
...@@ -1024,41 +1024,14 @@ static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index) ...@@ -1024,41 +1024,14 @@ static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index)
return bitmap; return bitmap;
} }
static int udf_load_partdesc(struct super_block *sb, sector_t block) static int udf_fill_partdesc_info(struct super_block *sb,
struct partitionDesc *p, int p_index)
{ {
struct buffer_head *bh;
struct partitionHeaderDesc *phd;
struct partitionDesc *p;
struct udf_part_map *map; struct udf_part_map *map;
struct udf_sb_info *sbi = UDF_SB(sb); struct udf_sb_info *sbi = UDF_SB(sb);
bool found = false; struct partitionHeaderDesc *phd;
int i;
uint16_t partitionNumber;
uint16_t ident;
int ret = 0;
bh = udf_read_tagged(sb, block, block, &ident);
if (!bh)
return 1;
if (ident != TAG_IDENT_PD)
goto out_bh;
p = (struct partitionDesc *)bh->b_data;
partitionNumber = le16_to_cpu(p->partitionNumber);
for (i = 0; i < sbi->s_partitions; i++) {
map = &sbi->s_partmaps[i];
udf_debug("Searching map: (%d == %d)\n",
map->s_partition_num, partitionNumber);
found = map->s_partition_num == partitionNumber;
if (found)
break;
}
if (!found) { map = &sbi->s_partmaps[p_index];
udf_debug("Partition (%d) not found in partition map\n",
partitionNumber);
goto out_bh;
}
map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */ map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */
map->s_partition_root = le32_to_cpu(p->partitionStartingLocation); map->s_partition_root = le32_to_cpu(p->partitionStartingLocation);
...@@ -1073,88 +1046,121 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block) ...@@ -1073,88 +1046,121 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block)
map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE; map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE;
udf_debug("Partition (%d:%d type %x) starts at physical %d, " udf_debug("Partition (%d:%d type %x) starts at physical %d, "
"block length %d\n", partitionNumber, i, "block length %d\n", partitionNumber, p_index,
map->s_partition_type, map->s_partition_root, map->s_partition_type, map->s_partition_root,
map->s_partition_len); map->s_partition_len);
if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) && if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) &&
strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03)) strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03))
goto out_bh; return 0;
phd = (struct partitionHeaderDesc *)p->partitionContentsUse; phd = (struct partitionHeaderDesc *)p->partitionContentsUse;
if (phd->unallocSpaceTable.extLength) { if (phd->unallocSpaceTable.extLength) {
kernel_lb_addr loc = { kernel_lb_addr loc = {
.logicalBlockNum = le32_to_cpu( .logicalBlockNum = le32_to_cpu(
phd->unallocSpaceTable.extPosition), phd->unallocSpaceTable.extPosition),
.partitionReferenceNum = i, .partitionReferenceNum = p_index,
}; };
map->s_uspace.s_table = udf_iget(sb, loc); map->s_uspace.s_table = udf_iget(sb, loc);
if (!map->s_uspace.s_table) { if (!map->s_uspace.s_table) {
udf_debug("cannot load unallocSpaceTable (part %d)\n", udf_debug("cannot load unallocSpaceTable (part %d)\n",
i); p_index);
ret = 1; return 1;
goto out_bh;
} }
map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE; map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE;
udf_debug("unallocSpaceTable (part %d) @ %ld\n", udf_debug("unallocSpaceTable (part %d) @ %ld\n",
i, map->s_uspace.s_table->i_ino); p_index, map->s_uspace.s_table->i_ino);
} }
if (phd->unallocSpaceBitmap.extLength) { if (phd->unallocSpaceBitmap.extLength) {
struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, i); struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
if (!bitmap) { if (!bitmap)
ret = 1; return 1;
goto out_bh;
}
map->s_uspace.s_bitmap = bitmap; map->s_uspace.s_bitmap = bitmap;
bitmap->s_extLength = le32_to_cpu( bitmap->s_extLength = le32_to_cpu(
phd->unallocSpaceBitmap.extLength); phd->unallocSpaceBitmap.extLength);
bitmap->s_extPosition = le32_to_cpu( bitmap->s_extPosition = le32_to_cpu(
phd->unallocSpaceBitmap.extPosition); phd->unallocSpaceBitmap.extPosition);
map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP; map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
udf_debug("unallocSpaceBitmap (part %d) @ %d\n", i, udf_debug("unallocSpaceBitmap (part %d) @ %d\n", p_index,
bitmap->s_extPosition); bitmap->s_extPosition);
} }
if (phd->partitionIntegrityTable.extLength) if (phd->partitionIntegrityTable.extLength)
udf_debug("partitionIntegrityTable (part %d)\n", i); udf_debug("partitionIntegrityTable (part %d)\n", p_index);
if (phd->freedSpaceTable.extLength) { if (phd->freedSpaceTable.extLength) {
kernel_lb_addr loc = { kernel_lb_addr loc = {
.logicalBlockNum = le32_to_cpu( .logicalBlockNum = le32_to_cpu(
phd->freedSpaceTable.extPosition), phd->freedSpaceTable.extPosition),
.partitionReferenceNum = i, .partitionReferenceNum = p_index,
}; };
map->s_fspace.s_table = udf_iget(sb, loc); map->s_fspace.s_table = udf_iget(sb, loc);
if (!map->s_fspace.s_table) { if (!map->s_fspace.s_table) {
udf_debug("cannot load freedSpaceTable (part %d)\n", i); udf_debug("cannot load freedSpaceTable (part %d)\n",
ret = 1; p_index);
goto out_bh; return 1;
} }
map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE; map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE;
udf_debug("freedSpaceTable (part %d) @ %ld\n", udf_debug("freedSpaceTable (part %d) @ %ld\n",
i, map->s_fspace.s_table->i_ino); p_index, map->s_fspace.s_table->i_ino);
} }
if (phd->freedSpaceBitmap.extLength) { if (phd->freedSpaceBitmap.extLength) {
struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, i); struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
if (!bitmap) { if (!bitmap)
ret = 1; return 1;
goto out_bh;
}
map->s_fspace.s_bitmap = bitmap; map->s_fspace.s_bitmap = bitmap;
bitmap->s_extLength = le32_to_cpu( bitmap->s_extLength = le32_to_cpu(
phd->freedSpaceBitmap.extLength); phd->freedSpaceBitmap.extLength);
bitmap->s_extPosition = le32_to_cpu( bitmap->s_extPosition = le32_to_cpu(
phd->freedSpaceBitmap.extPosition); phd->freedSpaceBitmap.extPosition);
map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP; map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP;
udf_debug("freedSpaceBitmap (part %d) @ %d\n", i, udf_debug("freedSpaceBitmap (part %d) @ %d\n", p_index,
bitmap->s_extPosition); bitmap->s_extPosition);
} }
return 0;
}
static int udf_load_partdesc(struct super_block *sb, sector_t block)
{
struct buffer_head *bh;
struct partitionDesc *p;
struct udf_part_map *map;
struct udf_sb_info *sbi = UDF_SB(sb);
bool found = false;
int i;
uint16_t partitionNumber;
uint16_t ident;
int ret = 0;
bh = udf_read_tagged(sb, block, block, &ident);
if (!bh)
return 1;
if (ident != TAG_IDENT_PD)
goto out_bh;
p = (struct partitionDesc *)bh->b_data;
partitionNumber = le16_to_cpu(p->partitionNumber);
for (i = 0; i < sbi->s_partitions; i++) {
map = &sbi->s_partmaps[i];
udf_debug("Searching map: (%d == %d)\n",
map->s_partition_num, partitionNumber);
found = map->s_partition_num == partitionNumber;
if (found)
break;
}
if (!found) {
udf_debug("Partition (%d) not found in partition map\n",
partitionNumber);
goto out_bh;
}
ret = udf_fill_partdesc_info(sb, p, i);
out_bh: out_bh:
/* In case loading failed, we handle cleanup in udf_fill_super */ /* In case loading failed, we handle cleanup in udf_fill_super */
brelse(bh); brelse(bh);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment