Lines Matching refs:dic
55 int (*init_decompress_ctx)(struct decompress_io_ctx *dic);
56 void (*destroy_decompress_ctx)(struct decompress_io_ctx *dic);
57 int (*decompress_pages)(struct decompress_io_ctx *dic);
206 static int lzo_decompress_pages(struct decompress_io_ctx *dic) in lzo_decompress_pages() argument
210 ret = lzo1x_decompress_safe(dic->cbuf->cdata, dic->clen, in lzo_decompress_pages()
211 dic->rbuf, &dic->rlen); in lzo_decompress_pages()
214 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id, ret); in lzo_decompress_pages()
218 if (dic->rlen != PAGE_SIZE << dic->log_cluster_size) { in lzo_decompress_pages()
221 F2FS_I_SB(dic->inode)->sb->s_id, in lzo_decompress_pages()
222 dic->rlen, in lzo_decompress_pages()
223 PAGE_SIZE << dic->log_cluster_size); in lzo_decompress_pages()
303 static int lz4_decompress_pages(struct decompress_io_ctx *dic) in lz4_decompress_pages() argument
307 ret = LZ4_decompress_safe(dic->cbuf->cdata, dic->rbuf, in lz4_decompress_pages()
308 dic->clen, dic->rlen); in lz4_decompress_pages()
311 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id, ret); in lz4_decompress_pages()
315 if (ret != PAGE_SIZE << dic->log_cluster_size) { in lz4_decompress_pages()
318 F2FS_I_SB(dic->inode)->sb->s_id, in lz4_decompress_pages()
319 dic->rlen, in lz4_decompress_pages()
320 PAGE_SIZE << dic->log_cluster_size); in lz4_decompress_pages()
424 static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic) in zstd_init_decompress_ctx() argument
430 MAX_COMPRESS_WINDOW_SIZE(dic->log_cluster_size); in zstd_init_decompress_ctx()
434 workspace = f2fs_kvmalloc(F2FS_I_SB(dic->inode), in zstd_init_decompress_ctx()
442 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id, in zstd_init_decompress_ctx()
448 dic->private = workspace; in zstd_init_decompress_ctx()
449 dic->private2 = stream; in zstd_init_decompress_ctx()
454 static void zstd_destroy_decompress_ctx(struct decompress_io_ctx *dic) in zstd_destroy_decompress_ctx() argument
456 kvfree(dic->private); in zstd_destroy_decompress_ctx()
457 dic->private = NULL; in zstd_destroy_decompress_ctx()
458 dic->private2 = NULL; in zstd_destroy_decompress_ctx()
461 static int zstd_decompress_pages(struct decompress_io_ctx *dic) in zstd_decompress_pages() argument
463 zstd_dstream *stream = dic->private2; in zstd_decompress_pages()
469 inbuf.src = dic->cbuf->cdata; in zstd_decompress_pages()
470 inbuf.size = dic->clen; in zstd_decompress_pages()
473 outbuf.dst = dic->rbuf; in zstd_decompress_pages()
474 outbuf.size = dic->rlen; in zstd_decompress_pages()
479 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id, in zstd_decompress_pages()
484 if (dic->rlen != outbuf.pos) { in zstd_decompress_pages()
487 F2FS_I_SB(dic->inode)->sb->s_id, in zstd_decompress_pages()
488 __func__, dic->rlen, in zstd_decompress_pages()
489 PAGE_SIZE << dic->log_cluster_size); in zstd_decompress_pages()
743 void f2fs_decompress_cluster(struct decompress_io_ctx *dic) in f2fs_decompress_cluster() argument
745 struct f2fs_sb_info *sbi = F2FS_I_SB(dic->inode); in f2fs_decompress_cluster()
746 struct f2fs_inode_info *fi = F2FS_I(dic->inode); in f2fs_decompress_cluster()
752 trace_f2fs_decompress_pages_start(dic->inode, dic->cluster_idx, in f2fs_decompress_cluster()
753 dic->cluster_size, fi->i_compress_algorithm); in f2fs_decompress_cluster()
755 if (dic->failed) { in f2fs_decompress_cluster()
760 dic->tpages = page_array_alloc(dic->inode, dic->cluster_size); in f2fs_decompress_cluster()
761 if (!dic->tpages) { in f2fs_decompress_cluster()
766 for (i = 0; i < dic->cluster_size; i++) { in f2fs_decompress_cluster()
767 if (dic->rpages[i]) { in f2fs_decompress_cluster()
768 dic->tpages[i] = dic->rpages[i]; in f2fs_decompress_cluster()
772 dic->tpages[i] = f2fs_compress_alloc_page(); in f2fs_decompress_cluster()
773 if (!dic->tpages[i]) { in f2fs_decompress_cluster()
780 ret = cops->init_decompress_ctx(dic); in f2fs_decompress_cluster()
785 dic->rbuf = f2fs_vmap(dic->tpages, dic->cluster_size); in f2fs_decompress_cluster()
786 if (!dic->rbuf) { in f2fs_decompress_cluster()
791 dic->cbuf = f2fs_vmap(dic->cpages, dic->nr_cpages); in f2fs_decompress_cluster()
792 if (!dic->cbuf) { in f2fs_decompress_cluster()
797 dic->clen = le32_to_cpu(dic->cbuf->clen); in f2fs_decompress_cluster()
798 dic->rlen = PAGE_SIZE << dic->log_cluster_size; in f2fs_decompress_cluster()
800 if (dic->clen > PAGE_SIZE * dic->nr_cpages - COMPRESS_HEADER_SIZE) { in f2fs_decompress_cluster()
805 ret = cops->decompress_pages(dic); in f2fs_decompress_cluster()
808 u32 provided = le32_to_cpu(dic->cbuf->chksum); in f2fs_decompress_cluster()
809 u32 calculated = f2fs_crc32(sbi, dic->cbuf->cdata, dic->clen); in f2fs_decompress_cluster()
812 if (!is_inode_flag_set(dic->inode, FI_COMPRESS_CORRUPT)) { in f2fs_decompress_cluster()
813 set_inode_flag(dic->inode, FI_COMPRESS_CORRUPT); in f2fs_decompress_cluster()
816 KERN_INFO, sbi->sb->s_id, dic->inode->i_ino, in f2fs_decompress_cluster()
824 vm_unmap_ram(dic->cbuf, dic->nr_cpages); in f2fs_decompress_cluster()
826 vm_unmap_ram(dic->rbuf, dic->cluster_size); in f2fs_decompress_cluster()
829 cops->destroy_decompress_ctx(dic); in f2fs_decompress_cluster()
831 trace_f2fs_decompress_pages_end(dic->inode, dic->cluster_idx, in f2fs_decompress_cluster()
832 dic->clen, ret); in f2fs_decompress_cluster()
833 f2fs_decompress_end_io(dic, ret); in f2fs_decompress_cluster()
845 struct decompress_io_ctx *dic = in f2fs_end_read_compressed_page() local
847 struct f2fs_sb_info *sbi = F2FS_I_SB(dic->inode); in f2fs_end_read_compressed_page()
852 WRITE_ONCE(dic->failed, true); in f2fs_end_read_compressed_page()
855 dic->inode->i_ino, blkaddr); in f2fs_end_read_compressed_page()
857 if (atomic_dec_and_test(&dic->remaining_pages)) in f2fs_end_read_compressed_page()
858 f2fs_decompress_cluster(dic); in f2fs_end_read_compressed_page()
1576 static void f2fs_free_dic(struct decompress_io_ctx *dic);
1580 struct decompress_io_ctx *dic; in f2fs_alloc_dic() local
1584 dic = f2fs_kmem_cache_alloc(dic_entry_slab, GFP_F2FS_ZERO, in f2fs_alloc_dic()
1586 if (!dic) in f2fs_alloc_dic()
1589 dic->rpages = page_array_alloc(cc->inode, cc->cluster_size); in f2fs_alloc_dic()
1590 if (!dic->rpages) { in f2fs_alloc_dic()
1591 kmem_cache_free(dic_entry_slab, dic); in f2fs_alloc_dic()
1595 dic->magic = F2FS_COMPRESSED_PAGE_MAGIC; in f2fs_alloc_dic()
1596 dic->inode = cc->inode; in f2fs_alloc_dic()
1597 atomic_set(&dic->remaining_pages, cc->nr_cpages); in f2fs_alloc_dic()
1598 dic->cluster_idx = cc->cluster_idx; in f2fs_alloc_dic()
1599 dic->cluster_size = cc->cluster_size; in f2fs_alloc_dic()
1600 dic->log_cluster_size = cc->log_cluster_size; in f2fs_alloc_dic()
1601 dic->nr_cpages = cc->nr_cpages; in f2fs_alloc_dic()
1602 refcount_set(&dic->refcnt, 1); in f2fs_alloc_dic()
1603 dic->failed = false; in f2fs_alloc_dic()
1604 dic->need_verity = f2fs_need_verity(cc->inode, start_idx); in f2fs_alloc_dic()
1606 for (i = 0; i < dic->cluster_size; i++) in f2fs_alloc_dic()
1607 dic->rpages[i] = cc->rpages[i]; in f2fs_alloc_dic()
1608 dic->nr_rpages = cc->cluster_size; in f2fs_alloc_dic()
1610 dic->cpages = page_array_alloc(dic->inode, dic->nr_cpages); in f2fs_alloc_dic()
1611 if (!dic->cpages) in f2fs_alloc_dic()
1614 for (i = 0; i < dic->nr_cpages; i++) { in f2fs_alloc_dic()
1622 start_idx + i + 1, dic); in f2fs_alloc_dic()
1623 dic->cpages[i] = page; in f2fs_alloc_dic()
1626 return dic; in f2fs_alloc_dic()
1629 f2fs_free_dic(dic); in f2fs_alloc_dic()
1633 static void f2fs_free_dic(struct decompress_io_ctx *dic) in f2fs_free_dic() argument
1637 if (dic->tpages) { in f2fs_free_dic()
1638 for (i = 0; i < dic->cluster_size; i++) { in f2fs_free_dic()
1639 if (dic->rpages[i]) in f2fs_free_dic()
1641 if (!dic->tpages[i]) in f2fs_free_dic()
1643 f2fs_compress_free_page(dic->tpages[i]); in f2fs_free_dic()
1645 page_array_free(dic->inode, dic->tpages, dic->cluster_size); in f2fs_free_dic()
1648 if (dic->cpages) { in f2fs_free_dic()
1649 for (i = 0; i < dic->nr_cpages; i++) { in f2fs_free_dic()
1650 if (!dic->cpages[i]) in f2fs_free_dic()
1652 f2fs_compress_free_page(dic->cpages[i]); in f2fs_free_dic()
1654 page_array_free(dic->inode, dic->cpages, dic->nr_cpages); in f2fs_free_dic()
1657 page_array_free(dic->inode, dic->rpages, dic->nr_rpages); in f2fs_free_dic()
1658 kmem_cache_free(dic_entry_slab, dic); in f2fs_free_dic()
1661 static void f2fs_put_dic(struct decompress_io_ctx *dic) in f2fs_put_dic() argument
1663 if (refcount_dec_and_test(&dic->refcnt)) in f2fs_put_dic()
1664 f2fs_free_dic(dic); in f2fs_put_dic()
1671 static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) in __f2fs_decompress_end_io() argument
1675 for (i = 0; i < dic->cluster_size; i++) { in __f2fs_decompress_end_io()
1676 struct page *rpage = dic->rpages[i]; in __f2fs_decompress_end_io()
1692 f2fs_put_dic(dic); in __f2fs_decompress_end_io()
1697 struct decompress_io_ctx *dic = in f2fs_verify_cluster() local
1702 for (i = 0; i < dic->cluster_size; i++) { in f2fs_verify_cluster()
1703 struct page *rpage = dic->rpages[i]; in f2fs_verify_cluster()
1709 __f2fs_decompress_end_io(dic, false); in f2fs_verify_cluster()
1716 void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) in f2fs_decompress_end_io() argument
1718 if (!failed && dic->need_verity) { in f2fs_decompress_end_io()
1725 INIT_WORK(&dic->verity_work, f2fs_verify_cluster); in f2fs_decompress_end_io()
1726 fsverity_enqueue_verify_work(&dic->verity_work); in f2fs_decompress_end_io()
1728 __f2fs_decompress_end_io(dic, failed); in f2fs_decompress_end_io()
1739 struct decompress_io_ctx *dic = in f2fs_put_page_dic() local
1742 f2fs_put_dic(dic); in f2fs_put_page_dic()