LCOV - code coverage report
Current view: top level - fs/btrfs - compression.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsx @ Mon Jul 31 20:08:34 PDT 2023 Lines: 2 2 100.0 %
Date: 2023-07-31 20:08:34 Functions: 0 0 -

          Line data    Source code
       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             : #include "bio.h"
      11             : 
      12             : struct btrfs_inode;
      13             : struct btrfs_ordered_extent;
      14             : 
      15             : /*
      16             :  * We want to make sure that amount of RAM required to uncompress an extent is
      17             :  * reasonable, so we limit the total size in ram of a compressed extent to
      18             :  * 128k.  This is a crucial number because it also controls how easily we can
      19             :  * spread reads across cpus for decompression.
      20             :  *
      21             :  * We also want to make sure the amount of IO required to do a random read is
      22             :  * reasonably small, so we limit the size of a compressed extent to 128k.
      23             :  */
      24             : 
      25             : /* Maximum length of compressed data stored on disk */
      26             : #define BTRFS_MAX_COMPRESSED            (SZ_128K)
      27             : #define BTRFS_MAX_COMPRESSED_PAGES      (BTRFS_MAX_COMPRESSED / PAGE_SIZE)
      28             : static_assert((BTRFS_MAX_COMPRESSED % PAGE_SIZE) == 0);
      29             : 
      30             : /* Maximum size of data before compression */
      31             : #define BTRFS_MAX_UNCOMPRESSED          (SZ_128K)
      32             : 
      33             : #define BTRFS_ZLIB_DEFAULT_LEVEL                3
      34             : 
      35             : struct compressed_bio {
      36             :         /* Number of compressed pages in the array */
      37             :         unsigned int nr_pages;
      38             : 
      39             :         /* the pages with the compressed data on them */
      40             :         struct page **compressed_pages;
      41             : 
      42             :         /* starting offset in the inode for our pages */
      43             :         u64 start;
      44             : 
      45             :         /* Number of bytes in the inode we're working on */
      46             :         unsigned int len;
      47             : 
      48             :         /* Number of bytes on disk */
      49             :         unsigned int compressed_len;
      50             : 
      51             :         /* The compression algorithm for this bio */
      52             :         u8 compress_type;
      53             : 
      54             :         /* Whether this is a write for writeback. */
      55             :         bool writeback;
      56             : 
      57             :         union {
      58             :                 /* For reads, this is the bio we are copying the data into */
      59             :                 struct btrfs_bio *orig_bbio;
      60             :                 struct work_struct write_end_work;
      61             :         };
      62             : 
      63             :         /* Must be last. */
      64             :         struct btrfs_bio bbio;
      65             : };
      66             : 
      67             : static inline unsigned int btrfs_compress_type(unsigned int type_level)
      68             : {
      69      158281 :         return (type_level & 0xF);
      70             : }
      71             : 
      72             : static inline unsigned int btrfs_compress_level(unsigned int type_level)
      73             : {
      74      158281 :         return ((type_level & 0xF0) >> 4);
      75             : }
      76             : 
      77             : int __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, const u8 *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, u32 buf_len,
      88             :                               struct compressed_bio *cb, u32 decompressed);
      89             : 
      90             : void btrfs_submit_compressed_write(struct btrfs_ordered_extent *ordered,
      91             :                                   struct page **compressed_pages,
      92             :                                   unsigned int nr_pages,
      93             :                                   blk_opf_t write_flags,
      94             :                                   bool writeback);
      95             : void btrfs_submit_compressed_read(struct btrfs_bio *bbio);
      96             : 
      97             : unsigned int btrfs_compress_str2level(unsigned int type, const char *str);
      98             : 
      99             : enum btrfs_compression_type {
     100             :         BTRFS_COMPRESS_NONE  = 0,
     101             :         BTRFS_COMPRESS_ZLIB  = 1,
     102             :         BTRFS_COMPRESS_LZO   = 2,
     103             :         BTRFS_COMPRESS_ZSTD  = 3,
     104             :         BTRFS_NR_COMPRESS_TYPES = 4,
     105             : };
     106             : 
     107             : struct workspace_manager {
     108             :         struct list_head idle_ws;
     109             :         spinlock_t ws_lock;
     110             :         /* Number of free workspaces */
     111             :         int free_ws;
     112             :         /* Total number of allocated workspaces */
     113             :         atomic_t total_ws;
     114             :         /* Waiters for a free workspace */
     115             :         wait_queue_head_t ws_wait;
     116             : };
     117             : 
     118             : struct list_head *btrfs_get_workspace(int type, unsigned int level);
     119             : void btrfs_put_workspace(int type, struct list_head *ws);
     120             : 
     121             : struct btrfs_compress_op {
     122             :         struct workspace_manager *workspace_manager;
     123             :         /* Maximum level supported by the compression algorithm */
     124             :         unsigned int max_level;
     125             :         unsigned int default_level;
     126             : };
     127             : 
     128             : /* The heuristic workspaces are managed via the 0th workspace manager */
     129             : #define BTRFS_NR_WORKSPACE_MANAGERS     BTRFS_NR_COMPRESS_TYPES
     130             : 
     131             : extern const struct btrfs_compress_op btrfs_heuristic_compress;
     132             : extern const struct btrfs_compress_op btrfs_zlib_compress;
     133             : extern const struct btrfs_compress_op btrfs_lzo_compress;
     134             : extern const struct btrfs_compress_op btrfs_zstd_compress;
     135             : 
     136             : const char* btrfs_compress_type2str(enum btrfs_compression_type type);
     137             : bool btrfs_compress_is_valid_type(const char *str, size_t len);
     138             : 
     139             : int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end);
     140             : 
     141             : int zlib_compress_pages(struct list_head *ws, struct address_space *mapping,
     142             :                 u64 start, struct page **pages, unsigned long *out_pages,
     143             :                 unsigned long *total_in, unsigned long *total_out);
     144             : int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb);
     145             : int zlib_decompress(struct list_head *ws, const u8 *data_in,
     146             :                 struct page *dest_page, unsigned long start_byte, size_t srclen,
     147             :                 size_t destlen);
     148             : struct list_head *zlib_alloc_workspace(unsigned int level);
     149             : void zlib_free_workspace(struct list_head *ws);
     150             : struct list_head *zlib_get_workspace(unsigned int level);
     151             : 
     152             : int lzo_compress_pages(struct list_head *ws, struct address_space *mapping,
     153             :                 u64 start, struct page **pages, unsigned long *out_pages,
     154             :                 unsigned long *total_in, unsigned long *total_out);
     155             : int lzo_decompress_bio(struct list_head *ws, struct compressed_bio *cb);
     156             : int lzo_decompress(struct list_head *ws, const u8 *data_in,
     157             :                 struct page *dest_page, unsigned long start_byte, size_t srclen,
     158             :                 size_t destlen);
     159             : struct list_head *lzo_alloc_workspace(unsigned int level);
     160             : void lzo_free_workspace(struct list_head *ws);
     161             : 
     162             : int zstd_compress_pages(struct list_head *ws, struct address_space *mapping,
     163             :                 u64 start, struct page **pages, unsigned long *out_pages,
     164             :                 unsigned long *total_in, unsigned long *total_out);
     165             : int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb);
     166             : int zstd_decompress(struct list_head *ws, const u8 *data_in,
     167             :                 struct page *dest_page, unsigned long start_byte, size_t srclen,
     168             :                 size_t destlen);
     169             : void zstd_init_workspace_manager(void);
     170             : void zstd_cleanup_workspace_manager(void);
     171             : struct list_head *zstd_alloc_workspace(unsigned int level);
     172             : void zstd_free_workspace(struct list_head *ws);
     173             : struct list_head *zstd_get_workspace(unsigned int level);
     174             : void zstd_put_workspace(struct list_head *ws);
     175             : 
     176             : #endif

Generated by: LCOV version 1.14