162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci#ifndef PAGE_ACTOR_H
362306a36Sopenharmony_ci#define PAGE_ACTOR_H
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci * Copyright (c) 2013
662306a36Sopenharmony_ci * Phillip Lougher <phillip@squashfs.org.uk>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistruct squashfs_page_actor {
1062306a36Sopenharmony_ci	union {
1162306a36Sopenharmony_ci		void		**buffer;
1262306a36Sopenharmony_ci		struct page	**page;
1362306a36Sopenharmony_ci	};
1462306a36Sopenharmony_ci	void	*pageaddr;
1562306a36Sopenharmony_ci	void	*tmp_buffer;
1662306a36Sopenharmony_ci	void    *(*squashfs_first_page)(struct squashfs_page_actor *);
1762306a36Sopenharmony_ci	void    *(*squashfs_next_page)(struct squashfs_page_actor *);
1862306a36Sopenharmony_ci	void    (*squashfs_finish_page)(struct squashfs_page_actor *);
1962306a36Sopenharmony_ci	struct page *last_page;
2062306a36Sopenharmony_ci	int	pages;
2162306a36Sopenharmony_ci	int	length;
2262306a36Sopenharmony_ci	int	next_page;
2362306a36Sopenharmony_ci	int	alloc_buffer;
2462306a36Sopenharmony_ci	int	returned_pages;
2562306a36Sopenharmony_ci	pgoff_t	next_index;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciextern struct squashfs_page_actor *squashfs_page_actor_init(void **buffer,
2962306a36Sopenharmony_ci				int pages, int length);
3062306a36Sopenharmony_ciextern struct squashfs_page_actor *squashfs_page_actor_init_special(
3162306a36Sopenharmony_ci				struct squashfs_sb_info *msblk,
3262306a36Sopenharmony_ci				struct page **page, int pages, int length);
3362306a36Sopenharmony_cistatic inline struct page *squashfs_page_actor_free(struct squashfs_page_actor *actor)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	struct page *last_page = actor->last_page;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	kfree(actor->tmp_buffer);
3862306a36Sopenharmony_ci	kfree(actor);
3962306a36Sopenharmony_ci	return last_page;
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_cistatic inline void *squashfs_first_page(struct squashfs_page_actor *actor)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	return actor->squashfs_first_page(actor);
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_cistatic inline void *squashfs_next_page(struct squashfs_page_actor *actor)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return actor->squashfs_next_page(actor);
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_cistatic inline void squashfs_finish_page(struct squashfs_page_actor *actor)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	actor->squashfs_finish_page(actor);
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_cistatic inline void squashfs_actor_nobuff(struct squashfs_page_actor *actor)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	actor->alloc_buffer = 0;
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci#endif
58