summaryrefslogtreecommitdiffstats
path: root/fs/isofs
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-05-12 21:05:59 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-05-12 21:05:59 +0000
commitba2dacab305c598cd4c34a604f8e276bf5bab5ff (patch)
tree78670a0139bf4d5ace617b29b7eba82bbc74d602 /fs/isofs
parentb77bf69998121e689c5e86cc5630d39a0a9ee6ca (diff)
Merge with Linux 2.3.99-pre7 and various other bits.
Diffstat (limited to 'fs/isofs')
-rw-r--r--fs/isofs/dir.c31
-rw-r--r--fs/isofs/inode.c2
-rw-r--r--fs/isofs/rock.c4
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);