Merge tag 'spi-fix-v5.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
[linux-2.6-microblaze.git] / fs / erofs / compress.h
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