data.c (9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e) | data.c (b62e71be2110d8b52bf5faf3c3ed7ca1a0c113a5) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/data.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 79 unchanged lines hidden (view full) --- 88 return F2FS_RD_NODE; 89 } 90 return F2FS_RD_DATA; 91} 92 93/* postprocessing steps for read bios */ 94enum bio_post_read_step { 95#ifdef CONFIG_FS_ENCRYPTION | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/data.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 79 unchanged lines hidden (view full) --- 88 return F2FS_RD_NODE; 89 } 90 return F2FS_RD_DATA; 91} 92 93/* postprocessing steps for read bios */ 94enum bio_post_read_step { 95#ifdef CONFIG_FS_ENCRYPTION |
96 STEP_DECRYPT = 1 << 0, | 96 STEP_DECRYPT = BIT(0), |
97#else 98 STEP_DECRYPT = 0, /* compile out the decryption-related code */ 99#endif 100#ifdef CONFIG_F2FS_FS_COMPRESSION | 97#else 98 STEP_DECRYPT = 0, /* compile out the decryption-related code */ 99#endif 100#ifdef CONFIG_F2FS_FS_COMPRESSION |
101 STEP_DECOMPRESS = 1 << 1, | 101 STEP_DECOMPRESS = BIT(1), |
102#else 103 STEP_DECOMPRESS = 0, /* compile out the decompression-related code */ 104#endif 105#ifdef CONFIG_FS_VERITY | 102#else 103 STEP_DECOMPRESS = 0, /* compile out the decompression-related code */ 104#endif 105#ifdef CONFIG_FS_VERITY |
106 STEP_VERITY = 1 << 2, | 106 STEP_VERITY = BIT(2), |
107#else 108 STEP_VERITY = 0, /* compile out the verity-related code */ 109#endif 110}; 111 112struct bio_post_read_ctx { 113 struct bio *bio; 114 struct f2fs_sb_info *sbi; --- 300 unchanged lines hidden (view full) --- 415 for (i = 0; i < sbi->s_ndevs; i++) 416 if (FDEV(i).start_blk <= blkaddr && FDEV(i).end_blk >= blkaddr) 417 return i; 418 return 0; 419} 420 421static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) 422{ | 107#else 108 STEP_VERITY = 0, /* compile out the verity-related code */ 109#endif 110}; 111 112struct bio_post_read_ctx { 113 struct bio *bio; 114 struct f2fs_sb_info *sbi; --- 300 unchanged lines hidden (view full) --- 415 for (i = 0; i < sbi->s_ndevs; i++) 416 if (FDEV(i).start_blk <= blkaddr && FDEV(i).end_blk >= blkaddr) 417 return i; 418 return 0; 419} 420 421static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) 422{ |
423 unsigned int temp_mask = (1 << NR_TEMP_TYPE) - 1; | 423 unsigned int temp_mask = GENMASK(NR_TEMP_TYPE - 1, 0); |
424 unsigned int fua_flag, meta_flag, io_flag; 425 blk_opf_t op_flags = 0; 426 427 if (fio->op != REQ_OP_WRITE) 428 return 0; 429 if (fio->type == DATA) 430 io_flag = fio->sbi->data_io_flag; 431 else if (fio->type == NODE) --- 5 unchanged lines hidden (view full) --- 437 meta_flag = (io_flag >> NR_TEMP_TYPE) & temp_mask; 438 439 /* 440 * data/node io flag bits per temp: 441 * REQ_META | REQ_FUA | 442 * 5 | 4 | 3 | 2 | 1 | 0 | 443 * Cold | Warm | Hot | Cold | Warm | Hot | 444 */ | 424 unsigned int fua_flag, meta_flag, io_flag; 425 blk_opf_t op_flags = 0; 426 427 if (fio->op != REQ_OP_WRITE) 428 return 0; 429 if (fio->type == DATA) 430 io_flag = fio->sbi->data_io_flag; 431 else if (fio->type == NODE) --- 5 unchanged lines hidden (view full) --- 437 meta_flag = (io_flag >> NR_TEMP_TYPE) & temp_mask; 438 439 /* 440 * data/node io flag bits per temp: 441 * REQ_META | REQ_FUA | 442 * 5 | 4 | 3 | 2 | 1 | 0 | 443 * Cold | Warm | Hot | Cold | Warm | Hot | 444 */ |
445 if ((1 << fio->temp) & meta_flag) | 445 if (BIT(fio->temp) & meta_flag) |
446 op_flags |= REQ_META; | 446 op_flags |= REQ_META; |
447 if ((1 << fio->temp) & fua_flag) | 447 if (BIT(fio->temp) & fua_flag) |
448 op_flags |= REQ_FUA; 449 return op_flags; 450} 451 452static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages) 453{ 454 struct f2fs_sb_info *sbi = fio->sbi; 455 struct block_device *bdev; --- 413 unchanged lines hidden (view full) --- 869 870void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi, 871 struct bio **bio, struct page *page) 872{ 873 enum temp_type temp; 874 bool found = false; 875 struct bio *target = bio ? *bio : NULL; 876 | 448 op_flags |= REQ_FUA; 449 return op_flags; 450} 451 452static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages) 453{ 454 struct f2fs_sb_info *sbi = fio->sbi; 455 struct block_device *bdev; --- 413 unchanged lines hidden (view full) --- 869 870void f2fs_submit_merged_ipu_write(struct f2fs_sb_info *sbi, 871 struct bio **bio, struct page *page) 872{ 873 enum temp_type temp; 874 bool found = false; 875 struct bio *target = bio ? *bio : NULL; 876 |
877 f2fs_bug_on(sbi, !target && !page); 878 |
|
877 for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) { 878 struct f2fs_bio_info *io = sbi->write_io[DATA] + temp; 879 struct list_head *head = &io->bio_list; 880 struct bio_entry *be; 881 882 if (list_empty(head)) 883 continue; 884 --- 1345 unchanged lines hidden (view full) --- 2230 if (!from_dnode) 2231 goto skip_reading_dnode; 2232 2233 set_new_dnode(&dn, inode, NULL, NULL, 0); 2234 ret = f2fs_get_dnode_of_data(&dn, start_idx, LOOKUP_NODE); 2235 if (ret) 2236 goto out; 2237 | 879 for (temp = HOT; temp < NR_TEMP_TYPE && !found; temp++) { 880 struct f2fs_bio_info *io = sbi->write_io[DATA] + temp; 881 struct list_head *head = &io->bio_list; 882 struct bio_entry *be; 883 884 if (list_empty(head)) 885 continue; 886 --- 1345 unchanged lines hidden (view full) --- 2232 if (!from_dnode) 2233 goto skip_reading_dnode; 2234 2235 set_new_dnode(&dn, inode, NULL, NULL, 0); 2236 ret = f2fs_get_dnode_of_data(&dn, start_idx, LOOKUP_NODE); 2237 if (ret) 2238 goto out; 2239 |
2240 if (unlikely(f2fs_cp_error(sbi))) { 2241 ret = -EIO; 2242 goto out_put_dnode; 2243 } |
|
2238 f2fs_bug_on(sbi, dn.data_blkaddr != COMPRESS_ADDR); 2239 2240skip_reading_dnode: 2241 for (i = 1; i < cc->cluster_size; i++) { 2242 block_t blkaddr; 2243 2244 blkaddr = from_dnode ? data_blkaddr(dn.inode, dn.node_page, 2245 dn.ofs_in_node + i) : --- 547 unchanged lines hidden (view full) --- 2793 2794 /* we should bypass data pages to proceed the kworker jobs */ 2795 if (unlikely(f2fs_cp_error(sbi))) { 2796 mapping_set_error(page->mapping, -EIO); 2797 /* 2798 * don't drop any dirty dentry pages for keeping lastest 2799 * directory structure. 2800 */ | 2244 f2fs_bug_on(sbi, dn.data_blkaddr != COMPRESS_ADDR); 2245 2246skip_reading_dnode: 2247 for (i = 1; i < cc->cluster_size; i++) { 2248 block_t blkaddr; 2249 2250 blkaddr = from_dnode ? data_blkaddr(dn.inode, dn.node_page, 2251 dn.ofs_in_node + i) : --- 547 unchanged lines hidden (view full) --- 2799 2800 /* we should bypass data pages to proceed the kworker jobs */ 2801 if (unlikely(f2fs_cp_error(sbi))) { 2802 mapping_set_error(page->mapping, -EIO); 2803 /* 2804 * don't drop any dirty dentry pages for keeping lastest 2805 * directory structure. 2806 */ |
2801 if (S_ISDIR(inode->i_mode)) | 2807 if (S_ISDIR(inode->i_mode) && 2808 !is_sbi_flag_set(sbi, SBI_IS_CLOSE)) |
2802 goto redirty_out; | 2809 goto redirty_out; |
2810 2811 /* keep data pages in remount-ro mode */ 2812 if (F2FS_OPTION(sbi).errors == MOUNT_ERRORS_READONLY) 2813 goto redirty_out; |
|
2803 goto out; 2804 } 2805 2806 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) 2807 goto redirty_out; 2808 2809 if (page->index < end_index || 2810 f2fs_verity_in_progress(inode) || --- 82 unchanged lines hidden (view full) --- 2893 } 2894 unlock_page(page); 2895 if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) && 2896 !F2FS_I(inode)->wb_task && allow_balance) 2897 f2fs_balance_fs(sbi, need_balance_fs); 2898 2899 if (unlikely(f2fs_cp_error(sbi))) { 2900 f2fs_submit_merged_write(sbi, DATA); | 2814 goto out; 2815 } 2816 2817 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) 2818 goto redirty_out; 2819 2820 if (page->index < end_index || 2821 f2fs_verity_in_progress(inode) || --- 82 unchanged lines hidden (view full) --- 2904 } 2905 unlock_page(page); 2906 if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) && 2907 !F2FS_I(inode)->wb_task && allow_balance) 2908 f2fs_balance_fs(sbi, need_balance_fs); 2909 2910 if (unlikely(f2fs_cp_error(sbi))) { 2911 f2fs_submit_merged_write(sbi, DATA); |
2901 f2fs_submit_merged_ipu_write(sbi, bio, NULL); | 2912 if (bio && *bio) 2913 f2fs_submit_merged_ipu_write(sbi, bio, NULL); |
2902 submitted = NULL; 2903 } 2904 2905 if (submitted) 2906 *submitted = fio.submitted; 2907 2908 return 0; 2909 --- 208 unchanged lines hidden (view full) --- 3118 } 3119 3120 if (!folio_test_dirty(folio)) { 3121 /* someone wrote it for us */ 3122 goto continue_unlock; 3123 } 3124 3125 if (folio_test_writeback(folio)) { | 2914 submitted = NULL; 2915 } 2916 2917 if (submitted) 2918 *submitted = fio.submitted; 2919 2920 return 0; 2921 --- 208 unchanged lines hidden (view full) --- 3130 } 3131 3132 if (!folio_test_dirty(folio)) { 3133 /* someone wrote it for us */ 3134 goto continue_unlock; 3135 } 3136 3137 if (folio_test_writeback(folio)) { |
3126 if (wbc->sync_mode != WB_SYNC_NONE) 3127 f2fs_wait_on_page_writeback( 3128 &folio->page, 3129 DATA, true, true); 3130 else | 3138 if (wbc->sync_mode == WB_SYNC_NONE) |
3131 goto continue_unlock; | 3139 goto continue_unlock; |
3140 f2fs_wait_on_page_writeback(&folio->page, DATA, true, true); |
|
3132 } 3133 3134 if (!folio_clear_dirty_for_io(folio)) 3135 goto continue_unlock; 3136 3137#ifdef CONFIG_F2FS_FS_COMPRESSION 3138 if (f2fs_compressed_file(inode)) { 3139 folio_get(folio); --- 341 unchanged lines hidden (view full) --- 3481 3482unlock_out: 3483 f2fs_map_unlock(sbi, F2FS_GET_BLOCK_PRE_AIO); 3484 return err; 3485} 3486 3487static int prepare_atomic_write_begin(struct f2fs_sb_info *sbi, 3488 struct page *page, loff_t pos, unsigned int len, | 3141 } 3142 3143 if (!folio_clear_dirty_for_io(folio)) 3144 goto continue_unlock; 3145 3146#ifdef CONFIG_F2FS_FS_COMPRESSION 3147 if (f2fs_compressed_file(inode)) { 3148 folio_get(folio); --- 341 unchanged lines hidden (view full) --- 3490 3491unlock_out: 3492 f2fs_map_unlock(sbi, F2FS_GET_BLOCK_PRE_AIO); 3493 return err; 3494} 3495 3496static int prepare_atomic_write_begin(struct f2fs_sb_info *sbi, 3497 struct page *page, loff_t pos, unsigned int len, |
3489 block_t *blk_addr, bool *node_changed) | 3498 block_t *blk_addr, bool *node_changed, bool *use_cow) |
3490{ 3491 struct inode *inode = page->mapping->host; 3492 struct inode *cow_inode = F2FS_I(inode)->cow_inode; 3493 pgoff_t index = page->index; 3494 int err = 0; 3495 block_t ori_blk_addr = NULL_ADDR; 3496 3497 /* If pos is beyond the end of file, reserve a new block in COW inode */ 3498 if ((pos & PAGE_MASK) >= i_size_read(inode)) 3499 goto reserve_block; 3500 3501 /* Look for the block in COW inode first */ 3502 err = __find_data_block(cow_inode, index, blk_addr); | 3499{ 3500 struct inode *inode = page->mapping->host; 3501 struct inode *cow_inode = F2FS_I(inode)->cow_inode; 3502 pgoff_t index = page->index; 3503 int err = 0; 3504 block_t ori_blk_addr = NULL_ADDR; 3505 3506 /* If pos is beyond the end of file, reserve a new block in COW inode */ 3507 if ((pos & PAGE_MASK) >= i_size_read(inode)) 3508 goto reserve_block; 3509 3510 /* Look for the block in COW inode first */ 3511 err = __find_data_block(cow_inode, index, blk_addr); |
3503 if (err) | 3512 if (err) { |
3504 return err; | 3513 return err; |
3505 else if (*blk_addr != NULL_ADDR) | 3514 } else if (*blk_addr != NULL_ADDR) { 3515 *use_cow = true; |
3506 return 0; | 3516 return 0; |
3517 } |
|
3507 3508 if (is_inode_flag_set(inode, FI_ATOMIC_REPLACE)) 3509 goto reserve_block; 3510 3511 /* Look for the block in the original inode */ 3512 err = __find_data_block(inode, index, &ori_blk_addr); 3513 if (err) 3514 return err; --- 13 unchanged lines hidden (view full) --- 3528static int f2fs_write_begin(struct file *file, struct address_space *mapping, 3529 loff_t pos, unsigned len, struct page **pagep, void **fsdata) 3530{ 3531 struct inode *inode = mapping->host; 3532 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 3533 struct page *page = NULL; 3534 pgoff_t index = ((unsigned long long) pos) >> PAGE_SHIFT; 3535 bool need_balance = false; | 3518 3519 if (is_inode_flag_set(inode, FI_ATOMIC_REPLACE)) 3520 goto reserve_block; 3521 3522 /* Look for the block in the original inode */ 3523 err = __find_data_block(inode, index, &ori_blk_addr); 3524 if (err) 3525 return err; --- 13 unchanged lines hidden (view full) --- 3539static int f2fs_write_begin(struct file *file, struct address_space *mapping, 3540 loff_t pos, unsigned len, struct page **pagep, void **fsdata) 3541{ 3542 struct inode *inode = mapping->host; 3543 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 3544 struct page *page = NULL; 3545 pgoff_t index = ((unsigned long long) pos) >> PAGE_SHIFT; 3546 bool need_balance = false; |
3547 bool use_cow = false; |
|
3536 block_t blkaddr = NULL_ADDR; 3537 int err = 0; 3538 3539 trace_f2fs_write_begin(inode, pos, len); 3540 3541 if (!f2fs_is_checkpoint_ready(sbi)) { 3542 err = -ENOSPC; 3543 goto fail; --- 43 unchanged lines hidden (view full) --- 3587 } 3588 3589 /* TODO: cluster can be compressed due to race with .writepage */ 3590 3591 *pagep = page; 3592 3593 if (f2fs_is_atomic_file(inode)) 3594 err = prepare_atomic_write_begin(sbi, page, pos, len, | 3548 block_t blkaddr = NULL_ADDR; 3549 int err = 0; 3550 3551 trace_f2fs_write_begin(inode, pos, len); 3552 3553 if (!f2fs_is_checkpoint_ready(sbi)) { 3554 err = -ENOSPC; 3555 goto fail; --- 43 unchanged lines hidden (view full) --- 3599 } 3600 3601 /* TODO: cluster can be compressed due to race with .writepage */ 3602 3603 *pagep = page; 3604 3605 if (f2fs_is_atomic_file(inode)) 3606 err = prepare_atomic_write_begin(sbi, page, pos, len, |
3595 &blkaddr, &need_balance); | 3607 &blkaddr, &need_balance, &use_cow); |
3596 else 3597 err = prepare_write_begin(sbi, page, pos, len, 3598 &blkaddr, &need_balance); 3599 if (err) 3600 goto fail; 3601 3602 if (need_balance && !IS_NOQUOTA(inode) && 3603 has_not_enough_free_secs(sbi, 0, 0)) { --- 23 unchanged lines hidden (view full) --- 3627 SetPageUptodate(page); 3628 } else { 3629 if (!f2fs_is_valid_blkaddr(sbi, blkaddr, 3630 DATA_GENERIC_ENHANCE_READ)) { 3631 err = -EFSCORRUPTED; 3632 f2fs_handle_error(sbi, ERROR_INVALID_BLKADDR); 3633 goto fail; 3634 } | 3608 else 3609 err = prepare_write_begin(sbi, page, pos, len, 3610 &blkaddr, &need_balance); 3611 if (err) 3612 goto fail; 3613 3614 if (need_balance && !IS_NOQUOTA(inode) && 3615 has_not_enough_free_secs(sbi, 0, 0)) { --- 23 unchanged lines hidden (view full) --- 3639 SetPageUptodate(page); 3640 } else { 3641 if (!f2fs_is_valid_blkaddr(sbi, blkaddr, 3642 DATA_GENERIC_ENHANCE_READ)) { 3643 err = -EFSCORRUPTED; 3644 f2fs_handle_error(sbi, ERROR_INVALID_BLKADDR); 3645 goto fail; 3646 } |
3635 err = f2fs_submit_page_read(inode, page, blkaddr, 0, true); | 3647 err = f2fs_submit_page_read(use_cow ? 3648 F2FS_I(inode)->cow_inode : inode, page, 3649 blkaddr, 0, true); |
3636 if (err) 3637 goto fail; 3638 3639 lock_page(page); 3640 if (unlikely(page->mapping != mapping)) { 3641 f2fs_put_page(page, 1); 3642 goto repeat; 3643 } --- 76 unchanged lines hidden (view full) --- 3720 dec_page_count(sbi, F2FS_DIRTY_META); 3721 } else if (inode->i_ino == F2FS_NODE_INO(sbi)) { 3722 dec_page_count(sbi, F2FS_DIRTY_NODES); 3723 } else { 3724 inode_dec_dirty_pages(inode); 3725 f2fs_remove_dirty_inode(inode); 3726 } 3727 } | 3650 if (err) 3651 goto fail; 3652 3653 lock_page(page); 3654 if (unlikely(page->mapping != mapping)) { 3655 f2fs_put_page(page, 1); 3656 goto repeat; 3657 } --- 76 unchanged lines hidden (view full) --- 3734 dec_page_count(sbi, F2FS_DIRTY_META); 3735 } else if (inode->i_ino == F2FS_NODE_INO(sbi)) { 3736 dec_page_count(sbi, F2FS_DIRTY_NODES); 3737 } else { 3738 inode_dec_dirty_pages(inode); 3739 f2fs_remove_dirty_inode(inode); 3740 } 3741 } |
3728 3729 clear_page_private_reference(&folio->page); 3730 clear_page_private_gcing(&folio->page); 3731 3732 if (test_opt(sbi, COMPRESS_CACHE) && 3733 inode->i_ino == F2FS_COMPRESS_INO(sbi)) 3734 clear_page_private_data(&folio->page); 3735 3736 folio_detach_private(folio); | 3742 clear_page_private_all(&folio->page); |
3737} 3738 3739bool f2fs_release_folio(struct folio *folio, gfp_t wait) 3740{ | 3743} 3744 3745bool f2fs_release_folio(struct folio *folio, gfp_t wait) 3746{ |
3741 struct f2fs_sb_info *sbi; 3742 | |
3743 /* If this is dirty folio, keep private data */ 3744 if (folio_test_dirty(folio)) 3745 return false; 3746 | 3747 /* If this is dirty folio, keep private data */ 3748 if (folio_test_dirty(folio)) 3749 return false; 3750 |
3747 sbi = F2FS_M_SB(folio->mapping); 3748 if (test_opt(sbi, COMPRESS_CACHE)) { 3749 struct inode *inode = folio->mapping->host; 3750 3751 if (inode->i_ino == F2FS_COMPRESS_INO(sbi)) 3752 clear_page_private_data(&folio->page); 3753 } 3754 3755 clear_page_private_reference(&folio->page); 3756 clear_page_private_gcing(&folio->page); 3757 3758 folio_detach_private(folio); | 3751 clear_page_private_all(&folio->page); |
3759 return true; 3760} 3761 3762static bool f2fs_dirty_data_folio(struct address_space *mapping, 3763 struct folio *folio) 3764{ 3765 struct inode *inode = mapping->host; 3766 --- 452 unchanged lines hidden --- | 3752 return true; 3753} 3754 3755static bool f2fs_dirty_data_folio(struct address_space *mapping, 3756 struct folio *folio) 3757{ 3758 struct inode *inode = mapping->host; 3759 --- 452 unchanged lines hidden --- |