Blame view

fs/btrfs/compression.h 5.23 KB
9888c3402   David Sterba   btrfs: replace GP...
1
  /* SPDX-License-Identifier: GPL-2.0 */
c8b978188   Chris Mason   Btrfs: Add zlib c...
2
3
  /*
   * Copyright (C) 2008 Oracle.  All rights reserved.
c8b978188   Chris Mason   Btrfs: Add zlib c...
4
   */
9888c3402   David Sterba   btrfs: replace GP...
5
6
  #ifndef BTRFS_COMPRESSION_H
  #define BTRFS_COMPRESSION_H
c8b978188   Chris Mason   Btrfs: Add zlib c...
7

d5c1d68fd   Qu Wenruo   btrfs: compressio...
8
  #include <linux/sizes.h>
ff7638665   David Sterba   btrfs: export com...
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   Qu Wenruo   btrfs: Fix wild m...
23
  #define	BTRFS_ZLIB_DEFAULT_LEVEL		3
e1ddce71d   Anand Jain   btrfs: reduce arg...
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   Johannes Thumshirn   btrfs: don't assu...
60
  	u8 sums[];
e1ddce71d   Anand Jain   btrfs: reduce arg...
61
  };
1972708a8   Dennis Zhou   btrfs: add helper...
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   Liu Bo   Btrfs: add __init...
71
  void __init btrfs_init_compress(void);
e67c718b5   David Sterba   btrfs: add more _...
72
  void __cold btrfs_exit_compress(void);
261507a02   Li Zefan   btrfs: Allow to a...
73

f51d2b591   David Sterba   btrfs: allow to s...
74
  int btrfs_compress_pages(unsigned int type_level, struct address_space *mapping,
38c314640   David Sterba   btrfs: merge leng...
75
  			 u64 start, struct page **pages,
261507a02   Li Zefan   btrfs: Allow to a...
76
77
  			 unsigned long *out_pages,
  			 unsigned long *total_in,
e5d749023   David Sterba   btrfs: derive max...
78
  			 unsigned long *total_out);
261507a02   Li Zefan   btrfs: Allow to a...
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   David Sterba   btrfs: constify b...
81
  int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start,
3a39c18d6   Li Zefan   btrfs: Extract du...
82
  			      unsigned long total_out, u64 disk_start,
974b1adc3   Christoph Hellwig   btrfs: use bio it...
83
  			      struct bio *bio);
261507a02   Li Zefan   btrfs: Allow to a...
84

4e4cbee93   Christoph Hellwig   block: switch bio...
85
  blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,
c8b978188   Chris Mason   Btrfs: Add zlib c...
86
87
88
  				  unsigned long len, u64 disk_start,
  				  unsigned long compressed_len,
  				  struct page **compressed_pages,
f82b73593   Liu Bo   Btrfs: add write_...
89
90
  				  unsigned long nr_pages,
  				  unsigned int write_flags);
4e4cbee93   Christoph Hellwig   block: switch bio...
91
  blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
c8b978188   Chris Mason   Btrfs: Add zlib c...
92
  				 int mirror_num, unsigned long bio_flags);
ebb8765b2   Anand Jain   btrfs: move btrfs...
93

d0ab62ce2   Dennis Zhou   btrfs: change set...
94
  unsigned int btrfs_compress_str2level(unsigned int type, const char *str);
f51d2b591   David Sterba   btrfs: allow to s...
95

ebb8765b2   Anand Jain   btrfs: move btrfs...
96
97
98
99
  enum btrfs_compression_type {
  	BTRFS_COMPRESS_NONE  = 0,
  	BTRFS_COMPRESS_ZLIB  = 1,
  	BTRFS_COMPRESS_LZO   = 2,
5c1aab1dd   Nick Terrell   btrfs: Add zstd s...
100
101
  	BTRFS_COMPRESS_ZSTD  = 3,
  	BTRFS_COMPRESS_TYPES = 3,
ebb8765b2   Anand Jain   btrfs: move btrfs...
102
  };
92ee55303   Dennis Zhou   btrfs: move to fu...
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   Dennis Zhou   btrfs: plumb leve...
117
118
  struct list_head *btrfs_get_workspace(struct workspace_manager *wsm,
  				      unsigned int level);
92ee55303   Dennis Zhou   btrfs: move to fu...
119
120
  void btrfs_put_workspace(struct workspace_manager *wsm, struct list_head *ws);
  void btrfs_cleanup_workspace_manager(struct workspace_manager *wsm);
261507a02   Li Zefan   btrfs: Allow to a...
121
  struct btrfs_compress_op {
92ee55303   Dennis Zhou   btrfs: move to fu...
122
123
124
  	void (*init_workspace_manager)(void);
  
  	void (*cleanup_workspace_manager)(void);
7bf499430   Dennis Zhou   btrfs: plumb leve...
125
  	struct list_head *(*get_workspace)(unsigned int level);
92ee55303   Dennis Zhou   btrfs: move to fu...
126
127
  
  	void (*put_workspace)(struct list_head *ws);
7bf499430   Dennis Zhou   btrfs: plumb leve...
128
  	struct list_head *(*alloc_workspace)(unsigned int level);
261507a02   Li Zefan   btrfs: Allow to a...
129
130
131
132
133
  
  	void (*free_workspace)(struct list_head *workspace);
  
  	int (*compress_pages)(struct list_head *workspace,
  			      struct address_space *mapping,
38c314640   David Sterba   btrfs: merge leng...
134
  			      u64 start,
261507a02   Li Zefan   btrfs: Allow to a...
135
  			      struct page **pages,
261507a02   Li Zefan   btrfs: Allow to a...
136
137
  			      unsigned long *out_pages,
  			      unsigned long *total_in,
e5d749023   David Sterba   btrfs: derive max...
138
  			      unsigned long *total_out);
261507a02   Li Zefan   btrfs: Allow to a...
139

974b1adc3   Christoph Hellwig   btrfs: use bio it...
140
  	int (*decompress_bio)(struct list_head *workspace,
e1ddce71d   Anand Jain   btrfs: reduce arg...
141
  				struct compressed_bio *cb);
261507a02   Li Zefan   btrfs: Allow to a...
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   David Sterba   btrfs: allow to s...
148

e18333a7c   David Sterba   btrfs: define com...
149
150
151
  	/* Maximum level supported by the compression algorithm */
  	unsigned int max_level;
  	unsigned int default_level;
261507a02   Li Zefan   btrfs: Allow to a...
152
  };
ca4ac360a   Dennis Zhou   btrfs: manage heu...
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   David Sterba   btrfs: constify s...
157
158
  extern const struct btrfs_compress_op btrfs_zlib_compress;
  extern const struct btrfs_compress_op btrfs_lzo_compress;
5c1aab1dd   Nick Terrell   btrfs: Add zstd s...
159
  extern const struct btrfs_compress_op btrfs_zstd_compress;
261507a02   Li Zefan   btrfs: Allow to a...
160

e128f9c3f   David Sterba   btrfs: compressio...
161
  const char* btrfs_compress_type2str(enum btrfs_compression_type type);
aa53e3bfa   Johannes Thumshirn   btrfs: correctly ...
162
  bool btrfs_compress_is_valid_type(const char *str, size_t len);
e128f9c3f   David Sterba   btrfs: compressio...
163

b0c1fe1ea   David Sterba   btrfs: compressio...
164
  unsigned int btrfs_compress_set_level(int type, unsigned level);
c2fcdcdf3   Timofey Titovets   Btrfs: add skelet...
165
  int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end);
c8b978188   Chris Mason   Btrfs: Add zlib c...
166
  #endif