compress.c (1b67fd086dd7be076f190dfe4b52403d0cf58375) compress.c (0e2b7385cb59e566520cfd0a04b4b53bc9461e98)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * f2fs compress support
4 *
5 * Copyright (c) 2019 Chao Yu <chao@kernel.org>
6 */
7
8#include <linux/fs.h>

--- 368 unchanged lines hidden (view full) ---

377 return 0;
378}
379
380static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic)
381{
382 ZSTD_DStream *stream;
383 void *workspace;
384 unsigned int workspace_size;
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * f2fs compress support
4 *
5 * Copyright (c) 2019 Chao Yu <chao@kernel.org>
6 */
7
8#include <linux/fs.h>

--- 368 unchanged lines hidden (view full) ---

377 return 0;
378}
379
380static int zstd_init_decompress_ctx(struct decompress_io_ctx *dic)
381{
382 ZSTD_DStream *stream;
383 void *workspace;
384 unsigned int workspace_size;
385 unsigned int max_window_size =
386 MAX_COMPRESS_WINDOW_SIZE(dic->log_cluster_size);
385
387
386 workspace_size = ZSTD_DStreamWorkspaceBound(MAX_COMPRESS_WINDOW_SIZE);
388 workspace_size = ZSTD_DStreamWorkspaceBound(max_window_size);
387
388 workspace = f2fs_kvmalloc(F2FS_I_SB(dic->inode),
389 workspace_size, GFP_NOFS);
390 if (!workspace)
391 return -ENOMEM;
392
389
390 workspace = f2fs_kvmalloc(F2FS_I_SB(dic->inode),
391 workspace_size, GFP_NOFS);
392 if (!workspace)
393 return -ENOMEM;
394
393 stream = ZSTD_initDStream(MAX_COMPRESS_WINDOW_SIZE,
394 workspace, workspace_size);
395 stream = ZSTD_initDStream(max_window_size, workspace, workspace_size);
395 if (!stream) {
396 printk_ratelimited("%sF2FS-fs (%s): %s ZSTD_initDStream failed\n",
397 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id,
398 __func__);
399 kvfree(workspace);
400 return -EIO;
401 }
402

--- 269 unchanged lines hidden (view full) ---

672 int ret;
673 int i;
674
675 dec_page_count(sbi, F2FS_RD_DATA);
676
677 if (bio->bi_status || PageError(page))
678 dic->failed = true;
679
396 if (!stream) {
397 printk_ratelimited("%sF2FS-fs (%s): %s ZSTD_initDStream failed\n",
398 KERN_ERR, F2FS_I_SB(dic->inode)->sb->s_id,
399 __func__);
400 kvfree(workspace);
401 return -EIO;
402 }
403

--- 269 unchanged lines hidden (view full) ---

673 int ret;
674 int i;
675
676 dec_page_count(sbi, F2FS_RD_DATA);
677
678 if (bio->bi_status || PageError(page))
679 dic->failed = true;
680
680 if (refcount_dec_not_one(&dic->ref))
681 if (atomic_dec_return(&dic->pending_pages))
681 return;
682
683 trace_f2fs_decompress_pages_start(dic->inode, dic->cluster_idx,
684 dic->cluster_size, fi->i_compress_algorithm);
685
686 /* submit partial compressed pages */
687 if (dic->failed) {
688 ret = -EIO;

--- 52 unchanged lines hidden (view full) ---

741 vunmap(dic->cbuf);
742out_vunmap_rbuf:
743 vunmap(dic->rbuf);
744destroy_decompress_ctx:
745 if (cops->destroy_decompress_ctx)
746 cops->destroy_decompress_ctx(dic);
747out_free_dic:
748 if (verity)
682 return;
683
684 trace_f2fs_decompress_pages_start(dic->inode, dic->cluster_idx,
685 dic->cluster_size, fi->i_compress_algorithm);
686
687 /* submit partial compressed pages */
688 if (dic->failed) {
689 ret = -EIO;

--- 52 unchanged lines hidden (view full) ---

742 vunmap(dic->cbuf);
743out_vunmap_rbuf:
744 vunmap(dic->rbuf);
745destroy_decompress_ctx:
746 if (cops->destroy_decompress_ctx)
747 cops->destroy_decompress_ctx(dic);
748out_free_dic:
749 if (verity)
749 refcount_set(&dic->ref, dic->nr_cpages);
750 atomic_set(&dic->pending_pages, dic->nr_cpages);
750 if (!verity)
751 f2fs_decompress_end_io(dic->rpages, dic->cluster_size,
752 ret, false);
753
754 trace_f2fs_decompress_pages_end(dic->inode, dic->cluster_idx,
755 dic->clen, ret);
756 if (!verity)
757 f2fs_free_dic(dic);

--- 398 unchanged lines hidden (view full) ---

1156 fio.version = ni.version;
1157
1158 cic = f2fs_kzalloc(sbi, sizeof(struct compress_io_ctx), GFP_NOFS);
1159 if (!cic)
1160 goto out_put_dnode;
1161
1162 cic->magic = F2FS_COMPRESSED_PAGE_MAGIC;
1163 cic->inode = inode;
751 if (!verity)
752 f2fs_decompress_end_io(dic->rpages, dic->cluster_size,
753 ret, false);
754
755 trace_f2fs_decompress_pages_end(dic->inode, dic->cluster_idx,
756 dic->clen, ret);
757 if (!verity)
758 f2fs_free_dic(dic);

--- 398 unchanged lines hidden (view full) ---

1157 fio.version = ni.version;
1158
1159 cic = f2fs_kzalloc(sbi, sizeof(struct compress_io_ctx), GFP_NOFS);
1160 if (!cic)
1161 goto out_put_dnode;
1162
1163 cic->magic = F2FS_COMPRESSED_PAGE_MAGIC;
1164 cic->inode = inode;
1164 refcount_set(&cic->ref, cc->nr_cpages);
1165 atomic_set(&cic->pending_pages, cc->nr_cpages);
1165 cic->rpages = f2fs_kzalloc(sbi, sizeof(struct page *) <<
1166 cc->log_cluster_size, GFP_NOFS);
1167 if (!cic->rpages)
1168 goto out_put_cic;
1169
1170 cic->nr_rpages = cc->cluster_size;
1171
1172 for (i = 0; i < cc->nr_cpages; i++) {

--- 118 unchanged lines hidden (view full) ---

1291
1292 if (unlikely(bio->bi_status))
1293 mapping_set_error(cic->inode->i_mapping, -EIO);
1294
1295 f2fs_compress_free_page(page);
1296
1297 dec_page_count(sbi, F2FS_WB_DATA);
1298
1166 cic->rpages = f2fs_kzalloc(sbi, sizeof(struct page *) <<
1167 cc->log_cluster_size, GFP_NOFS);
1168 if (!cic->rpages)
1169 goto out_put_cic;
1170
1171 cic->nr_rpages = cc->cluster_size;
1172
1173 for (i = 0; i < cc->nr_cpages; i++) {

--- 118 unchanged lines hidden (view full) ---

1292
1293 if (unlikely(bio->bi_status))
1294 mapping_set_error(cic->inode->i_mapping, -EIO);
1295
1296 f2fs_compress_free_page(page);
1297
1298 dec_page_count(sbi, F2FS_WB_DATA);
1299
1299 if (refcount_dec_not_one(&cic->ref))
1300 if (atomic_dec_return(&cic->pending_pages))
1300 return;
1301
1302 for (i = 0; i < cic->nr_rpages; i++) {
1303 WARN_ON(!cic->rpages[i]);
1304 clear_cold_data(cic->rpages[i]);
1305 end_page_writeback(cic->rpages[i]);
1306 }
1307

--- 75 unchanged lines hidden (view full) ---

1383 return err;
1384}
1385
1386int f2fs_write_multi_pages(struct compress_ctx *cc,
1387 int *submitted,
1388 struct writeback_control *wbc,
1389 enum iostat_type io_type)
1390{
1301 return;
1302
1303 for (i = 0; i < cic->nr_rpages; i++) {
1304 WARN_ON(!cic->rpages[i]);
1305 clear_cold_data(cic->rpages[i]);
1306 end_page_writeback(cic->rpages[i]);
1307 }
1308

--- 75 unchanged lines hidden (view full) ---

1384 return err;
1385}
1386
1387int f2fs_write_multi_pages(struct compress_ctx *cc,
1388 int *submitted,
1389 struct writeback_control *wbc,
1390 enum iostat_type io_type)
1391{
1391 struct f2fs_inode_info *fi = F2FS_I(cc->inode);
1392 const struct f2fs_compress_ops *cops =
1393 f2fs_cops[fi->i_compress_algorithm];
1394 int err;
1395
1396 *submitted = 0;
1397 if (cluster_may_compress(cc)) {
1398 err = f2fs_compress_pages(cc);
1399 if (err == -EAGAIN) {
1400 goto write;
1401 } else if (err) {
1402 f2fs_put_rpages_wbc(cc, wbc, true, 1);
1403 goto destroy_out;
1404 }
1405
1406 err = f2fs_write_compressed_pages(cc, submitted,
1407 wbc, io_type);
1392 int err;
1393
1394 *submitted = 0;
1395 if (cluster_may_compress(cc)) {
1396 err = f2fs_compress_pages(cc);
1397 if (err == -EAGAIN) {
1398 goto write;
1399 } else if (err) {
1400 f2fs_put_rpages_wbc(cc, wbc, true, 1);
1401 goto destroy_out;
1402 }
1403
1404 err = f2fs_write_compressed_pages(cc, submitted,
1405 wbc, io_type);
1408 cops->destroy_compress_ctx(cc);
1409 kfree(cc->cpages);
1410 cc->cpages = NULL;
1411 if (!err)
1412 return 0;
1413 f2fs_bug_on(F2FS_I_SB(cc->inode), err != -EAGAIN);
1414 }
1415write:
1416 f2fs_bug_on(F2FS_I_SB(cc->inode), *submitted);

--- 20 unchanged lines hidden (view full) ---

1437 cc->log_cluster_size, GFP_NOFS);
1438 if (!dic->rpages) {
1439 kfree(dic);
1440 return ERR_PTR(-ENOMEM);
1441 }
1442
1443 dic->magic = F2FS_COMPRESSED_PAGE_MAGIC;
1444 dic->inode = cc->inode;
1406 kfree(cc->cpages);
1407 cc->cpages = NULL;
1408 if (!err)
1409 return 0;
1410 f2fs_bug_on(F2FS_I_SB(cc->inode), err != -EAGAIN);
1411 }
1412write:
1413 f2fs_bug_on(F2FS_I_SB(cc->inode), *submitted);

--- 20 unchanged lines hidden (view full) ---

1434 cc->log_cluster_size, GFP_NOFS);
1435 if (!dic->rpages) {
1436 kfree(dic);
1437 return ERR_PTR(-ENOMEM);
1438 }
1439
1440 dic->magic = F2FS_COMPRESSED_PAGE_MAGIC;
1441 dic->inode = cc->inode;
1445 refcount_set(&dic->ref, cc->nr_cpages);
1442 atomic_set(&dic->pending_pages, cc->nr_cpages);
1446 dic->cluster_idx = cc->cluster_idx;
1447 dic->cluster_size = cc->cluster_size;
1448 dic->log_cluster_size = cc->log_cluster_size;
1449 dic->nr_cpages = cc->nr_cpages;
1450 dic->failed = false;
1451
1452 for (i = 0; i < dic->cluster_size; i++)
1453 dic->rpages[i] = cc->rpages[i];

--- 79 unchanged lines hidden ---
1443 dic->cluster_idx = cc->cluster_idx;
1444 dic->cluster_size = cc->cluster_size;
1445 dic->log_cluster_size = cc->log_cluster_size;
1446 dic->nr_cpages = cc->nr_cpages;
1447 dic->failed = false;
1448
1449 for (i = 0; i < dic->cluster_size; i++)
1450 dic->rpages[i] = cc->rpages[i];

--- 79 unchanged lines hidden ---