--- ./fs/isofs/inode.c.orig Fri Nov 29 00:53:15 2002 +++ ./fs/isofs/inode.c Mon Mar 17 23:24:56 2003 @@ -680,14 +680,14 @@ first_data_zone = ((isonum_733 (rootp->extent) + isonum_711 (rootp->ext_attr_length)) - << s -> u.isofs_sb.s_log_zone_size); + << (s -> u.isofs_sb.s_log_zone_size - 1)); s->u.isofs_sb.s_firstdatazone = first_data_zone; #ifndef BEQUIET printk(KERN_DEBUG "Max size:%ld Log zone size:%ld\n", s->u.isofs_sb.s_max_size, 1UL << s->u.isofs_sb.s_log_zone_size); printk(KERN_DEBUG "First datazone:%ld Root inode number:%ld\n", - s->u.isofs_sb.s_firstdatazone >> s -> u.isofs_sb.s_log_zone_size, + s->u.isofs_sb.s_firstdatazone >> (s -> u.isofs_sb.s_log_zone_size - 1), s->u.isofs_sb.s_firstdatazone); if(high_sierra) printk(KERN_DEBUG "Disc in High Sierra format.\n"); @@ -707,7 +707,7 @@ pri->root_directory_record; first_data_zone = ((isonum_733 (rootp->extent) + isonum_711 (rootp->ext_attr_length)) - << s -> u.isofs_sb.s_log_zone_size); + << (s -> u.isofs_sb.s_log_zone_size - 1)); } /* @@ -1052,8 +1052,8 @@ inode->i_size = 0; inode->u.isofs_i.i_next_section_ino = 0; - block = f_pos >> ISOFS_BUFFER_BITS(inode); - offset = f_pos & (bufsize-1); + block = f_pos >> (ISOFS_BUFFER_BITS(inode)-1); + offset = (f_pos<<1) & (bufsize-1); do { struct iso_directory_record * de; @@ -1070,8 +1070,8 @@ if (de_len == 0) { brelse(bh); bh = NULL; - f_pos = (f_pos + ISOFS_BLOCK_SIZE) & ~(ISOFS_BLOCK_SIZE - 1); - block = f_pos >> ISOFS_BUFFER_BITS(inode); + f_pos = (f_pos + ISOFS_BLOCK_SIZE/2) & ~(ISOFS_BLOCK_SIZE/2 - 1); + block = f_pos >> (ISOFS_BUFFER_BITS(inode)-1); offset = 0; continue; } @@ -1106,7 +1106,7 @@ more_entries = de->flags[-high_sierra] & 0x80; - f_pos += de_len; + f_pos += de_len>>1; i++; if(i > 100) goto out_toomany; @@ -1141,7 +1141,7 @@ { struct super_block *sb = inode->i_sb; unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); - int block = inode->i_ino >> ISOFS_BUFFER_BITS(inode); + int block = inode->i_ino >> (ISOFS_BUFFER_BITS(inode)-1); int high_sierra = sb->u.isofs_sb.s_high_sierra; struct buffer_head * bh = NULL; struct iso_directory_record * de; @@ -1154,7 +1154,7 @@ if (!bh) goto out_badread; - offset = (inode->i_ino & (bufsize - 1)); + offset = ((inode->i_ino<<1) & (bufsize - 1)); de = (struct iso_directory_record *) (bh->b_data + offset); de_len = *(unsigned char *) de; --- ./fs/isofs/rock.c.orig Mon Feb 25 20:38:08 2002 +++ ./fs/isofs/rock.c Mon Mar 17 23:33:32 2003 @@ -368,7 +368,7 @@ inode->u.isofs_i.i_first_extent = isonum_733(rr->u.CL.location); reloc = iget(inode->i_sb, (inode->u.isofs_i.i_first_extent << - inode -> i_sb -> u.isofs_sb.s_log_zone_size)); + (inode -> i_sb -> u.isofs_sb.s_log_zone_size - 1))); if (!reloc) goto out; inode->i_mode = reloc->i_mode; @@ -509,20 +509,20 @@ if (!inode->i_sb->u.isofs_sb.s_rock) panic ("Cannot have symlink with high sierra variant of iso filesystem\n"); - block = inode->i_ino >> bufbits; + block = inode->i_ino >> (bufbits-1); lock_kernel(); bh = sb_bread(inode->i_sb, block); if (!bh) goto out_noread; - pnt = (unsigned char *) bh->b_data + (inode->i_ino & (bufsize - 1)); + pnt = (unsigned char *) bh->b_data + ((inode->i_ino<<1) & (bufsize - 1)); raw_inode = (struct iso_directory_record *) pnt; /* * If we go past the end of the buffer, there is some sort of error. */ - if ((inode->i_ino & (bufsize - 1)) + *pnt > bufsize) + if (((inode->i_ino<<1) & (bufsize - 1)) + *pnt > bufsize) goto out_bad_span; /* Now test for possible Rock Ridge extensions which will override --- ./fs/isofs/dir.c.orig Mon Feb 25 20:38:08 2002 +++ ./fs/isofs/dir.c Sun Mar 16 18:42:12 2003 @@ -130,7 +130,7 @@ de = (struct iso_directory_record *) (bh->b_data + offset); if (first_de) - inode_number = (bh->b_blocknr << bufbits) + offset; + inode_number = (bh->b_blocknr << (bufbits-1)) + (offset>>1); de_len = *(unsigned char *) de; --- ./fs/isofs/namei.c.orig Mon Feb 25 20:38:08 2002 +++ ./fs/isofs/namei.c Sun Mar 16 18:59:31 2003 @@ -84,7 +84,7 @@ } de = (struct iso_directory_record *) (bh->b_data + offset); - inode_number = (bh->b_blocknr << bufbits) + offset; + inode_number = (bh->b_blocknr << (bufbits-1)) + (offset>>1); de_len = *(unsigned char *) de; if (!de_len) {