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