Lines Matching defs: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);
208 static int lzo_decompress_pages(struct decompress_io_ctx *dic)
212 ret = lzo1x_decompress_safe(dic->cbuf->cdata, dic->clen,
213 dic->rbuf, &dic->rlen);
216 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id, ret);
220 if (dic->rlen != PAGE_SIZE << dic->log_cluster_size) {
223 F2FS_I_SB(dic->inode)->sb->s_id,
224 dic->rlen,
225 PAGE_SIZE << dic->log_cluster_size);
290 static int lz4_decompress_pages(struct decompress_io_ctx *dic)
294 ret = LZ4_decompress_safe(dic->cbuf->cdata, dic->rbuf,
295 dic->clen, dic->rlen);
298 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id, ret);
302 if (ret != PAGE_SIZE << dic->log_cluster_size) {
305 F2FS_I_SB(dic->inode)->sb->s_id, ret,
306 PAGE_SIZE << dic->log_cluster_size);
418 static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic)
424 MAX_COMPRESS_WINDOW_SIZE(dic->log_cluster_size);
428 workspace = f2fs_kvmalloc(F2FS_I_SB(dic->inode),
436 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id,
442 dic->private = workspace;
443 dic->private2 = stream;
448 static void zstd_destroy_decompress_ctx(struct decompress_io_ctx *dic)
450 kvfree(dic->private);
451 dic->private = NULL;
452 dic->private2 = NULL;
455 static int zstd_decompress_pages(struct decompress_io_ctx *dic)
457 zstd_dstream *stream = dic->private2;
463 inbuf.src = dic->cbuf->cdata;
464 inbuf.size = dic->clen;
467 outbuf.dst = dic->rbuf;
468 outbuf.size = dic->rlen;
473 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id,
478 if (dic->rlen != outbuf.pos) {
481 F2FS_I_SB(dic->inode)->sb->s_id,
482 __func__, dic->rlen,
483 PAGE_SIZE << dic->log_cluster_size);
732 static int f2fs_prepare_decomp_mem(struct decompress_io_ctx *dic,
734 static void f2fs_release_decomp_mem(struct decompress_io_ctx *dic,
737 void f2fs_decompress_cluster(struct decompress_io_ctx *dic, bool in_task)
739 struct f2fs_sb_info *sbi = F2FS_I_SB(dic->inode);
740 struct f2fs_inode_info *fi = F2FS_I(dic->inode);
746 trace_f2fs_decompress_pages_start(dic->inode, dic->cluster_idx,
747 dic->cluster_size, fi->i_compress_algorithm);
749 if (dic->failed) {
754 ret = f2fs_prepare_decomp_mem(dic, false);
760 dic->clen = le32_to_cpu(dic->cbuf->clen);
761 dic->rlen = PAGE_SIZE << dic->log_cluster_size;
763 if (dic->clen > PAGE_SIZE * dic->nr_cpages - COMPRESS_HEADER_SIZE) {
774 ret = cops->decompress_pages(dic);
777 u32 provided = le32_to_cpu(dic->cbuf->chksum);
778 u32 calculated = f2fs_crc32(sbi, dic->cbuf->cdata, dic->clen);
781 if (!is_inode_flag_set(dic->inode, FI_COMPRESS_CORRUPT)) {
782 set_inode_flag(dic->inode, FI_COMPRESS_CORRUPT);
785 KERN_INFO, sbi->sb->s_id, dic->inode->i_ino,
793 f2fs_release_decomp_mem(dic, bypass_callback, false);
796 trace_f2fs_decompress_pages_end(dic->inode, dic->cluster_idx,
797 dic->clen, ret);
798 f2fs_decompress_end_io(dic, ret, in_task);
810 struct decompress_io_ctx *dic =
812 struct f2fs_sb_info *sbi = F2FS_I_SB(dic->inode);
817 WRITE_ONCE(dic->failed, true);
820 dic->inode->i_ino, blkaddr);
822 if (atomic_dec_and_test(&dic->remaining_pages))
823 f2fs_decompress_cluster(dic, in_task);
1562 static int f2fs_prepare_decomp_mem(struct decompress_io_ctx *dic,
1566 f2fs_cops[F2FS_I(dic->inode)->i_compress_algorithm];
1569 if (!allow_memalloc_for_decomp(F2FS_I_SB(dic->inode), pre_alloc))
1572 dic->tpages = page_array_alloc(dic->inode, dic->cluster_size);
1573 if (!dic->tpages)
1576 for (i = 0; i < dic->cluster_size; i++) {
1577 if (dic->rpages[i]) {
1578 dic->tpages[i] = dic->rpages[i];
1582 dic->tpages[i] = f2fs_compress_alloc_page();
1585 dic->rbuf = f2fs_vmap(dic->tpages, dic->cluster_size);
1586 if (!dic->rbuf)
1589 dic->cbuf = f2fs_vmap(dic->cpages, dic->nr_cpages);
1590 if (!dic->cbuf)
1594 return cops->init_decompress_ctx(dic);
1599 static void f2fs_release_decomp_mem(struct decompress_io_ctx *dic,
1603 f2fs_cops[F2FS_I(dic->inode)->i_compress_algorithm];
1605 if (!allow_memalloc_for_decomp(F2FS_I_SB(dic->inode), pre_alloc))
1609 cops->destroy_decompress_ctx(dic);
1611 if (dic->cbuf)
1612 vm_unmap_ram(dic->cbuf, dic->nr_cpages);
1614 if (dic->rbuf)
1615 vm_unmap_ram(dic->rbuf, dic->cluster_size);
1618 static void f2fs_free_dic(struct decompress_io_ctx *dic,
1623 struct decompress_io_ctx *dic;
1628 dic = f2fs_kmem_cache_alloc(dic_entry_slab, GFP_F2FS_ZERO, false, sbi);
1629 if (!dic)
1632 dic->rpages = page_array_alloc(cc->inode, cc->cluster_size);
1633 if (!dic->rpages) {
1634 kmem_cache_free(dic_entry_slab, dic);
1638 dic->magic = F2FS_COMPRESSED_PAGE_MAGIC;
1639 dic->inode = cc->inode;
1640 atomic_set(&dic->remaining_pages, cc->nr_cpages);
1641 dic->cluster_idx = cc->cluster_idx;
1642 dic->cluster_size = cc->cluster_size;
1643 dic->log_cluster_size = cc->log_cluster_size;
1644 dic->nr_cpages = cc->nr_cpages;
1645 refcount_set(&dic->refcnt, 1);
1646 dic->failed = false;
1647 dic->need_verity = f2fs_need_verity(cc->inode, start_idx);
1649 for (i = 0; i < dic->cluster_size; i++)
1650 dic->rpages[i] = cc->rpages[i];
1651 dic->nr_rpages = cc->cluster_size;
1653 dic->cpages = page_array_alloc(dic->inode, dic->nr_cpages);
1654 if (!dic->cpages) {
1659 for (i = 0; i < dic->nr_cpages; i++) {
1664 start_idx + i + 1, dic);
1665 dic->cpages[i] = page;
1668 ret = f2fs_prepare_decomp_mem(dic, true);
1672 return dic;
1675 f2fs_free_dic(dic, true);
1679 static void f2fs_free_dic(struct decompress_io_ctx *dic,
1684 f2fs_release_decomp_mem(dic, bypass_destroy_callback, true);
1686 if (dic->tpages) {
1687 for (i = 0; i < dic->cluster_size; i++) {
1688 if (dic->rpages[i])
1690 if (!dic->tpages[i])
1692 f2fs_compress_free_page(dic->tpages[i]);
1694 page_array_free(dic->inode, dic->tpages, dic->cluster_size);
1697 if (dic->cpages) {
1698 for (i = 0; i < dic->nr_cpages; i++) {
1699 if (!dic->cpages[i])
1701 f2fs_compress_free_page(dic->cpages[i]);
1703 page_array_free(dic->inode, dic->cpages, dic->nr_cpages);
1706 page_array_free(dic->inode, dic->rpages, dic->nr_rpages);
1707 kmem_cache_free(dic_entry_slab, dic);
1712 struct decompress_io_ctx *dic =
1715 f2fs_free_dic(dic, false);
1718 static void f2fs_put_dic(struct decompress_io_ctx *dic, bool in_task)
1720 if (refcount_dec_and_test(&dic->refcnt)) {
1722 f2fs_free_dic(dic, false);
1724 INIT_WORK(&dic->free_work, f2fs_late_free_dic);
1725 queue_work(F2FS_I_SB(dic->inode)->post_read_wq,
1726 &dic->free_work);
1733 struct decompress_io_ctx *dic =
1738 for (i = 0; i < dic->cluster_size; i++) {
1739 struct page *rpage = dic->rpages[i];
1751 f2fs_put_dic(dic, true);
1758 void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed,
1763 if (!failed && dic->need_verity) {
1770 INIT_WORK(&dic->verity_work, f2fs_verify_cluster);
1771 fsverity_enqueue_verify_work(&dic->verity_work);
1776 for (i = 0; i < dic->cluster_size; i++) {
1777 struct page *rpage = dic->rpages[i];
1793 f2fs_put_dic(dic, in_task);
1803 struct decompress_io_ctx *dic =
1806 f2fs_put_dic(dic, in_task);