18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2013 48c2ecf20Sopenharmony_ci * Phillip Lougher <phillip@squashfs.org.uk> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/fs.h> 88c2ecf20Sopenharmony_ci#include <linux/vfs.h> 98c2ecf20Sopenharmony_ci#include <linux/kernel.h> 108c2ecf20Sopenharmony_ci#include <linux/slab.h> 118c2ecf20Sopenharmony_ci#include <linux/string.h> 128c2ecf20Sopenharmony_ci#include <linux/pagemap.h> 138c2ecf20Sopenharmony_ci#include <linux/mutex.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include "squashfs_fs.h" 168c2ecf20Sopenharmony_ci#include "squashfs_fs_sb.h" 178c2ecf20Sopenharmony_ci#include "squashfs_fs_i.h" 188c2ecf20Sopenharmony_ci#include "squashfs.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci/* Read separately compressed datablock and memcopy into page cache */ 218c2ecf20Sopenharmony_ciint squashfs_readpage_block(struct page *page, u64 block, int bsize, int expected) 228c2ecf20Sopenharmony_ci{ 238c2ecf20Sopenharmony_ci struct inode *i = page->mapping->host; 248c2ecf20Sopenharmony_ci struct squashfs_cache_entry *buffer = squashfs_get_datablock(i->i_sb, 258c2ecf20Sopenharmony_ci block, bsize); 268c2ecf20Sopenharmony_ci int res = buffer->error; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci if (res) 298c2ecf20Sopenharmony_ci ERROR("Unable to read page, block %llx, size %x\n", block, 308c2ecf20Sopenharmony_ci bsize); 318c2ecf20Sopenharmony_ci else 328c2ecf20Sopenharmony_ci squashfs_copy_cache(page, buffer, expected, 0); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci squashfs_cache_put(buffer); 358c2ecf20Sopenharmony_ci return res; 368c2ecf20Sopenharmony_ci} 37