forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.9 KiB
79 lines
1.9 KiB
/* SPDX-License-Identifier: GPL-2.0-only */ |
|
#ifndef PAGE_ACTOR_H |
|
#define PAGE_ACTOR_H |
|
/* |
|
* Copyright (c) 2013 |
|
* Phillip Lougher <[email protected]> |
|
*/ |
|
|
|
#ifndef CONFIG_SQUASHFS_FILE_DIRECT |
|
struct squashfs_page_actor { |
|
void **page; |
|
int pages; |
|
int length; |
|
int next_page; |
|
}; |
|
|
|
static inline struct squashfs_page_actor *squashfs_page_actor_init(void **page, |
|
int pages, int length) |
|
{ |
|
struct squashfs_page_actor *actor = kmalloc(sizeof(*actor), GFP_KERNEL); |
|
|
|
if (actor == NULL) |
|
return NULL; |
|
|
|
actor->length = length ? : pages * PAGE_SIZE; |
|
actor->page = page; |
|
actor->pages = pages; |
|
actor->next_page = 0; |
|
return actor; |
|
} |
|
|
|
static inline void *squashfs_first_page(struct squashfs_page_actor *actor) |
|
{ |
|
actor->next_page = 1; |
|
return actor->page[0]; |
|
} |
|
|
|
static inline void *squashfs_next_page(struct squashfs_page_actor *actor) |
|
{ |
|
return actor->next_page == actor->pages ? NULL : |
|
actor->page[actor->next_page++]; |
|
} |
|
|
|
static inline void squashfs_finish_page(struct squashfs_page_actor *actor) |
|
{ |
|
/* empty */ |
|
} |
|
#else |
|
struct squashfs_page_actor { |
|
union { |
|
void **buffer; |
|
struct page **page; |
|
}; |
|
void *pageaddr; |
|
void *(*squashfs_first_page)(struct squashfs_page_actor *); |
|
void *(*squashfs_next_page)(struct squashfs_page_actor *); |
|
void (*squashfs_finish_page)(struct squashfs_page_actor *); |
|
int pages; |
|
int length; |
|
int next_page; |
|
}; |
|
|
|
extern struct squashfs_page_actor *squashfs_page_actor_init(void **, int, int); |
|
extern struct squashfs_page_actor *squashfs_page_actor_init_special(struct page |
|
**, int, int); |
|
static inline void *squashfs_first_page(struct squashfs_page_actor *actor) |
|
{ |
|
return actor->squashfs_first_page(actor); |
|
} |
|
static inline void *squashfs_next_page(struct squashfs_page_actor *actor) |
|
{ |
|
return actor->squashfs_next_page(actor); |
|
} |
|
static inline void squashfs_finish_page(struct squashfs_page_actor *actor) |
|
{ |
|
actor->squashfs_finish_page(actor); |
|
} |
|
#endif |
|
#endif
|
|
|