fs/f2fs/compress.c
Source file repositories/reference/linux-study-clean/fs/f2fs/compress.c
File Facts
- System
- Linux kernel
- Corpus path
fs/f2fs/compress.c- Extension
.c- Size
- 50980 bytes
- Lines
- 2112
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/fs.hlinux/f2fs_fs.hlinux/moduleparam.hlinux/writeback.hlinux/backing-dev.hlinux/lzo.hlinux/lz4.hlinux/zstd.hlinux/folio_batch.hf2fs.hnode.hsegment.htrace/events/f2fs.h
Detected Declarations
struct f2fs_compress_opsfunction page_array_freefunction offset_in_clusterfunction cluster_idxfunction start_idx_of_clusterfunction f2fs_is_compressed_pagefunction f2fs_set_compressed_pagefunction f2fs_drop_rpagesfunction f2fs_put_rpagesfunction f2fs_unlock_rpagesfunction f2fs_put_rpages_wbcfunction f2fs_init_compress_ctxfunction f2fs_destroy_compress_ctxfunction f2fs_compress_ctx_add_pagefunction lzo_init_compress_ctxfunction lzo_destroy_compress_ctxfunction lzo_compress_pagesfunction lzo_decompress_pagesfunction lz4_init_compress_ctxfunction lz4_destroy_compress_ctxfunction lz4_compress_pagesfunction lz4_decompress_pagesfunction lz4_is_level_validfunction zstd_init_compress_ctxfunction zstd_destroy_compress_ctxfunction zstd_compress_pagesfunction zstd_init_decompress_ctxfunction zstd_destroy_decompress_ctxfunction zstd_decompress_pagesfunction zstd_is_level_validfunction lzorle_compress_pagesfunction f2fs_is_compress_backend_readyfunction f2fs_is_compress_level_validfunction f2fs_init_compress_mempoolfunction f2fs_destroy_compress_mempoolfunction f2fs_compress_free_pagefunction f2fs_compress_pagesfunction f2fs_decompress_clusterfunction f2fs_end_read_compressed_pagefunction is_page_in_clusterfunction f2fs_cluster_is_emptyfunction f2fs_cluster_is_fullfunction f2fs_cluster_can_merge_pagefunction f2fs_all_cluster_page_readyfunction cluster_has_invalid_datafunction f2fs_sanity_check_clusterfunction __f2fs_get_cluster_blocksfunction __f2fs_cluster_blocks
Annotated Snippet
struct f2fs_compress_ops {
int (*init_compress_ctx)(struct compress_ctx *cc);
void (*destroy_compress_ctx)(struct compress_ctx *cc);
int (*compress_pages)(struct compress_ctx *cc);
int (*init_decompress_ctx)(struct decompress_io_ctx *dic);
void (*destroy_decompress_ctx)(struct decompress_io_ctx *dic);
int (*decompress_pages)(struct decompress_io_ctx *dic);
bool (*is_level_valid)(int level);
};
static unsigned int offset_in_cluster(struct compress_ctx *cc, pgoff_t index)
{
return index & (cc->cluster_size - 1);
}
static pgoff_t cluster_idx(struct compress_ctx *cc, pgoff_t index)
{
return index >> cc->log_cluster_size;
}
static pgoff_t start_idx_of_cluster(struct compress_ctx *cc)
{
return cc->cluster_idx << cc->log_cluster_size;
}
bool f2fs_is_compressed_page(struct folio *folio)
{
if (!folio->private)
return false;
if (folio_test_f2fs_nonpointer(folio))
return false;
f2fs_bug_on(F2FS_F_SB(folio),
*((u32 *)folio->private) != F2FS_COMPRESSED_PAGE_MAGIC);
return true;
}
static void f2fs_set_compressed_page(struct page *page,
struct inode *inode, pgoff_t index, void *data)
{
struct folio *folio = page_folio(page);
folio_attach_private(folio, (void *)data);
/* i_crypto_info and iv index */
folio->index = index;
folio->mapping = inode->i_mapping;
}
static void f2fs_drop_rpages(struct compress_ctx *cc, int len, bool unlock)
{
int i;
for (i = 0; i < len; i++) {
if (!cc->rpages[i])
continue;
if (unlock)
unlock_page(cc->rpages[i]);
else
put_page(cc->rpages[i]);
}
}
static void f2fs_put_rpages(struct compress_ctx *cc)
{
f2fs_drop_rpages(cc, cc->cluster_size, false);
}
static void f2fs_unlock_rpages(struct compress_ctx *cc, int len)
{
f2fs_drop_rpages(cc, len, true);
}
static void f2fs_put_rpages_wbc(struct compress_ctx *cc,
struct writeback_control *wbc, bool redirty, bool unlock)
{
unsigned int i;
for (i = 0; i < cc->cluster_size; i++) {
if (!cc->rpages[i])
continue;
if (redirty)
redirty_page_for_writepage(wbc, cc->rpages[i]);
f2fs_put_page(cc->rpages[i], unlock);
}
}
struct folio *f2fs_compress_control_folio(struct folio *folio)
{
struct compress_io_ctx *ctx = folio->private;
Annotation
- Immediate include surface: `linux/fs.h`, `linux/f2fs_fs.h`, `linux/moduleparam.h`, `linux/writeback.h`, `linux/backing-dev.h`, `linux/lzo.h`, `linux/lz4.h`, `linux/zstd.h`.
- Detected declarations: `struct f2fs_compress_ops`, `function page_array_free`, `function offset_in_cluster`, `function cluster_idx`, `function start_idx_of_cluster`, `function f2fs_is_compressed_page`, `function f2fs_set_compressed_page`, `function f2fs_drop_rpages`, `function f2fs_put_rpages`, `function f2fs_unlock_rpages`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.