xref: /linux/fs/squashfs/page_actor.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
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