summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Manciulea <manciuleas@yahoo.com>2008-04-08 14:02:11 +0200
committerJan Kara <jack@suse.cz>2008-04-17 14:28:33 +0200
commitf4bcbbd92ebda971f7c2cd1132b399808ed6cf9b (patch)
tree0c68fff93557d4fbcec3ad0eab0382b3084ba60c
parent96200be3077c5ede16a90b33aca815b444e66043 (diff)
downloadop-kernel-dev-f4bcbbd92ebda971f7c2cd1132b399808ed6cf9b.zip
op-kernel-dev-f4bcbbd92ebda971f7c2cd1132b399808ed6cf9b.tar.gz
udf: Fix handling of multisession media
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>
-rw-r--r--fs/udf/misc.c13
-rw-r--r--fs/udf/super.c2
2 files changed, 6 insertions, 9 deletions
diff --git a/fs/udf/misc.c b/fs/udf/misc.c
index 581b6e4..9699620 100644
--- a/fs/udf/misc.c
+++ b/fs/udf/misc.c
@@ -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;
}
@@ -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;
}
@@ -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);
diff --git a/fs/udf/super.c b/fs/udf/super.c
index 650f20f..787cedf 100644
--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -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;
OpenPOWER on IntegriCloud