/* * We want to make sure that amount of RAM required to uncompress an extent is * reasonable, so we limit the total size in ram of a compressed extent to * 128k. This is a crucial number because it also controls how easily we can * spread reads across cpus for decompression. * * We also want to make sure the amount of IO required to do a random read is * reasonably small, so we limit the size of a compressed extent to 128k.
*/
/* Maximum length of compressed data stored on disk */ #define BTRFS_MAX_COMPRESSED (SZ_128K) #define BTRFS_MAX_COMPRESSED_PAGES (BTRFS_MAX_COMPRESSED / PAGE_SIZE)
static_assert((BTRFS_MAX_COMPRESSED % PAGE_SIZE) == 0);
/* Maximum size of data before compression */ #define BTRFS_MAX_UNCOMPRESSED (SZ_128K)
#define BTRFS_ZLIB_DEFAULT_LEVEL 3
struct compressed_bio { /* Number of compressed folios in the array. */ unsignedint nr_folios;
/* The folios with the compressed data on them. */ struct folio **compressed_folios;
/* starting offset in the inode for our pages */
u64 start;
/* Number of bytes in the inode we're working on */ unsignedint len;
/* Number of bytes on disk */ unsignedint compressed_len;
/* The compression algorithm for this bio */
u8 compress_type;
/* Whether this is a write for writeback. */ bool writeback;
union { /* For reads, this is the bio we are copying the data into */ struct btrfs_bio *orig_bbio; struct work_struct write_end_work;
};
/* Must be last. */ struct btrfs_bio bbio;
};
/* @range_end must be exclusive. */ staticinline u32 btrfs_calc_input_length(struct folio *folio, u64 range_end, u64 cur)
{ /* @cur must be inside the folio. */
ASSERT(folio_pos(folio) <= cur);
ASSERT(cur < folio_end(folio)); return min(range_end, folio_end(folio)) - cur;
}
int __init btrfs_init_compress(void); void __cold btrfs_exit_compress(void);
bool btrfs_compress_level_valid(unsignedint type, int level); int btrfs_compress_folios(unsignedint type, int level, struct address_space *mapping,
u64 start, struct folio **folios, unsignedlong *out_folios, unsignedlong *total_in, unsignedlong *total_out); int btrfs_decompress(int type, const u8 *data_in, struct folio *dest_folio, unsignedlong start_byte, size_t srclen, size_t destlen); int btrfs_decompress_buf2page(constchar *buf, u32 buf_len, struct compressed_bio *cb, u32 decompressed);
struct workspace_manager { struct list_head idle_ws;
spinlock_t ws_lock; /* Number of free workspaces */ int free_ws; /* Total number of allocated workspaces */
atomic_t total_ws; /* Waiters for a free workspace */
wait_queue_head_t ws_wait;
};
struct btrfs_compress_op { struct workspace_manager *workspace_manager; /* Maximum level supported by the compression algorithm */ int min_level; int max_level; int default_level;
};
/* The heuristic workspaces are managed via the 0th workspace manager */ #define BTRFS_NR_WORKSPACE_MANAGERS BTRFS_NR_COMPRESS_TYPES
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.