1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2008 Oracle. All rights reserved. 4 */ 5 6 #ifndef BTRFS_COMPRESSION_H 7 #define BTRFS_COMPRESSION_H 8 9 /* 10 * We want to make sure that amount of RAM required to uncompress an extent is 11 * reasonable, so we limit the total size in ram of a compressed extent to 12 * 128k. This is a crucial number because it also controls how easily we can 13 * spread reads across cpus for decompression. 14 * 15 * We also want to make sure the amount of IO required to do a random read is 16 * reasonably small, so we limit the size of a compressed extent to 128k. 17 */ 18 19 /* Maximum length of compressed data stored on disk */ 20 #define BTRFS_MAX_COMPRESSED (SZ_128K) 21 /* Maximum size of data before compression */ 22 #define BTRFS_MAX_UNCOMPRESSED (SZ_128K) 23 24 #define BTRFS_ZLIB_DEFAULT_LEVEL 3 25 26 struct compressed_bio { 27 /* number of bios pending for this compressed extent */ 28 refcount_t pending_bios; 29 30 /* the pages with the compressed data on them */ 31 struct page **compressed_pages; 32 33 /* inode that owns this data */ 34 struct inode *inode; 35 36 /* starting offset in the inode for our pages */ 37 u64 start; 38 39 /* number of bytes in the inode we're working on */ 40 unsigned long len; 41 42 /* number of bytes on disk */ 43 unsigned long compressed_len; 44 45 /* the compression algorithm for this bio */ 46 int compress_type; 47 48 /* number of compressed pages in the array */ 49 unsigned long nr_pages; 50 51 /* IO errors */ 52 int errors; 53 int mirror_num; 54 55 /* for reads, this is the bio we are copying the data into */ 56 struct bio *orig_bio; 57 58 /* 59 * the start of a variable length array of checksums only 60 * used by reads 61 */ 62 u32 sums; 63 }; 64 65 void __init btrfs_init_compress(void); 66 void __cold btrfs_exit_compress(void); 67 68 int btrfs_compress_pages(unsigned int type_level, struct address_space *mapping, 69 u64 start, struct page **pages, 70 unsigned long *out_pages, 71 unsigned long *total_in, 72 unsigned long *total_out); 73 int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page, 74 unsigned long start_byte, size_t srclen, size_t destlen); 75 int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start, 76 unsigned long total_out, u64 disk_start, 77 struct bio *bio); 78 79 blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start, 80 unsigned long len, u64 disk_start, 81 unsigned long compressed_len, 82 struct page **compressed_pages, 83 unsigned long nr_pages, 84 unsigned int write_flags); 85 blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, 86 int mirror_num, unsigned long bio_flags); 87 88 unsigned btrfs_compress_str2level(const char *str); 89 90 enum btrfs_compression_type { 91 BTRFS_COMPRESS_NONE = 0, 92 BTRFS_COMPRESS_ZLIB = 1, 93 BTRFS_COMPRESS_LZO = 2, 94 BTRFS_COMPRESS_ZSTD = 3, 95 BTRFS_COMPRESS_TYPES = 3, 96 }; 97 98 struct btrfs_compress_op { 99 struct list_head *(*alloc_workspace)(void); 100 101 void (*free_workspace)(struct list_head *workspace); 102 103 int (*compress_pages)(struct list_head *workspace, 104 struct address_space *mapping, 105 u64 start, 106 struct page **pages, 107 unsigned long *out_pages, 108 unsigned long *total_in, 109 unsigned long *total_out); 110 111 int (*decompress_bio)(struct list_head *workspace, 112 struct compressed_bio *cb); 113 114 int (*decompress)(struct list_head *workspace, 115 unsigned char *data_in, 116 struct page *dest_page, 117 unsigned long start_byte, 118 size_t srclen, size_t destlen); 119 120 void (*set_level)(struct list_head *ws, unsigned int type); 121 }; 122 123 extern const struct btrfs_compress_op btrfs_zlib_compress; 124 extern const struct btrfs_compress_op btrfs_lzo_compress; 125 extern const struct btrfs_compress_op btrfs_zstd_compress; 126 127 const char* btrfs_compress_type2str(enum btrfs_compression_type type); 128 129 int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end); 130 131 #endif 132