Blame view
fs/btrfs/compression.h
5.23 KB
9888c3402
|
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
c8b978188
|
2 3 |
/* * Copyright (C) 2008 Oracle. All rights reserved. |
c8b978188
|
4 |
*/ |
9888c3402
|
5 6 |
#ifndef BTRFS_COMPRESSION_H #define BTRFS_COMPRESSION_H |
c8b978188
|
7 |
|
d5c1d68fd
|
8 |
#include <linux/sizes.h> |
ff7638665
|
9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * We want to make sure that amount of RAM required to uncompress an extent is * reasonable, so we limit the total size in ram of a compressed extent to * 128k. This is a crucial number because it also controls how easily we can * spread reads across cpus for decompression. * * We also want to make sure the amount of IO required to do a random read is * reasonably small, so we limit the size of a compressed extent to 128k. */ /* Maximum length of compressed data stored on disk */ #define BTRFS_MAX_COMPRESSED (SZ_128K) /* Maximum size of data before compression */ #define BTRFS_MAX_UNCOMPRESSED (SZ_128K) |
eae8d8252
|
23 |
#define BTRFS_ZLIB_DEFAULT_LEVEL 3 |
e1ddce71d
|
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
struct compressed_bio { /* number of bios pending for this compressed extent */ refcount_t pending_bios; /* the pages with the compressed data on them */ struct page **compressed_pages; /* inode that owns this data */ struct inode *inode; /* starting offset in the inode for our pages */ u64 start; /* number of bytes in the inode we're working on */ unsigned long len; /* number of bytes on disk */ unsigned long compressed_len; /* the compression algorithm for this bio */ int compress_type; /* number of compressed pages in the array */ unsigned long nr_pages; /* IO errors */ int errors; int mirror_num; /* for reads, this is the bio we are copying the data into */ struct bio *orig_bio; /* * the start of a variable length array of checksums only * used by reads */ |
10fe6ca80
|
60 |
u8 sums[]; |
e1ddce71d
|
61 |
}; |
1972708a8
|
62 63 64 65 66 67 68 69 70 |
static inline unsigned int btrfs_compress_type(unsigned int type_level) { return (type_level & 0xF); } static inline unsigned int btrfs_compress_level(unsigned int type_level) { return ((type_level & 0xF0) >> 4); } |
f5c29bd9d
|
71 |
void __init btrfs_init_compress(void); |
e67c718b5
|
72 |
void __cold btrfs_exit_compress(void); |
261507a02
|
73 |
|
f51d2b591
|
74 |
int btrfs_compress_pages(unsigned int type_level, struct address_space *mapping, |
38c314640
|
75 |
u64 start, struct page **pages, |
261507a02
|
76 77 |
unsigned long *out_pages, unsigned long *total_in, |
e5d749023
|
78 |
unsigned long *total_out); |
261507a02
|
79 80 |
int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page, unsigned long start_byte, size_t srclen, size_t destlen); |
14a3357b4
|
81 |
int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start, |
3a39c18d6
|
82 |
unsigned long total_out, u64 disk_start, |
974b1adc3
|
83 |
struct bio *bio); |
261507a02
|
84 |
|
4e4cbee93
|
85 |
blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start, |
c8b978188
|
86 87 88 |
unsigned long len, u64 disk_start, unsigned long compressed_len, struct page **compressed_pages, |
f82b73593
|
89 90 |
unsigned long nr_pages, unsigned int write_flags); |
4e4cbee93
|
91 |
blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, |
c8b978188
|
92 |
int mirror_num, unsigned long bio_flags); |
ebb8765b2
|
93 |
|
d0ab62ce2
|
94 |
unsigned int btrfs_compress_str2level(unsigned int type, const char *str); |
f51d2b591
|
95 |
|
ebb8765b2
|
96 97 98 99 |
enum btrfs_compression_type { BTRFS_COMPRESS_NONE = 0, BTRFS_COMPRESS_ZLIB = 1, BTRFS_COMPRESS_LZO = 2, |
5c1aab1dd
|
100 101 |
BTRFS_COMPRESS_ZSTD = 3, BTRFS_COMPRESS_TYPES = 3, |
ebb8765b2
|
102 |
}; |
92ee55303
|
103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
struct workspace_manager { const struct btrfs_compress_op *ops; struct list_head idle_ws; spinlock_t ws_lock; /* Number of free workspaces */ int free_ws; /* Total number of allocated workspaces */ atomic_t total_ws; /* Waiters for a free workspace */ wait_queue_head_t ws_wait; }; void btrfs_init_workspace_manager(struct workspace_manager *wsm, const struct btrfs_compress_op *ops); |
7bf499430
|
117 118 |
struct list_head *btrfs_get_workspace(struct workspace_manager *wsm, unsigned int level); |
92ee55303
|
119 120 |
void btrfs_put_workspace(struct workspace_manager *wsm, struct list_head *ws); void btrfs_cleanup_workspace_manager(struct workspace_manager *wsm); |
261507a02
|
121 |
struct btrfs_compress_op { |
92ee55303
|
122 123 124 |
void (*init_workspace_manager)(void); void (*cleanup_workspace_manager)(void); |
7bf499430
|
125 |
struct list_head *(*get_workspace)(unsigned int level); |
92ee55303
|
126 127 |
void (*put_workspace)(struct list_head *ws); |
7bf499430
|
128 |
struct list_head *(*alloc_workspace)(unsigned int level); |
261507a02
|
129 130 131 132 133 |
void (*free_workspace)(struct list_head *workspace); int (*compress_pages)(struct list_head *workspace, struct address_space *mapping, |
38c314640
|
134 |
u64 start, |
261507a02
|
135 |
struct page **pages, |
261507a02
|
136 137 |
unsigned long *out_pages, unsigned long *total_in, |
e5d749023
|
138 |
unsigned long *total_out); |
261507a02
|
139 |
|
974b1adc3
|
140 |
int (*decompress_bio)(struct list_head *workspace, |
e1ddce71d
|
141 |
struct compressed_bio *cb); |
261507a02
|
142 143 144 145 146 147 |
int (*decompress)(struct list_head *workspace, unsigned char *data_in, struct page *dest_page, unsigned long start_byte, size_t srclen, size_t destlen); |
f51d2b591
|
148 |
|
e18333a7c
|
149 150 151 |
/* Maximum level supported by the compression algorithm */ unsigned int max_level; unsigned int default_level; |
261507a02
|
152 |
}; |
ca4ac360a
|
153 154 155 156 |
/* The heuristic workspaces are managed via the 0th workspace manager */ #define BTRFS_NR_WORKSPACE_MANAGERS (BTRFS_COMPRESS_TYPES + 1) extern const struct btrfs_compress_op btrfs_heuristic_compress; |
e8c9f1860
|
157 158 |
extern const struct btrfs_compress_op btrfs_zlib_compress; extern const struct btrfs_compress_op btrfs_lzo_compress; |
5c1aab1dd
|
159 |
extern const struct btrfs_compress_op btrfs_zstd_compress; |
261507a02
|
160 |
|
e128f9c3f
|
161 |
const char* btrfs_compress_type2str(enum btrfs_compression_type type); |
aa53e3bfa
|
162 |
bool btrfs_compress_is_valid_type(const char *str, size_t len); |
e128f9c3f
|
163 |
|
b0c1fe1ea
|
164 |
unsigned int btrfs_compress_set_level(int type, unsigned level); |
c2fcdcdf3
|
165 |
int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end); |
c8b978188
|
166 |
#endif |