checkpoint.c (04f0b2eaa3b3ee243df6040617b4bfbbc0404854) | checkpoint.c (dcbb4c10e6d9693cc9d6fa493b4d130b66a60c7d) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/checkpoint.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 132 unchanged lines hidden (view full) --- 141 return true; 142 143 segno = GET_SEGNO(sbi, blkaddr); 144 offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr); 145 se = get_seg_entry(sbi, segno); 146 147 exist = f2fs_test_bit(offset, se->cur_valid_map); 148 if (!exist && type == DATA_GENERIC_ENHANCE) { | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/checkpoint.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 132 unchanged lines hidden (view full) --- 141 return true; 142 143 segno = GET_SEGNO(sbi, blkaddr); 144 offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr); 145 se = get_seg_entry(sbi, segno); 146 147 exist = f2fs_test_bit(offset, se->cur_valid_map); 148 if (!exist && type == DATA_GENERIC_ENHANCE) { |
149 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error " 150 "blkaddr:%u, sit bitmap:%d", blkaddr, exist); | 149 f2fs_err(sbi, "Inconsistent error blkaddr:%u, sit bitmap:%d", 150 blkaddr, exist); |
151 set_sbi_flag(sbi, SBI_NEED_FSCK); 152 WARN_ON(1); 153 } 154 return exist; 155} 156 157bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, 158 block_t blkaddr, int type) --- 20 unchanged lines hidden (view full) --- 179 blkaddr < MAIN_BLKADDR(sbi))) 180 return false; 181 break; 182 case DATA_GENERIC: 183 case DATA_GENERIC_ENHANCE: 184 case DATA_GENERIC_ENHANCE_READ: 185 if (unlikely(blkaddr >= MAX_BLKADDR(sbi) || 186 blkaddr < MAIN_BLKADDR(sbi))) { | 151 set_sbi_flag(sbi, SBI_NEED_FSCK); 152 WARN_ON(1); 153 } 154 return exist; 155} 156 157bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, 158 block_t blkaddr, int type) --- 20 unchanged lines hidden (view full) --- 179 blkaddr < MAIN_BLKADDR(sbi))) 180 return false; 181 break; 182 case DATA_GENERIC: 183 case DATA_GENERIC_ENHANCE: 184 case DATA_GENERIC_ENHANCE_READ: 185 if (unlikely(blkaddr >= MAX_BLKADDR(sbi) || 186 blkaddr < MAIN_BLKADDR(sbi))) { |
187 f2fs_msg(sbi->sb, KERN_WARNING, 188 "access invalid blkaddr:%u", blkaddr); | 187 f2fs_warn(sbi, "access invalid blkaddr:%u", 188 blkaddr); |
189 set_sbi_flag(sbi, SBI_NEED_FSCK); 190 WARN_ON(1); 191 return false; 192 } else { 193 return __is_bitmap_valid(sbi, blkaddr, type); 194 } 195 break; 196 case META_GENERIC: --- 455 unchanged lines hidden (view full) --- 652 if (ni.blk_addr != NULL_ADDR) { 653 err = -EIO; 654 goto err_out; 655 } 656 return 0; 657 658err_out: 659 set_sbi_flag(sbi, SBI_NEED_FSCK); | 189 set_sbi_flag(sbi, SBI_NEED_FSCK); 190 WARN_ON(1); 191 return false; 192 } else { 193 return __is_bitmap_valid(sbi, blkaddr, type); 194 } 195 break; 196 case META_GENERIC: --- 455 unchanged lines hidden (view full) --- 652 if (ni.blk_addr != NULL_ADDR) { 653 err = -EIO; 654 goto err_out; 655 } 656 return 0; 657 658err_out: 659 set_sbi_flag(sbi, SBI_NEED_FSCK); |
660 f2fs_msg(sbi->sb, KERN_WARNING, 661 "%s: orphan failed (ino=%x), run fsck to fix.", 662 __func__, ino); | 660 f2fs_warn(sbi, "%s: orphan failed (ino=%x), run fsck to fix.", 661 __func__, ino); |
663 return err; 664} 665 666int f2fs_recover_orphan_inodes(struct f2fs_sb_info *sbi) 667{ 668 block_t start_blk, orphan_blocks, i, j; 669 unsigned int s_flags = sbi->sb->s_flags; 670 int err = 0; 671#ifdef CONFIG_QUOTA 672 int quota_enabled; 673#endif 674 675 if (!is_set_ckpt_flags(sbi, CP_ORPHAN_PRESENT_FLAG)) 676 return 0; 677 678 if (bdev_read_only(sbi->sb->s_bdev)) { | 662 return err; 663} 664 665int f2fs_recover_orphan_inodes(struct f2fs_sb_info *sbi) 666{ 667 block_t start_blk, orphan_blocks, i, j; 668 unsigned int s_flags = sbi->sb->s_flags; 669 int err = 0; 670#ifdef CONFIG_QUOTA 671 int quota_enabled; 672#endif 673 674 if (!is_set_ckpt_flags(sbi, CP_ORPHAN_PRESENT_FLAG)) 675 return 0; 676 677 if (bdev_read_only(sbi->sb->s_bdev)) { |
679 f2fs_msg(sbi->sb, KERN_INFO, "write access " 680 "unavailable, skipping orphan cleanup"); | 678 f2fs_info(sbi, "write access unavailable, skipping orphan cleanup"); |
681 return 0; 682 } 683 684 if (s_flags & SB_RDONLY) { | 679 return 0; 680 } 681 682 if (s_flags & SB_RDONLY) { |
685 f2fs_msg(sbi->sb, KERN_INFO, "orphan cleanup on readonly fs"); | 683 f2fs_info(sbi, "orphan cleanup on readonly fs"); |
686 sbi->sb->s_flags &= ~SB_RDONLY; 687 } 688 689#ifdef CONFIG_QUOTA 690 /* Needed for iput() to work correctly and not trash data */ 691 sbi->sb->s_flags |= SB_ACTIVE; 692 693 /* --- 128 unchanged lines hidden (view full) --- 822 return PTR_ERR(*cp_page); 823 824 *cp_block = (struct f2fs_checkpoint *)page_address(*cp_page); 825 826 crc_offset = le32_to_cpu((*cp_block)->checksum_offset); 827 if (crc_offset < CP_MIN_CHKSUM_OFFSET || 828 crc_offset > CP_CHKSUM_OFFSET) { 829 f2fs_put_page(*cp_page, 1); | 684 sbi->sb->s_flags &= ~SB_RDONLY; 685 } 686 687#ifdef CONFIG_QUOTA 688 /* Needed for iput() to work correctly and not trash data */ 689 sbi->sb->s_flags |= SB_ACTIVE; 690 691 /* --- 128 unchanged lines hidden (view full) --- 820 return PTR_ERR(*cp_page); 821 822 *cp_block = (struct f2fs_checkpoint *)page_address(*cp_page); 823 824 crc_offset = le32_to_cpu((*cp_block)->checksum_offset); 825 if (crc_offset < CP_MIN_CHKSUM_OFFSET || 826 crc_offset > CP_CHKSUM_OFFSET) { 827 f2fs_put_page(*cp_page, 1); |
830 f2fs_msg(sbi->sb, KERN_WARNING, 831 "invalid crc_offset: %zu", crc_offset); | 828 f2fs_warn(sbi, "invalid crc_offset: %zu", crc_offset); |
832 return -EINVAL; 833 } 834 835 crc = f2fs_checkpoint_chksum(sbi, *cp_block); 836 if (crc != cur_cp_crc(*cp_block)) { 837 f2fs_put_page(*cp_page, 1); | 829 return -EINVAL; 830 } 831 832 crc = f2fs_checkpoint_chksum(sbi, *cp_block); 833 if (crc != cur_cp_crc(*cp_block)) { 834 f2fs_put_page(*cp_page, 1); |
838 f2fs_msg(sbi->sb, KERN_WARNING, "invalid crc value"); | 835 f2fs_warn(sbi, "invalid crc value"); |
839 return -EINVAL; 840 } 841 842 *version = cur_cp_version(*cp_block); 843 return 0; 844} 845 846static struct page *validate_checkpoint(struct f2fs_sb_info *sbi, --- 6 unchanged lines hidden (view full) --- 853 854 err = get_checkpoint_version(sbi, cp_addr, &cp_block, 855 &cp_page_1, version); 856 if (err) 857 return NULL; 858 859 if (le32_to_cpu(cp_block->cp_pack_total_block_count) > 860 sbi->blocks_per_seg) { | 836 return -EINVAL; 837 } 838 839 *version = cur_cp_version(*cp_block); 840 return 0; 841} 842 843static struct page *validate_checkpoint(struct f2fs_sb_info *sbi, --- 6 unchanged lines hidden (view full) --- 850 851 err = get_checkpoint_version(sbi, cp_addr, &cp_block, 852 &cp_page_1, version); 853 if (err) 854 return NULL; 855 856 if (le32_to_cpu(cp_block->cp_pack_total_block_count) > 857 sbi->blocks_per_seg) { |
861 f2fs_msg(sbi->sb, KERN_WARNING, 862 "invalid cp_pack_total_block_count:%u", 863 le32_to_cpu(cp_block->cp_pack_total_block_count)); | 858 f2fs_warn(sbi, "invalid cp_pack_total_block_count:%u", 859 le32_to_cpu(cp_block->cp_pack_total_block_count)); |
864 goto invalid_cp; 865 } 866 pre_version = *version; 867 868 cp_addr += le32_to_cpu(cp_block->cp_pack_total_block_count) - 1; 869 err = get_checkpoint_version(sbi, cp_addr, &cp_block, 870 &cp_page_2, version); 871 if (err) --- 682 unchanged lines hidden (view full) --- 1554 int err = 0; 1555 1556 if (f2fs_readonly(sbi->sb) || f2fs_hw_is_readonly(sbi)) 1557 return -EROFS; 1558 1559 if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { 1560 if (cpc->reason != CP_PAUSE) 1561 return 0; | 860 goto invalid_cp; 861 } 862 pre_version = *version; 863 864 cp_addr += le32_to_cpu(cp_block->cp_pack_total_block_count) - 1; 865 err = get_checkpoint_version(sbi, cp_addr, &cp_block, 866 &cp_page_2, version); 867 if (err) --- 682 unchanged lines hidden (view full) --- 1550 int err = 0; 1551 1552 if (f2fs_readonly(sbi->sb) || f2fs_hw_is_readonly(sbi)) 1553 return -EROFS; 1554 1555 if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { 1556 if (cpc->reason != CP_PAUSE) 1557 return 0; |
1562 f2fs_msg(sbi->sb, KERN_WARNING, 1563 "Start checkpoint disabled!"); | 1558 f2fs_warn(sbi, "Start checkpoint disabled!"); |
1564 } 1565 mutex_lock(&sbi->cp_mutex); 1566 1567 if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) && 1568 ((cpc->reason & CP_FASTBOOT) || (cpc->reason & CP_SYNC) || 1569 ((cpc->reason & CP_DISCARD) && !sbi->discard_blks))) 1570 goto out; 1571 if (unlikely(f2fs_cp_error(sbi))) { --- 49 unchanged lines hidden (view full) --- 1621 f2fs_release_discard_addrs(sbi); 1622 else 1623 f2fs_clear_prefree_segments(sbi, cpc); 1624stop: 1625 unblock_operations(sbi); 1626 stat_inc_cp_count(sbi->stat_info); 1627 1628 if (cpc->reason & CP_RECOVERY) | 1559 } 1560 mutex_lock(&sbi->cp_mutex); 1561 1562 if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) && 1563 ((cpc->reason & CP_FASTBOOT) || (cpc->reason & CP_SYNC) || 1564 ((cpc->reason & CP_DISCARD) && !sbi->discard_blks))) 1565 goto out; 1566 if (unlikely(f2fs_cp_error(sbi))) { --- 49 unchanged lines hidden (view full) --- 1616 f2fs_release_discard_addrs(sbi); 1617 else 1618 f2fs_clear_prefree_segments(sbi, cpc); 1619stop: 1620 unblock_operations(sbi); 1621 stat_inc_cp_count(sbi->stat_info); 1622 1623 if (cpc->reason & CP_RECOVERY) |
1629 f2fs_msg(sbi->sb, KERN_NOTICE, 1630 "checkpoint: version = %llx", ckpt_ver); | 1624 f2fs_notice(sbi, "checkpoint: version = %llx", ckpt_ver); |
1631 1632 /* do checkpoint periodically */ 1633 f2fs_update_time(sbi, CP_TIME); 1634 trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint"); 1635out: 1636 mutex_unlock(&sbi->cp_mutex); 1637 return err; 1638} --- 39 unchanged lines hidden --- | 1625 1626 /* do checkpoint periodically */ 1627 f2fs_update_time(sbi, CP_TIME); 1628 trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint"); 1629out: 1630 mutex_unlock(&sbi->cp_mutex); 1631 return err; 1632} --- 39 unchanged lines hidden --- |