1*20c8ccb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2846b730eSPhillip Lougher #ifndef PAGE_ACTOR_H 3846b730eSPhillip Lougher #define PAGE_ACTOR_H 4846b730eSPhillip Lougher /* 5846b730eSPhillip Lougher * Copyright (c) 2013 6846b730eSPhillip Lougher * Phillip Lougher <phillip@squashfs.org.uk> 7846b730eSPhillip Lougher */ 8846b730eSPhillip Lougher 90d455c12SPhillip Lougher #ifndef CONFIG_SQUASHFS_FILE_DIRECT 10846b730eSPhillip Lougher struct squashfs_page_actor { 11846b730eSPhillip Lougher void **page; 12846b730eSPhillip Lougher int pages; 13846b730eSPhillip Lougher int length; 14846b730eSPhillip Lougher int next_page; 15846b730eSPhillip Lougher }; 16846b730eSPhillip Lougher 17846b730eSPhillip Lougher static inline struct squashfs_page_actor *squashfs_page_actor_init(void **page, 18846b730eSPhillip Lougher int pages, int length) 19846b730eSPhillip Lougher { 20846b730eSPhillip Lougher struct squashfs_page_actor *actor = kmalloc(sizeof(*actor), GFP_KERNEL); 21846b730eSPhillip Lougher 22846b730eSPhillip Lougher if (actor == NULL) 23846b730eSPhillip Lougher return NULL; 24846b730eSPhillip Lougher 2509cbfeafSKirill A. Shutemov actor->length = length ? : pages * PAGE_SIZE; 26846b730eSPhillip Lougher actor->page = page; 27846b730eSPhillip Lougher actor->pages = pages; 28846b730eSPhillip Lougher actor->next_page = 0; 29846b730eSPhillip Lougher return actor; 30846b730eSPhillip Lougher } 31846b730eSPhillip Lougher 32846b730eSPhillip Lougher static inline void *squashfs_first_page(struct squashfs_page_actor *actor) 33846b730eSPhillip Lougher { 34846b730eSPhillip Lougher actor->next_page = 1; 35846b730eSPhillip Lougher return actor->page[0]; 36846b730eSPhillip Lougher } 37846b730eSPhillip Lougher 38846b730eSPhillip Lougher static inline void *squashfs_next_page(struct squashfs_page_actor *actor) 39846b730eSPhillip Lougher { 40846b730eSPhillip Lougher return actor->next_page == actor->pages ? NULL : 41846b730eSPhillip Lougher actor->page[actor->next_page++]; 42846b730eSPhillip Lougher } 43846b730eSPhillip Lougher 44846b730eSPhillip Lougher static inline void squashfs_finish_page(struct squashfs_page_actor *actor) 45846b730eSPhillip Lougher { 46846b730eSPhillip Lougher /* empty */ 47846b730eSPhillip Lougher } 480d455c12SPhillip Lougher #else 490d455c12SPhillip Lougher struct squashfs_page_actor { 500d455c12SPhillip Lougher union { 510d455c12SPhillip Lougher void **buffer; 520d455c12SPhillip Lougher struct page **page; 530d455c12SPhillip Lougher }; 540d455c12SPhillip Lougher void *pageaddr; 550d455c12SPhillip Lougher void *(*squashfs_first_page)(struct squashfs_page_actor *); 560d455c12SPhillip Lougher void *(*squashfs_next_page)(struct squashfs_page_actor *); 570d455c12SPhillip Lougher void (*squashfs_finish_page)(struct squashfs_page_actor *); 580d455c12SPhillip Lougher int pages; 590d455c12SPhillip Lougher int length; 600d455c12SPhillip Lougher int next_page; 610d455c12SPhillip Lougher }; 620d455c12SPhillip Lougher 630d455c12SPhillip Lougher extern struct squashfs_page_actor *squashfs_page_actor_init(void **, int, int); 640d455c12SPhillip Lougher extern struct squashfs_page_actor *squashfs_page_actor_init_special(struct page 650d455c12SPhillip Lougher **, int, int); 660d455c12SPhillip Lougher static inline void *squashfs_first_page(struct squashfs_page_actor *actor) 670d455c12SPhillip Lougher { 680d455c12SPhillip Lougher return actor->squashfs_first_page(actor); 690d455c12SPhillip Lougher } 700d455c12SPhillip Lougher static inline void *squashfs_next_page(struct squashfs_page_actor *actor) 710d455c12SPhillip Lougher { 720d455c12SPhillip Lougher return actor->squashfs_next_page(actor); 730d455c12SPhillip Lougher } 740d455c12SPhillip Lougher static inline void squashfs_finish_page(struct squashfs_page_actor *actor) 750d455c12SPhillip Lougher { 760d455c12SPhillip Lougher actor->squashfs_finish_page(actor); 770d455c12SPhillip Lougher } 780d455c12SPhillip Lougher #endif 79846b730eSPhillip Lougher #endif 80