162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2013 462306a36Sopenharmony_ci * Phillip Lougher <phillip@squashfs.org.uk> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/fs.h> 862306a36Sopenharmony_ci#include <linux/vfs.h> 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/slab.h> 1162306a36Sopenharmony_ci#include <linux/string.h> 1262306a36Sopenharmony_ci#include <linux/pagemap.h> 1362306a36Sopenharmony_ci#include <linux/mutex.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "squashfs_fs.h" 1662306a36Sopenharmony_ci#include "squashfs_fs_sb.h" 1762306a36Sopenharmony_ci#include "squashfs_fs_i.h" 1862306a36Sopenharmony_ci#include "squashfs.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* Read separately compressed datablock and memcopy into page cache */ 2162306a36Sopenharmony_ciint squashfs_readpage_block(struct page *page, u64 block, int bsize, int expected) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci struct inode *i = page->mapping->host; 2462306a36Sopenharmony_ci struct squashfs_cache_entry *buffer = squashfs_get_datablock(i->i_sb, 2562306a36Sopenharmony_ci block, bsize); 2662306a36Sopenharmony_ci int res = buffer->error; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci if (res) 2962306a36Sopenharmony_ci ERROR("Unable to read page, block %llx, size %x\n", block, 3062306a36Sopenharmony_ci bsize); 3162306a36Sopenharmony_ci else 3262306a36Sopenharmony_ci squashfs_copy_cache(page, buffer, expected, 0); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci squashfs_cache_put(buffer); 3562306a36Sopenharmony_ci return res; 3662306a36Sopenharmony_ci} 37