segment.c (04f0b2eaa3b3ee243df6040617b4bfbbc0404854) | segment.c (dcbb4c10e6d9693cc9d6fa493b4d130b66a60c7d) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/segment.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 1743 unchanged lines hidden (view full) --- 1752 sector_t sector, nr_sects; 1753 block_t lblkstart = blkstart; 1754 int devi = 0; 1755 1756 if (f2fs_is_multi_device(sbi)) { 1757 devi = f2fs_target_device_index(sbi, blkstart); 1758 if (blkstart < FDEV(devi).start_blk || 1759 blkstart > FDEV(devi).end_blk) { | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/segment.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 1743 unchanged lines hidden (view full) --- 1752 sector_t sector, nr_sects; 1753 block_t lblkstart = blkstart; 1754 int devi = 0; 1755 1756 if (f2fs_is_multi_device(sbi)) { 1757 devi = f2fs_target_device_index(sbi, blkstart); 1758 if (blkstart < FDEV(devi).start_blk || 1759 blkstart > FDEV(devi).end_blk) { |
1760 f2fs_msg(sbi->sb, KERN_ERR, "Invalid block %x", 1761 blkstart); | 1760 f2fs_err(sbi, "Invalid block %x", blkstart); |
1762 return -EIO; 1763 } 1764 blkstart -= FDEV(devi).start_blk; 1765 } 1766 1767 /* For sequential zones, reset the zone write pointer */ 1768 if (f2fs_blkz_is_seq(sbi, devi, blkstart)) { 1769 sector = SECTOR_FROM_BLOCK(blkstart); 1770 nr_sects = SECTOR_FROM_BLOCK(blklen); 1771 1772 if (sector & (bdev_zone_sectors(bdev) - 1) || 1773 nr_sects != bdev_zone_sectors(bdev)) { | 1761 return -EIO; 1762 } 1763 blkstart -= FDEV(devi).start_blk; 1764 } 1765 1766 /* For sequential zones, reset the zone write pointer */ 1767 if (f2fs_blkz_is_seq(sbi, devi, blkstart)) { 1768 sector = SECTOR_FROM_BLOCK(blkstart); 1769 nr_sects = SECTOR_FROM_BLOCK(blklen); 1770 1771 if (sector & (bdev_zone_sectors(bdev) - 1) || 1772 nr_sects != bdev_zone_sectors(bdev)) { |
1774 f2fs_msg(sbi->sb, KERN_ERR, 1775 "(%d) %s: Unaligned zone reset attempted (block %x + %x)", 1776 devi, sbi->s_ndevs ? FDEV(devi).path: "", 1777 blkstart, blklen); | 1773 f2fs_err(sbi, "(%d) %s: Unaligned zone reset attempted (block %x + %x)", 1774 devi, sbi->s_ndevs ? FDEV(devi).path : "", 1775 blkstart, blklen); |
1778 return -EIO; 1779 } 1780 trace_f2fs_issue_reset_zone(bdev, blkstart); 1781 return blkdev_reset_zones(bdev, sector, nr_sects, GFP_NOFS); 1782 } 1783 1784 /* For conventional zones, use regular discard if supported */ 1785 return __queue_discard_cmd(sbi, bdev, lblkstart, blklen); --- 347 unchanged lines hidden (view full) --- 2133 2134 /* Update valid block bitmap */ 2135 if (del > 0) { 2136 exist = f2fs_test_and_set_bit(offset, se->cur_valid_map); 2137#ifdef CONFIG_F2FS_CHECK_FS 2138 mir_exist = f2fs_test_and_set_bit(offset, 2139 se->cur_valid_map_mir); 2140 if (unlikely(exist != mir_exist)) { | 1776 return -EIO; 1777 } 1778 trace_f2fs_issue_reset_zone(bdev, blkstart); 1779 return blkdev_reset_zones(bdev, sector, nr_sects, GFP_NOFS); 1780 } 1781 1782 /* For conventional zones, use regular discard if supported */ 1783 return __queue_discard_cmd(sbi, bdev, lblkstart, blklen); --- 347 unchanged lines hidden (view full) --- 2131 2132 /* Update valid block bitmap */ 2133 if (del > 0) { 2134 exist = f2fs_test_and_set_bit(offset, se->cur_valid_map); 2135#ifdef CONFIG_F2FS_CHECK_FS 2136 mir_exist = f2fs_test_and_set_bit(offset, 2137 se->cur_valid_map_mir); 2138 if (unlikely(exist != mir_exist)) { |
2141 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error " 2142 "when setting bitmap, blk:%u, old bit:%d", 2143 blkaddr, exist); | 2139 f2fs_err(sbi, "Inconsistent error when setting bitmap, blk:%u, old bit:%d", 2140 blkaddr, exist); |
2144 f2fs_bug_on(sbi, 1); 2145 } 2146#endif 2147 if (unlikely(exist)) { | 2141 f2fs_bug_on(sbi, 1); 2142 } 2143#endif 2144 if (unlikely(exist)) { |
2148 f2fs_msg(sbi->sb, KERN_ERR, 2149 "Bitmap was wrongly set, blk:%u", blkaddr); | 2145 f2fs_err(sbi, "Bitmap was wrongly set, blk:%u", 2146 blkaddr); |
2150 f2fs_bug_on(sbi, 1); 2151 se->valid_blocks--; 2152 del = 0; 2153 } 2154 2155 if (!f2fs_test_and_set_bit(offset, se->discard_map)) 2156 sbi->discard_blks--; 2157 --- 4 unchanged lines hidden (view full) --- 2162 se->ckpt_valid_blocks++; 2163 } 2164 } else { 2165 exist = f2fs_test_and_clear_bit(offset, se->cur_valid_map); 2166#ifdef CONFIG_F2FS_CHECK_FS 2167 mir_exist = f2fs_test_and_clear_bit(offset, 2168 se->cur_valid_map_mir); 2169 if (unlikely(exist != mir_exist)) { | 2147 f2fs_bug_on(sbi, 1); 2148 se->valid_blocks--; 2149 del = 0; 2150 } 2151 2152 if (!f2fs_test_and_set_bit(offset, se->discard_map)) 2153 sbi->discard_blks--; 2154 --- 4 unchanged lines hidden (view full) --- 2159 se->ckpt_valid_blocks++; 2160 } 2161 } else { 2162 exist = f2fs_test_and_clear_bit(offset, se->cur_valid_map); 2163#ifdef CONFIG_F2FS_CHECK_FS 2164 mir_exist = f2fs_test_and_clear_bit(offset, 2165 se->cur_valid_map_mir); 2166 if (unlikely(exist != mir_exist)) { |
2170 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error " 2171 "when clearing bitmap, blk:%u, old bit:%d", 2172 blkaddr, exist); | 2167 f2fs_err(sbi, "Inconsistent error when clearing bitmap, blk:%u, old bit:%d", 2168 blkaddr, exist); |
2173 f2fs_bug_on(sbi, 1); 2174 } 2175#endif 2176 if (unlikely(!exist)) { | 2169 f2fs_bug_on(sbi, 1); 2170 } 2171#endif 2172 if (unlikely(!exist)) { |
2177 f2fs_msg(sbi->sb, KERN_ERR, 2178 "Bitmap was wrongly cleared, blk:%u", blkaddr); | 2173 f2fs_err(sbi, "Bitmap was wrongly cleared, blk:%u", 2174 blkaddr); |
2179 f2fs_bug_on(sbi, 1); 2180 se->valid_blocks++; 2181 del = 0; 2182 } else if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { 2183 /* 2184 * If checkpoints are off, we must not reuse data that 2185 * was used in the previous checkpoint. If it was used 2186 * before, we must track that to know how much space we --- 491 unchanged lines hidden (view full) --- 2678 2679 stat_inc_seg_type(sbi, curseg); 2680 2681 locate_dirty_segment(sbi, segno); 2682unlock: 2683 up_write(&SIT_I(sbi)->sentry_lock); 2684 2685 if (segno != curseg->segno) | 2175 f2fs_bug_on(sbi, 1); 2176 se->valid_blocks++; 2177 del = 0; 2178 } else if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { 2179 /* 2180 * If checkpoints are off, we must not reuse data that 2181 * was used in the previous checkpoint. If it was used 2182 * before, we must track that to know how much space we --- 491 unchanged lines hidden (view full) --- 2674 2675 stat_inc_seg_type(sbi, curseg); 2676 2677 locate_dirty_segment(sbi, segno); 2678unlock: 2679 up_write(&SIT_I(sbi)->sentry_lock); 2680 2681 if (segno != curseg->segno) |
2686 f2fs_msg(sbi->sb, KERN_NOTICE, 2687 "For resize: curseg of type %d: %u ==> %u", 2688 type, segno, curseg->segno); | 2682 f2fs_notice(sbi, "For resize: curseg of type %d: %u ==> %u", 2683 type, segno, curseg->segno); |
2689 2690 mutex_unlock(&curseg->curseg_mutex); 2691 up_read(&SM_I(sbi)->curseg_lock); 2692} 2693 2694void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi) 2695{ 2696 struct curseg_info *curseg; --- 121 unchanged lines hidden (view full) --- 2818 2819 if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize) 2820 return -EINVAL; 2821 2822 if (end < MAIN_BLKADDR(sbi)) 2823 goto out; 2824 2825 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { | 2684 2685 mutex_unlock(&curseg->curseg_mutex); 2686 up_read(&SM_I(sbi)->curseg_lock); 2687} 2688 2689void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi) 2690{ 2691 struct curseg_info *curseg; --- 121 unchanged lines hidden (view full) --- 2813 2814 if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize) 2815 return -EINVAL; 2816 2817 if (end < MAIN_BLKADDR(sbi)) 2818 goto out; 2819 2820 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) { |
2826 f2fs_msg(sbi->sb, KERN_WARNING, 2827 "Found FS corruption, run fsck to fix."); | 2821 f2fs_warn(sbi, "Found FS corruption, run fsck to fix."); |
2828 return -EIO; 2829 } 2830 2831 /* start/end segment number in main_area */ 2832 start_segno = (start <= MAIN_BLKADDR(sbi)) ? 0 : GET_SEGNO(sbi, start); 2833 end_segno = (end >= MAX_BLKADDR(sbi)) ? MAIN_SEGS(sbi) - 1 : 2834 GET_SEGNO(sbi, end); 2835 if (need_align) { --- 744 unchanged lines hidden (view full) --- 3580 err = read_normal_summaries(sbi, type); 3581 if (err) 3582 return err; 3583 } 3584 3585 /* sanity check for summary blocks */ 3586 if (nats_in_cursum(nat_j) > NAT_JOURNAL_ENTRIES || 3587 sits_in_cursum(sit_j) > SIT_JOURNAL_ENTRIES) { | 2822 return -EIO; 2823 } 2824 2825 /* start/end segment number in main_area */ 2826 start_segno = (start <= MAIN_BLKADDR(sbi)) ? 0 : GET_SEGNO(sbi, start); 2827 end_segno = (end >= MAX_BLKADDR(sbi)) ? MAIN_SEGS(sbi) - 1 : 2828 GET_SEGNO(sbi, end); 2829 if (need_align) { --- 744 unchanged lines hidden (view full) --- 3574 err = read_normal_summaries(sbi, type); 3575 if (err) 3576 return err; 3577 } 3578 3579 /* sanity check for summary blocks */ 3580 if (nats_in_cursum(nat_j) > NAT_JOURNAL_ENTRIES || 3581 sits_in_cursum(sit_j) > SIT_JOURNAL_ENTRIES) { |
3588 f2fs_msg(sbi->sb, KERN_ERR, 3589 "invalid journal entries nats %u sits %u\n", 3590 nats_in_cursum(nat_j), sits_in_cursum(sit_j)); | 3582 f2fs_err(sbi, "invalid journal entries nats %u sits %u\n", 3583 nats_in_cursum(nat_j), sits_in_cursum(sit_j)); |
3591 return -EINVAL; 3592 } 3593 3594 return 0; 3595} 3596 3597static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) 3598{ --- 551 unchanged lines hidden (view full) --- 4150 } while (start_blk < sit_blk_cnt); 4151 4152 down_read(&curseg->journal_rwsem); 4153 for (i = 0; i < sits_in_cursum(journal); i++) { 4154 unsigned int old_valid_blocks; 4155 4156 start = le32_to_cpu(segno_in_journal(journal, i)); 4157 if (start >= MAIN_SEGS(sbi)) { | 3584 return -EINVAL; 3585 } 3586 3587 return 0; 3588} 3589 3590static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr) 3591{ --- 551 unchanged lines hidden (view full) --- 4143 } while (start_blk < sit_blk_cnt); 4144 4145 down_read(&curseg->journal_rwsem); 4146 for (i = 0; i < sits_in_cursum(journal); i++) { 4147 unsigned int old_valid_blocks; 4148 4149 start = le32_to_cpu(segno_in_journal(journal, i)); 4150 if (start >= MAIN_SEGS(sbi)) { |
4158 f2fs_msg(sbi->sb, KERN_ERR, 4159 "Wrong journal entry on segno %u", 4160 start); | 4151 f2fs_err(sbi, "Wrong journal entry on segno %u", 4152 start); |
4161 set_sbi_flag(sbi, SBI_NEED_FSCK); 4162 err = -EINVAL; 4163 break; 4164 } 4165 4166 se = &sit_i->sentries[start]; 4167 sit = sit_in_journal(journal, i); 4168 --- 22 unchanged lines hidden (view full) --- 4191 se->valid_blocks; 4192 get_sec_entry(sbi, start)->valid_blocks -= 4193 old_valid_blocks; 4194 } 4195 } 4196 up_read(&curseg->journal_rwsem); 4197 4198 if (!err && total_node_blocks != valid_node_count(sbi)) { | 4153 set_sbi_flag(sbi, SBI_NEED_FSCK); 4154 err = -EINVAL; 4155 break; 4156 } 4157 4158 se = &sit_i->sentries[start]; 4159 sit = sit_in_journal(journal, i); 4160 --- 22 unchanged lines hidden (view full) --- 4183 se->valid_blocks; 4184 get_sec_entry(sbi, start)->valid_blocks -= 4185 old_valid_blocks; 4186 } 4187 } 4188 up_read(&curseg->journal_rwsem); 4189 4190 if (!err && total_node_blocks != valid_node_count(sbi)) { |
4199 f2fs_msg(sbi->sb, KERN_ERR, 4200 "SIT is corrupted node# %u vs %u", 4201 total_node_blocks, valid_node_count(sbi)); | 4191 f2fs_err(sbi, "SIT is corrupted node# %u vs %u", 4192 total_node_blocks, valid_node_count(sbi)); |
4202 set_sbi_flag(sbi, SBI_NEED_FSCK); 4203 err = -EINVAL; 4204 } 4205 4206 return err; 4207} 4208 4209static void init_free_segmap(struct f2fs_sb_info *sbi) --- 99 unchanged lines hidden (view full) --- 4309 4310 if (curseg->alloc_type == SSR) 4311 continue; 4312 4313 for (blkofs += 1; blkofs < sbi->blocks_per_seg; blkofs++) { 4314 if (!f2fs_test_bit(blkofs, se->cur_valid_map)) 4315 continue; 4316out: | 4193 set_sbi_flag(sbi, SBI_NEED_FSCK); 4194 err = -EINVAL; 4195 } 4196 4197 return err; 4198} 4199 4200static void init_free_segmap(struct f2fs_sb_info *sbi) --- 99 unchanged lines hidden (view full) --- 4300 4301 if (curseg->alloc_type == SSR) 4302 continue; 4303 4304 for (blkofs += 1; blkofs < sbi->blocks_per_seg; blkofs++) { 4305 if (!f2fs_test_bit(blkofs, se->cur_valid_map)) 4306 continue; 4307out: |
4317 f2fs_msg(sbi->sb, KERN_ERR, 4318 "Current segment's next free block offset is " 4319 "inconsistent with bitmap, logtype:%u, " 4320 "segno:%u, type:%u, next_blkoff:%u, blkofs:%u", 4321 i, curseg->segno, curseg->alloc_type, 4322 curseg->next_blkoff, blkofs); | 4308 f2fs_err(sbi, 4309 "Current segment's next free block offset is inconsistent with bitmap, logtype:%u, segno:%u, type:%u, next_blkoff:%u, blkofs:%u", 4310 i, curseg->segno, curseg->alloc_type, 4311 curseg->next_blkoff, blkofs); |
4323 return -EINVAL; 4324 } 4325 } 4326 return 0; 4327} 4328 4329/* 4330 * Update min, max modified time for cost-benefit GC algorithm --- 249 unchanged lines hidden --- | 4312 return -EINVAL; 4313 } 4314 } 4315 return 0; 4316} 4317 4318/* 4319 * Update min, max modified time for cost-benefit GC algorithm --- 249 unchanged lines hidden --- |