60 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2#ifndef PAGE_ACTOR_H3#define PAGE_ACTOR_H4/*5 * Copyright (c) 20136 * Phillip Lougher <phillip@squashfs.org.uk>7 */8 9struct squashfs_page_actor {10 union {11 void **buffer;12 struct page **page;13 };14 void *pageaddr;15 void *tmp_buffer;16 void *(*squashfs_first_page)(struct squashfs_page_actor *);17 void *(*squashfs_next_page)(struct squashfs_page_actor *);18 void (*squashfs_finish_page)(struct squashfs_page_actor *);19 struct page *last_page;20 int pages;21 int length;22 int next_page;23 int alloc_buffer;24 int returned_pages;25 pgoff_t next_index;26};27 28extern struct squashfs_page_actor *squashfs_page_actor_init(void **buffer,29 int pages, int length);30extern struct squashfs_page_actor *squashfs_page_actor_init_special(31 struct squashfs_sb_info *msblk,32 struct page **page, int pages, int length,33 loff_t start_index);34static inline struct page *squashfs_page_actor_free(struct squashfs_page_actor *actor)35{36 struct page *last_page = actor->next_page == actor->pages ? actor->last_page : ERR_PTR(-EIO);37 38 kfree(actor->tmp_buffer);39 kfree(actor);40 41 return last_page;42}43static inline void *squashfs_first_page(struct squashfs_page_actor *actor)44{45 return actor->squashfs_first_page(actor);46}47static inline void *squashfs_next_page(struct squashfs_page_actor *actor)48{49 return actor->squashfs_next_page(actor);50}51static inline void squashfs_finish_page(struct squashfs_page_actor *actor)52{53 actor->squashfs_finish_page(actor);54}55static inline void squashfs_actor_nobuff(struct squashfs_page_actor *actor)56{57 actor->alloc_buffer = 0;58}59#endif60