xref: /OK3568_Linux_fs/kernel/fs/squashfs/page_actor.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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