Skip to content

Commit

Permalink
udf: Fix handling of multisession media
Browse files Browse the repository at this point in the history
According to OSTA UDF specification, only anchor blocks and primary volume
descriptors are placed on media relative to the last session. All other block
numbers are absolute (in the partition or the whole media). This seems to be
confirmed by multisession media created by other systems.

Signed-off-by: Sebastian Manciulea <manciuleas@yahoo.com>
Signed-off-by: Jan Kara <jack@suse.cz>
  • Loading branch information
Sebastian Manciulea authored and Jan Kara committed Apr 17, 2008
1 parent 96200be commit f4bcbbd
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 9 deletions.
13 changes: 5 additions & 8 deletions fs/udf/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,16 +203,15 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block,
{
tag *tag_p;
struct buffer_head *bh = NULL;
struct udf_sb_info *sbi = UDF_SB(sb);

/* Read the block */
if (block == 0xFFFFFFFF)
return NULL;

bh = udf_tread(sb, block + sbi->s_session);
bh = udf_tread(sb, block);
if (!bh) {
udf_debug("block=%d, location=%d: read failed\n",
block + sbi->s_session, location);
block, location);
return NULL;
}

Expand All @@ -222,8 +221,7 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block,

if (location != le32_to_cpu(tag_p->tagLocation)) {
udf_debug("location mismatch block %u, tag %u != %u\n",
block + sbi->s_session,
le32_to_cpu(tag_p->tagLocation), location);
block, le32_to_cpu(tag_p->tagLocation), location);
goto error_out;
}

Expand All @@ -247,9 +245,8 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block,
le16_to_cpu(tag_p->descCRCLength), 0))
return bh;

udf_debug("Crc failure block %d: crc = %d, crclen = %d\n",
block + sbi->s_session, le16_to_cpu(tag_p->descCRC),
le16_to_cpu(tag_p->descCRCLength));
udf_debug("Crc failure block %d: crc = %d, crclen = %d\n", block,
le16_to_cpu(tag_p->descCRC), le16_to_cpu(tag_p->descCRCLength));

error_out:
brelse(bh);
Expand Down
2 changes: 1 addition & 1 deletion fs/udf/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -587,7 +587,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
static int udf_vrs(struct super_block *sb, int silent)
{
struct volStructDesc *vsd = NULL;
int sector = 32768;
loff_t sector = 32768;
int sectorsize;
struct buffer_head *bh = NULL;
int iso9660 = 0;
Expand Down

0 comments on commit f4bcbbd

Please sign in to comment.