page_actor.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. struct squashfs_page_actor {
  9. union {
  10. void **buffer;
  11. struct page **page;
  12. };
  13. void *pageaddr;
  14. void *tmp_buffer;
  15. void *(*squashfs_first_page)(struct squashfs_page_actor *);
  16. void *(*squashfs_next_page)(struct squashfs_page_actor *);
  17. void (*squashfs_finish_page)(struct squashfs_page_actor *);
  18. struct page *last_page;
  19. int pages;
  20. int length;
  21. int next_page;
  22. int alloc_buffer;
  23. int returned_pages;
  24. pgoff_t next_index;
  25. };
  26. extern struct squashfs_page_actor *squashfs_page_actor_init(void **buffer,
  27. int pages, int length);
  28. extern struct squashfs_page_actor *squashfs_page_actor_init_special(
  29. struct squashfs_sb_info *msblk,
  30. struct page **page, int pages, int length,
  31. loff_t start_index);
  32. static inline struct page *squashfs_page_actor_free(struct squashfs_page_actor *actor)
  33. {
  34. struct page *last_page = actor->next_page == actor->pages ? actor->last_page : ERR_PTR(-EIO);
  35. kfree(actor->tmp_buffer);
  36. kfree(actor);
  37. return last_page;
  38. }
  39. static inline void *squashfs_first_page(struct squashfs_page_actor *actor)
  40. {
  41. return actor->squashfs_first_page(actor);
  42. }
  43. static inline void *squashfs_next_page(struct squashfs_page_actor *actor)
  44. {
  45. return actor->squashfs_next_page(actor);
  46. }
  47. static inline void squashfs_finish_page(struct squashfs_page_actor *actor)
  48. {
  49. actor->squashfs_finish_page(actor);
  50. }
  51. static inline void squashfs_actor_nobuff(struct squashfs_page_actor *actor)
  52. {
  53. actor->alloc_buffer = 0;
  54. }
  55. #endif