1 /* 2 * Copyright (C) 2008 Oracle. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public 6 * License v2 as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 * General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public 14 * License along with this program; if not, write to the 15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16 * Boston, MA 021110-1307, USA. 17 */ 18 19 #ifndef __BTRFS_COMPRESSION_ 20 #define __BTRFS_COMPRESSION_ 21 22 /* 23 * We want to make sure that amount of RAM required to uncompress an extent is 24 * reasonable, so we limit the total size in ram of a compressed extent to 25 * 128k. This is a crucial number because it also controls how easily we can 26 * spread reads across cpus for decompression. 27 * 28 * We also want to make sure the amount of IO required to do a random read is 29 * reasonably small, so we limit the size of a compressed extent to 128k. 30 */ 31 32 /* Maximum length of compressed data stored on disk */ 33 #define BTRFS_MAX_COMPRESSED (SZ_128K) 34 /* Maximum size of data before compression */ 35 #define BTRFS_MAX_UNCOMPRESSED (SZ_128K) 36 37 void btrfs_init_compress(void); 38 void btrfs_exit_compress(void); 39 40 int btrfs_compress_pages(int type, struct address_space *mapping, 41 u64 start, struct page **pages, 42 unsigned long *out_pages, 43 unsigned long *total_in, 44 unsigned long *total_out); 45 int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page, 46 unsigned long start_byte, size_t srclen, size_t destlen); 47 int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start, 48 unsigned long total_out, u64 disk_start, 49 struct bio *bio); 50 51 int btrfs_submit_compressed_write(struct inode *inode, u64 start, 52 unsigned long len, u64 disk_start, 53 unsigned long compressed_len, 54 struct page **compressed_pages, 55 unsigned long nr_pages); 56 int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, 57 int mirror_num, unsigned long bio_flags); 58 59 enum btrfs_compression_type { 60 BTRFS_COMPRESS_NONE = 0, 61 BTRFS_COMPRESS_ZLIB = 1, 62 BTRFS_COMPRESS_LZO = 2, 63 BTRFS_COMPRESS_TYPES = 2, 64 BTRFS_COMPRESS_LAST = 3, 65 }; 66 67 struct btrfs_compress_op { 68 struct list_head *(*alloc_workspace)(void); 69 70 void (*free_workspace)(struct list_head *workspace); 71 72 int (*compress_pages)(struct list_head *workspace, 73 struct address_space *mapping, 74 u64 start, 75 struct page **pages, 76 unsigned long *out_pages, 77 unsigned long *total_in, 78 unsigned long *total_out); 79 80 int (*decompress_bio)(struct list_head *workspace, 81 struct page **pages_in, 82 u64 disk_start, 83 struct bio *orig_bio, 84 size_t srclen); 85 86 int (*decompress)(struct list_head *workspace, 87 unsigned char *data_in, 88 struct page *dest_page, 89 unsigned long start_byte, 90 size_t srclen, size_t destlen); 91 }; 92 93 extern const struct btrfs_compress_op btrfs_zlib_compress; 94 extern const struct btrfs_compress_op btrfs_lzo_compress; 95 96 #endif 97