page_actor.h (1913B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2#ifndef PAGE_ACTOR_H 3#define PAGE_ACTOR_H 4/* 5 * Copyright (c) 2013 6 * Phillip Lougher <phillip@squashfs.org.uk> 7 */ 8 9#ifndef CONFIG_SQUASHFS_FILE_DIRECT 10struct squashfs_page_actor { 11 void **page; 12 int pages; 13 int length; 14 int next_page; 15}; 16 17static inline struct squashfs_page_actor *squashfs_page_actor_init(void **page, 18 int pages, int length) 19{ 20 struct squashfs_page_actor *actor = kmalloc(sizeof(*actor), GFP_KERNEL); 21 22 if (actor == NULL) 23 return NULL; 24 25 actor->length = length ? : pages * PAGE_SIZE; 26 actor->page = page; 27 actor->pages = pages; 28 actor->next_page = 0; 29 return actor; 30} 31 32static inline void *squashfs_first_page(struct squashfs_page_actor *actor) 33{ 34 actor->next_page = 1; 35 return actor->page[0]; 36} 37 38static inline void *squashfs_next_page(struct squashfs_page_actor *actor) 39{ 40 return actor->next_page == actor->pages ? NULL : 41 actor->page[actor->next_page++]; 42} 43 44static inline void squashfs_finish_page(struct squashfs_page_actor *actor) 45{ 46 /* empty */ 47} 48#else 49struct squashfs_page_actor { 50 union { 51 void **buffer; 52 struct page **page; 53 }; 54 void *pageaddr; 55 void *(*squashfs_first_page)(struct squashfs_page_actor *); 56 void *(*squashfs_next_page)(struct squashfs_page_actor *); 57 void (*squashfs_finish_page)(struct squashfs_page_actor *); 58 int pages; 59 int length; 60 int next_page; 61}; 62 63extern struct squashfs_page_actor *squashfs_page_actor_init(void **, int, int); 64extern struct squashfs_page_actor *squashfs_page_actor_init_special(struct page 65 **, int, int); 66static inline void *squashfs_first_page(struct squashfs_page_actor *actor) 67{ 68 return actor->squashfs_first_page(actor); 69} 70static inline void *squashfs_next_page(struct squashfs_page_actor *actor) 71{ 72 return actor->squashfs_next_page(actor); 73} 74static inline void squashfs_finish_page(struct squashfs_page_actor *actor) 75{ 76 actor->squashfs_finish_page(actor); 77} 78#endif 79#endif