VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / fs / isofs / dir.c
index 1f2f92a..14d86de 100644 (file)
@@ -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;