29b24f6ca112d drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2019-07-31 23:57:31 +0800 1) /* SPDX-License-Identifier: GPL-2.0-only */
29b24f6ca112d drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2019-07-31 23:57:31 +0800 2) /*
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 3) * Copyright (C) 2018 HUAWEI, Inc.
592e7cd00bb9d fs/erofs/zpvec.h (Alexander A. Klimov 2020-07-13 15:09:44 +0200 4) * https://www.huawei.com/
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 5) * Created by Gao Xiang <gaoxiang25@huawei.com>
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 6) */
57b78c9fd9ce4 drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:32 +0800 7) #ifndef __EROFS_FS_ZPVEC_H
57b78c9fd9ce4 drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:32 +0800 8) #define __EROFS_FS_ZPVEC_H
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 9)
57b78c9fd9ce4 drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:32 +0800 10) #include "tagptr.h"
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 11)
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 12) /* page type in pagevec for decompress subsystem */
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 13) enum z_erofs_page_type {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 14) /* including Z_EROFS_VLE_PAGE_TAIL_EXCLUSIVE */
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 15) Z_EROFS_PAGE_TYPE_EXCLUSIVE,
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 16)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 17) Z_EROFS_VLE_PAGE_TYPE_TAIL_SHARED,
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 18)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 19) Z_EROFS_VLE_PAGE_TYPE_HEAD,
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 20) Z_EROFS_VLE_PAGE_TYPE_MAX
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 21) };
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 22)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 23) extern void __compiletime_error("Z_EROFS_PAGE_TYPE_EXCLUSIVE != 0")
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 24) __bad_page_type_exclusive(void);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 25)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 26) /* pagevec tagged pointer */
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 27) typedef tagptr2_t erofs_vtptr_t;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 28)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 29) /* pagevec collector */
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 30) struct z_erofs_pagevec_ctor {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 31) struct page *curr, *next;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 32) erofs_vtptr_t *pages;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 33)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 34) unsigned int nr, index;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 35) };
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 36)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 37) static inline void z_erofs_pagevec_ctor_exit(struct z_erofs_pagevec_ctor *ctor,
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 38) bool atomic)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 39) {
561fb35a9d04c drivers/staging/erofs/unzip_pagevec.h (Bhanusree Pola 2019-03-22 10:38:16 +0800 40) if (!ctor->curr)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 41) return;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 42)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 43) if (atomic)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 44) kunmap_atomic(ctor->pages);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 45) else
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 46) kunmap(ctor->curr);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 47) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 48)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 49) static inline struct page *
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 50) z_erofs_pagevec_ctor_next_page(struct z_erofs_pagevec_ctor *ctor,
e82a9a17d49c5 drivers/staging/erofs/unzip_pagevec.h (Pratik Shinde 2019-07-15 17:51:27 +0530 51) unsigned int nr)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 52) {
e82a9a17d49c5 drivers/staging/erofs/unzip_pagevec.h (Pratik Shinde 2019-07-15 17:51:27 +0530 53) unsigned int index;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 54)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 55) /* keep away from occupied pages */
561fb35a9d04c drivers/staging/erofs/unzip_pagevec.h (Bhanusree Pola 2019-03-22 10:38:16 +0800 56) if (ctor->next)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 57) return ctor->next;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 58)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 59) for (index = 0; index < nr; ++index) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 60) const erofs_vtptr_t t = ctor->pages[index];
e82a9a17d49c5 drivers/staging/erofs/unzip_pagevec.h (Pratik Shinde 2019-07-15 17:51:27 +0530 61) const unsigned int tags = tagptr_unfold_tags(t);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 62)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 63) if (tags == Z_EROFS_PAGE_TYPE_EXCLUSIVE)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 64) return tagptr_unfold_ptr(t);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 65) }
3fb58b8572ae2 drivers/staging/erofs/unzip_pagevec.h (Hariprasad Kelam 2019-05-19 17:35:57 +0800 66) DBG_BUGON(nr >= ctor->nr);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 67) return NULL;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 68) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 69)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 70) static inline void
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 71) z_erofs_pagevec_ctor_pagedown(struct z_erofs_pagevec_ctor *ctor,
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 72) bool atomic)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 73) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 74) struct page *next = z_erofs_pagevec_ctor_next_page(ctor, ctor->nr);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 75)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 76) z_erofs_pagevec_ctor_exit(ctor, atomic);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 77)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 78) ctor->curr = next;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 79) ctor->next = NULL;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 80) ctor->pages = atomic ?
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 81) kmap_atomic(ctor->curr) : kmap(ctor->curr);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 82)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 83) ctor->nr = PAGE_SIZE / sizeof(struct page *);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 84) ctor->index = 0;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 85) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 86)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 87) static inline void z_erofs_pagevec_ctor_init(struct z_erofs_pagevec_ctor *ctor,
e82a9a17d49c5 drivers/staging/erofs/unzip_pagevec.h (Pratik Shinde 2019-07-15 17:51:27 +0530 88) unsigned int nr,
e82a9a17d49c5 drivers/staging/erofs/unzip_pagevec.h (Pratik Shinde 2019-07-15 17:51:27 +0530 89) erofs_vtptr_t *pages,
e82a9a17d49c5 drivers/staging/erofs/unzip_pagevec.h (Pratik Shinde 2019-07-15 17:51:27 +0530 90) unsigned int i)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 91) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 92) ctor->nr = nr;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 93) ctor->curr = ctor->next = NULL;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 94) ctor->pages = pages;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 95)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 96) if (i >= nr) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 97) i -= nr;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 98) z_erofs_pagevec_ctor_pagedown(ctor, false);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 99) while (i > ctor->nr) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 100) i -= ctor->nr;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 101) z_erofs_pagevec_ctor_pagedown(ctor, false);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 102) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 103) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 104) ctor->next = z_erofs_pagevec_ctor_next_page(ctor, i);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 105) ctor->index = i;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 106) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 107)
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 108) static inline bool z_erofs_pagevec_enqueue(struct z_erofs_pagevec_ctor *ctor,
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 109) struct page *page,
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 110) enum z_erofs_page_type type,
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 111) bool *occupied)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 112) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 113) *occupied = false;
8d8a09b093d70 fs/erofs/zpvec.h (Gao Xiang 2019-08-30 00:38:27 +0800 114) if (!ctor->next && type)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 115) if (ctor->index + 1 == ctor->nr)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 116) return false;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 117)
8d8a09b093d70 fs/erofs/zpvec.h (Gao Xiang 2019-08-30 00:38:27 +0800 118) if (ctor->index >= ctor->nr)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 119) z_erofs_pagevec_ctor_pagedown(ctor, false);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 120)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 121) /* exclusive page type must be 0 */
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 122) if (Z_EROFS_PAGE_TYPE_EXCLUSIVE != (uintptr_t)NULL)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 123) __bad_page_type_exclusive();
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 124)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 125) /* should remind that collector->next never equal to 1, 2 */
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 126) if (type == (uintptr_t)ctor->next) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 127) ctor->next = page;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 128) *occupied = true;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 129) }
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 130) ctor->pages[ctor->index++] = tagptr_fold(erofs_vtptr_t, page, type);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 131) return true;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 132) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 133)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 134) static inline struct page *
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 135) z_erofs_pagevec_dequeue(struct z_erofs_pagevec_ctor *ctor,
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 136) enum z_erofs_page_type *type)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 137) {
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 138) erofs_vtptr_t t;
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 139)
8d8a09b093d70 fs/erofs/zpvec.h (Gao Xiang 2019-08-30 00:38:27 +0800 140) if (ctor->index >= ctor->nr) {
70b17991d8955 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-12-11 15:17:49 +0800 141) DBG_BUGON(!ctor->next);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 142) z_erofs_pagevec_ctor_pagedown(ctor, true);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 143) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 144)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 145) t = ctor->pages[ctor->index];
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 146)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 147) *type = tagptr_unfold_tags(t);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 148)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 149) /* should remind that collector->next never equal to 1, 2 */
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 150) if (*type == (uintptr_t)ctor->next)
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 151) ctor->next = tagptr_unfold_ptr(t);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 152)
046d64e1189fe drivers/staging/erofs/zpvec.h (Gao Xiang 2019-07-31 23:57:45 +0800 153) ctor->pages[ctor->index++] = tagptr_fold(erofs_vtptr_t, NULL, 0);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 154) return tagptr_unfold_ptr(t);
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 155) }
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 156) #endif
5eb20ec3e5249 drivers/staging/erofs/unzip_pagevec.h (Gao Xiang 2018-07-26 20:21:57 +0800 157)