aboutsummaryrefslogtreecommitdiff
path: root/kernel/fs/squashfs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fs/squashfs/file.c')
-rw-r--r--kernel/fs/squashfs/file.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/kernel/fs/squashfs/file.c b/kernel/fs/squashfs/file.c
index 136663c..019603c 100644
--- a/kernel/fs/squashfs/file.c
+++ b/kernel/fs/squashfs/file.c
@@ -382,8 +382,8 @@ static int squashfs_readpage(struct file *file, struct page *page)
long long block;
unsigned int bsize = 0, i;
int bytes, index = page->index >> (msblk->block_log - PAGE_CACHE_SHIFT);
- struct squashfs_cache_entry *fragment = NULL;
- void *pageaddr, *data_ptr = msblk->read_page;
+ struct squashfs_cache_entry *fragment = NULL, *datablock = NULL;
+ void *pageaddr, *data_ptr = NULL;
int mask = (1 << (msblk->block_log - PAGE_CACHE_SHIFT)) - 1;
int start_index = page->index & ~mask;
@@ -414,21 +414,18 @@ static int squashfs_readpage(struct file *file, struct page *page)
msblk->block_size;
sparse = 1;
} else {
- mutex_lock(&msblk->read_page_mutex);
-
/*
* Read and decompress datablock.
*/
- bytes = squashfs_read_data(inode->i_sb,
- msblk->read_page, block, bsize, NULL,
- msblk->block_size);
-
- if (bytes < 0) {
+ datablock = get_datablock(inode->i_sb, block, bsize);
+ if (datablock->error) {
ERROR("Unable to read page, block %llx, size %x"
"\n", block, bsize);
- mutex_unlock(&msblk->read_page_mutex);
+ release_datablock(msblk, datablock);
goto error_out;
}
+ bytes = datablock->length;
+ data_ptr = datablock->data;
}
} else {
/*
@@ -488,7 +485,7 @@ skip_page:
if (fragment)
release_cached_fragment(msblk, fragment);
else if (!sparse)
- mutex_unlock(&msblk->read_page_mutex);
+ release_datablock(msblk, datablock);
return 0;