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