1 2 struct inode { 3 long long i_size; 4 struct super_block *i_sb; 5 }; 6 7 struct file { 8 long long f_pos; 9 }; 10 11 struct super_block { 12 int s_blocksize; 13 unsigned char s_blocksize_bits; 14 int s_hs; 15 }; 16 17 static char * isofs_bread(unsigned int block)18isofs_bread(unsigned int block) 19 { 20 if (block) 21 abort (); 22 exit(0); 23 } 24 25 static int do_isofs_readdir(struct inode * inode,struct file * filp)26do_isofs_readdir(struct inode *inode, struct file *filp) 27 { 28 int bufsize = inode->i_sb->s_blocksize; 29 unsigned char bufbits = inode->i_sb->s_blocksize_bits; 30 unsigned int block, offset; 31 char *bh = 0; 32 int hs; 33 34 if (filp->f_pos >= inode->i_size) 35 return 0; 36 37 offset = filp->f_pos & (bufsize - 1); 38 block = filp->f_pos >> bufbits; 39 hs = inode->i_sb->s_hs; 40 41 while (filp->f_pos < inode->i_size) { 42 if (!bh) 43 bh = isofs_bread(block); 44 45 hs += block << bufbits; 46 47 if (hs == 0) 48 filp->f_pos++; 49 50 if (offset >= bufsize) 51 offset &= bufsize - 1; 52 53 if (*bh) 54 filp->f_pos++; 55 56 filp->f_pos++; 57 } 58 return 0; 59 } 60 61 struct super_block s; 62 struct inode i; 63 struct file f; 64 65 int main(int argc,char ** argv)66main(int argc, char **argv) 67 { 68 s.s_blocksize = 512; 69 s.s_blocksize_bits = 9; 70 i.i_size = 2048; 71 i.i_sb = &s; 72 f.f_pos = 0; 73 74 do_isofs_readdir(&i,&f); 75 abort (); 76 } 77