1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2019 HUAWEI, Inc. 4 * https://www.huawei.com/ 5 * Created by Gao Xiang <gaoxiang25@huawei.com> 6 */ 7 #ifndef __EROFS_FS_COMPRESS_H 8 #define __EROFS_FS_COMPRESS_H 9 10 #include "internal.h" 11 12 enum { 13 Z_EROFS_COMPRESSION_SHIFTED = Z_EROFS_COMPRESSION_MAX, 14 Z_EROFS_COMPRESSION_RUNTIME_MAX 15 }; 16 17 struct z_erofs_decompress_req { 18 struct super_block *sb; 19 struct page **in, **out; 20 21 unsigned short pageofs_out; 22 unsigned int inputsize, outputsize; 23 24 /* indicate the algorithm will be used for decompression */ 25 unsigned int alg; 26 bool inplace_io, partial_decoding; 27 }; 28 29 /* 30 * - 0x5A110C8D ('sallocated', Z_EROFS_MAPPING_STAGING) - 31 * used to mark temporary allocated pages from other 32 * file/cached pages and NULL mapping pages. 33 */ 34 #define Z_EROFS_MAPPING_STAGING ((void *)0x5A110C8D) 35 36 /* check if a page is marked as staging */ 37 static inline bool z_erofs_page_is_staging(struct page *page) 38 { 39 return page->mapping == Z_EROFS_MAPPING_STAGING; 40 } 41 42 static inline bool z_erofs_put_stagingpage(struct list_head *pagepool, 43 struct page *page) 44 { 45 if (!z_erofs_page_is_staging(page)) 46 return false; 47 48 /* staging pages should not be used by others at the same time */ 49 if (page_ref_count(page) > 1) 50 put_page(page); 51 else 52 list_add(&page->lru, pagepool); 53 return true; 54 } 55 56 int z_erofs_decompress(struct z_erofs_decompress_req *rq, 57 struct list_head *pagepool); 58 59 #endif 60 61