diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-05-12 21:05:59 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-05-12 21:05:59 +0000 |
commit | ba2dacab305c598cd4c34a604f8e276bf5bab5ff (patch) | |
tree | 78670a0139bf4d5ace617b29b7eba82bbc74d602 /fs/isofs | |
parent | b77bf69998121e689c5e86cc5630d39a0a9ee6ca (diff) |
Merge with Linux 2.3.99-pre7 and various other bits.
Diffstat (limited to 'fs/isofs')
-rw-r--r-- | fs/isofs/dir.c | 31 | ||||
-rw-r--r-- | fs/isofs/inode.c | 2 | ||||
-rw-r--r-- | fs/isofs/rock.c | 4 |
3 files changed, 24 insertions, 13 deletions
diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c index cbb213668..1b99acb19 100644 --- a/fs/isofs/dir.c +++ b/fs/isofs/dir.c @@ -133,12 +133,28 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, block, offset, filp->f_pos); printk("inode->i_size = %x\n",inode->i_size); #endif + /* Next directory_record on next CDROM sector */ + if (offset >= bufsize) { +#ifdef DEBUG + printk("offset >= bufsize\n"); +#endif + brelse(bh); + offset = 0; + block = isofs_bmap(inode, (filp->f_pos) >> bufbits); + if (!block) + return 0; + bh = breada(inode->i_dev, block, bufsize, filp->f_pos, inode->i_size); + if (!bh) + return 0; + continue; + } + de = (struct iso_directory_record *) (bh->b_data + offset); if(first_de) inode_number = (block << bufbits) + (offset & (bufsize - 1)); de_len = *(unsigned char *) de; #ifdef DEBUG - printk("de_len = %ld\n", de_len); + printk("de_len = %d\n", de_len); #endif @@ -146,16 +162,11 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, CDROM sector. If we are at the end of the directory, we kick out of the while loop. */ - if ((de_len == 0) || (offset >= bufsize) ) { + if (de_len == 0) { brelse(bh); - if (de_len == 0) { - filp->f_pos = ((filp->f_pos & ~(ISOFS_BLOCK_SIZE - 1)) - + ISOFS_BLOCK_SIZE); - offset = 0; - } else { - offset -= bufsize; - filp->f_pos += offset; - } + filp->f_pos = ((filp->f_pos & ~(ISOFS_BLOCK_SIZE - 1)) + + ISOFS_BLOCK_SIZE); + offset = 0; if (filp->f_pos >= inode->i_size) return 0; diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index a46b30714..222b5e2bf 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -981,7 +981,7 @@ int isofs_bmap(struct inode *inode, int block) return 0; } -static int isofs_readpage(struct dentry *dentry, struct page *page) +static int isofs_readpage(struct file *file, struct page *page) { return block_read_full_page(page,isofs_get_block); } diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c index 71be5edd1..925c8e2fd 100644 --- a/fs/isofs/rock.c +++ b/fs/isofs/rock.c @@ -445,9 +445,9 @@ static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr) /* readpage() for symlinks: reads symlink contents into the page and either makes it uptodate and returns 0 or returns error (-EIO) */ -static int rock_ridge_symlink_readpage(struct dentry *dentry, struct page *page) +static int rock_ridge_symlink_readpage(struct file *file, struct page *page) { - struct inode *inode = dentry->d_inode; + struct inode *inode = (struct inode*)page->mapping->host; char *link = (char*)kmap(page); unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); unsigned char bufbits = ISOFS_BUFFER_BITS(inode); |