root/fs/btrfs/compression.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. btrfs_compress_type
  2. btrfs_compress_level

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

/* [<][>][^][v][top][bottom][index][help] */