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 10 struct squashfs_page_actor { 11 void **page; 12 int pages; 13 int length; 14 int next_page; 15 }; 16 squashfs_page_actor_init(void ** page,int pages,int length)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 squashfs_first_page(struct squashfs_page_actor * actor)32static inline void *squashfs_first_page(struct squashfs_page_actor *actor) 33 { 34 actor->next_page = 1; 35 return actor->page[0]; 36 } 37 squashfs_next_page(struct squashfs_page_actor * actor)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 squashfs_finish_page(struct squashfs_page_actor * actor)44static inline void squashfs_finish_page(struct squashfs_page_actor *actor) 45 { 46 /* empty */ 47 } 48 #else 49 struct 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 63 extern struct squashfs_page_actor *squashfs_page_actor_init(void **, int, int); 64 extern struct squashfs_page_actor *squashfs_page_actor_init_special(struct page 65 **, int, int); squashfs_first_page(struct squashfs_page_actor * actor)66static inline void *squashfs_first_page(struct squashfs_page_actor *actor) 67 { 68 return actor->squashfs_first_page(actor); 69 } squashfs_next_page(struct squashfs_page_actor * actor)70static inline void *squashfs_next_page(struct squashfs_page_actor *actor) 71 { 72 return actor->squashfs_next_page(actor); 73 } squashfs_finish_page(struct squashfs_page_actor * actor)74static inline void squashfs_finish_page(struct squashfs_page_actor *actor) 75 { 76 actor->squashfs_finish_page(actor); 77 } 78 #endif 79 #endif 80