|
@@ -431,10 +431,9 @@ skip_page:
|
|
|
}
|
|
|
|
|
|
/* Read datablock stored packed inside a fragment (tail-end packed block) */
|
|
|
-static int squashfs_readpage_fragment(struct page *page)
|
|
|
+static int squashfs_readpage_fragment(struct page *page, int expected)
|
|
|
{
|
|
|
struct inode *inode = page->mapping->host;
|
|
|
- struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
|
|
|
struct squashfs_cache_entry *buffer = squashfs_get_fragment(inode->i_sb,
|
|
|
squashfs_i(inode)->fragment_block,
|
|
|
squashfs_i(inode)->fragment_size);
|
|
@@ -445,23 +444,16 @@ static int squashfs_readpage_fragment(struct page *page)
|
|
|
squashfs_i(inode)->fragment_block,
|
|
|
squashfs_i(inode)->fragment_size);
|
|
|
else
|
|
|
- squashfs_copy_cache(page, buffer, i_size_read(inode) &
|
|
|
- (msblk->block_size - 1),
|
|
|
+ squashfs_copy_cache(page, buffer, expected,
|
|
|
squashfs_i(inode)->fragment_offset);
|
|
|
|
|
|
squashfs_cache_put(buffer);
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
-static int squashfs_readpage_sparse(struct page *page, int index, int file_end)
|
|
|
+static int squashfs_readpage_sparse(struct page *page, int expected)
|
|
|
{
|
|
|
- struct inode *inode = page->mapping->host;
|
|
|
- struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
|
|
|
- int bytes = index == file_end ?
|
|
|
- (i_size_read(inode) & (msblk->block_size - 1)) :
|
|
|
- msblk->block_size;
|
|
|
-
|
|
|
- squashfs_copy_cache(page, NULL, bytes, 0);
|
|
|
+ squashfs_copy_cache(page, NULL, expected, 0);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -471,6 +463,9 @@ static int squashfs_readpage(struct file *file, struct page *page)
|
|
|
struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
|
|
|
int index = page->index >> (msblk->block_log - PAGE_SHIFT);
|
|
|
int file_end = i_size_read(inode) >> msblk->block_log;
|
|
|
+ int expected = index == file_end ?
|
|
|
+ (i_size_read(inode) & (msblk->block_size - 1)) :
|
|
|
+ msblk->block_size;
|
|
|
int res;
|
|
|
void *pageaddr;
|
|
|
|
|
@@ -489,11 +484,11 @@ static int squashfs_readpage(struct file *file, struct page *page)
|
|
|
goto error_out;
|
|
|
|
|
|
if (bsize == 0)
|
|
|
- res = squashfs_readpage_sparse(page, index, file_end);
|
|
|
+ res = squashfs_readpage_sparse(page, expected);
|
|
|
else
|
|
|
- res = squashfs_readpage_block(page, block, bsize);
|
|
|
+ res = squashfs_readpage_block(page, block, bsize, expected);
|
|
|
} else
|
|
|
- res = squashfs_readpage_fragment(page);
|
|
|
+ res = squashfs_readpage_fragment(page, expected);
|
|
|
|
|
|
if (!res)
|
|
|
return 0;
|