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