linux/fs/btrfs/compression.h
<<
>>
Prefs
   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
  26struct 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
  65void __init btrfs_init_compress(void);
  66void __cold btrfs_exit_compress(void);
  67
  68int 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);
  73int btrfs_decompress(int type, unsigned char *data_in, struct page *dest_page,
  74                     unsigned long start_byte, size_t srclen, size_t destlen);
  75int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start,
  76                              unsigned long total_out, u64 disk_start,
  77                              struct bio *bio);
  78
  79blk_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);
  85blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
  86                                 int mirror_num, unsigned long bio_flags);
  87
  88unsigned btrfs_compress_str2level(const char *str);
  89
  90enum 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
  98struct 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
 123extern const struct btrfs_compress_op btrfs_zlib_compress;
 124extern const struct btrfs_compress_op btrfs_lzo_compress;
 125extern const struct btrfs_compress_op btrfs_zstd_compress;
 126
 127const char* btrfs_compress_type2str(enum btrfs_compression_type type);
 128
 129int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end);
 130
 131#endif
 132