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 --- |