X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fisofs%2Fdir.c;h=14d86de6637d25cb1404a8d83774e4a1bd420ef9;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=1f2f92ab346625cb6d762b3fc5fc8606c9a16662;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c index 1f2f92ab3..14d86de66 100644 --- a/fs/isofs/dir.c +++ b/fs/isofs/dir.c @@ -64,7 +64,8 @@ int isofs_name_translate(struct iso_directory_record *de, char *new, struct inod break; /* Convert remaining ';' to '.' */ - if (c == ';') + /* Also '/' to '.' (broken Acorn-generated ISO9660 images) */ + if (c == ';' || c == '/') c = '.'; new[i] = c; @@ -106,8 +107,8 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, { unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); unsigned char bufbits = ISOFS_BUFFER_BITS(inode); - unsigned int block, offset; - int inode_number = 0; /* Quiet GCC */ + unsigned long block, offset, block_saved, offset_saved; + unsigned long inode_number = 0; /* Quiet GCC */ struct buffer_head *bh = NULL; int len; int map; @@ -129,8 +130,6 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, } de = (struct iso_directory_record *) (bh->b_data + offset); - if (first_de) - inode_number = (bh->b_blocknr << bufbits) + offset; de_len = *(unsigned char *) de; @@ -147,6 +146,8 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, continue; } + block_saved = block; + offset_saved = offset; offset += de_len; /* Make sure we have a full directory entry */ @@ -166,6 +167,15 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, de = tmpde; } + if (first_de) { + isofs_normalize_block_and_offset(de, + &block_saved, + &offset_saved); + inode_number = isofs_get_ino(block_saved, + offset_saved, + bufbits); + } + if (de->flags[-sbi->s_high_sierra] & 0x80) { first_de = 0; filp->f_pos += de_len;