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