linux/fs/squashfs/page_actor.h
<<
>>
Prefs
   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_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