[chao:feature/cache 6/13] fs/f2fs/gc.c:1897 do_garbage_collect() error: 'sum_entry' dereferencing possible ERR_PTR()

kernel test robot <[email protected]>
Newsgroups dev.linux.lists.oe-kbuild
Message-ID <[email protected]>
BCC: [email protected]
CC: [email protected]
CC: Chao Yu <[email protected]>
TO: Chao Yu <[email protected]>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/chao/linux.git feature/cache
head:   cc6a23d8c232f588f3a5415d1b10a19e1e4ce860
commit: 843ddf01eb4efc800bdac9de795bdeb57940a3e0 [6/13] f2fs: cache: use meta cache
:::::: branch date: 18 hours ago
:::::: commit date: 18 hours ago
config: x86_64-randconfig-161-20260819 (https://download.01.org/0day-ci/archive/20260819/[email protected]/config)
compiler: clang version 22.1.3 (https://github.com/llvm/llvm-project e9846648fd6183ee6d8cbdb4502213fcf902a211)
smatch: v0.5.0-9187-g5189e3fb

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Reported-by: Dan Carpenter <[email protected]>
| Closes: https://lore.kernel.org/r/[email protected]/

New smatch warnings:
fs/f2fs/gc.c:1897 do_garbage_collect() error: 'sum_entry' dereferencing possible ERR_PTR()
fs/f2fs/segment.c:4617 write_compacted_summaries() warn: variable dereferenced before check 'entry' (see line 4600)

Old smatch warnings:
fs/f2fs/gc.c:819 f2fs_get_victim() warn: check sign expansion for '-1'
fs/f2fs/gc.c:1298 ra_data_block() warn: missing error code 'err'
fs/f2fs/segment.c:874 __remove_dirty_segment() warn: check sign expansion for '-1'

vim +/sum_entry +1897 fs/f2fs/gc.c

7bc0900347e069 Jaegeuk Kim    2012-11-02  1772  
718e53fa633f84 Chao Yu        2016-01-23  1773  static int do_garbage_collect(struct f2fs_sb_info *sbi,
718e53fa633f84 Chao Yu        2016-01-23  1774  				unsigned int start_segno,
7dede88659df38 Chao Yu        2021-02-20  1775  				struct gc_inode_list *gc_list, int gc_type,
9748c2ddea4a3f Daeho Jeong    2024-09-09  1776  				bool force_migrate, bool one_time)
7bc0900347e069 Jaegeuk Kim    2012-11-02  1777  {
c718379b6b0954 Jaegeuk Kim    2013-04-24  1778  	struct blk_plug plug;
718e53fa633f84 Chao Yu        2016-01-23  1779  	unsigned int segno = start_segno;
a60108f7dfb586 Jaegeuk Kim    2024-02-06  1780  	unsigned int end_segno = start_segno + SEGS_PER_SEC(sbi);
8c890c4c603427 Daeho Jeong    2024-09-09  1781  	unsigned int sec_end_segno;
e3080b0120a15e Chao Yu        2018-10-24  1782  	int seg_freed = 0, migrated = 0;
5dfb768326b95c Daeho Jeong    2026-05-14  1783  	unsigned char type;
5dfb768326b95c Daeho Jeong    2026-05-14  1784  	unsigned char data_type;
7ee8bc3942f209 Daeho Jeong    2025-11-11  1785  	int submitted = 0, sum_blk_cnt;
7bc0900347e069 Jaegeuk Kim    2012-11-02  1786  
8c890c4c603427 Daeho Jeong    2024-09-09  1787  	if (__is_large_section(sbi)) {
8c890c4c603427 Daeho Jeong    2024-09-09  1788  		sec_end_segno = rounddown(end_segno, SEGS_PER_SEC(sbi));
e3080b0120a15e Chao Yu        2018-10-24  1789  
de881df97768d0 Aravind Ramesh 2020-07-16  1790  		/*
de881df97768d0 Aravind Ramesh 2020-07-16  1791  		 * zone-capacity can be less than zone-size in zoned devices,
de881df97768d0 Aravind Ramesh 2020-07-16  1792  		 * resulting in less than expected usable segments in the zone,
8c890c4c603427 Daeho Jeong    2024-09-09  1793  		 * calculate the end segno in the zone which can be garbage
8c890c4c603427 Daeho Jeong    2024-09-09  1794  		 * collected
de881df97768d0 Aravind Ramesh 2020-07-16  1795  		 */
de881df97768d0 Aravind Ramesh 2020-07-16  1796  		if (f2fs_sb_has_blkzoned(sbi))
8c890c4c603427 Daeho Jeong    2024-09-09  1797  			sec_end_segno -= SEGS_PER_SEC(sbi) -
2af583afcf9d54 liuderong      2024-09-11  1798  					f2fs_usable_segs_in_sec(sbi);
de881df97768d0 Aravind Ramesh 2020-07-16  1799  
9748c2ddea4a3f Daeho Jeong    2024-09-09  1800  		if (gc_type == BG_GC || one_time) {
2223fe652f7596 Daeho Jeong    2024-09-09  1801  			unsigned int window_granularity =
8c890c4c603427 Daeho Jeong    2024-09-09  1802  				sbi->migration_window_granularity;
8c890c4c603427 Daeho Jeong    2024-09-09  1803  
2223fe652f7596 Daeho Jeong    2024-09-09  1804  			if (f2fs_sb_has_blkzoned(sbi) &&
2223fe652f7596 Daeho Jeong    2024-09-09  1805  					!has_enough_free_blocks(sbi,
3d7bca9d583793 Chao Yu        2026-07-06  1806  					sbi->gc_thread.boost_zoned_gc_percent))
9a481a1c16f465 Daeho Jeong    2024-09-09  1807  				window_granularity *=
3d7bca9d583793 Chao Yu        2026-07-06  1808  					sbi->gc_thread.boost_gc_multiple;
2223fe652f7596 Daeho Jeong    2024-09-09  1809  
2223fe652f7596 Daeho Jeong    2024-09-09  1810  			end_segno = start_segno + window_granularity;
2223fe652f7596 Daeho Jeong    2024-09-09  1811  		}
2223fe652f7596 Daeho Jeong    2024-09-09  1812  
8c890c4c603427 Daeho Jeong    2024-09-09  1813  		if (end_segno > sec_end_segno)
8c890c4c603427 Daeho Jeong    2024-09-09  1814  			end_segno = sec_end_segno;
8c890c4c603427 Daeho Jeong    2024-09-09  1815  	}
8c890c4c603427 Daeho Jeong    2024-09-09  1816  
093749e296e29a Chao Yu        2020-08-04  1817  	sanity_check_seg_type(sbi, get_seg_entry(sbi, segno)->type);
093749e296e29a Chao Yu        2020-08-04  1818  
e48e16f3e37fac Daeho Jeong    2026-01-10  1819  	segno = rounddown(segno, sbi->sums_per_block);
e48e16f3e37fac Daeho Jeong    2026-01-10  1820  	sum_blk_cnt = DIV_ROUND_UP(end_segno - segno, sbi->sums_per_block);
718e53fa633f84 Chao Yu        2016-01-23  1821  	/* readahead multi ssa blocks those have contiguous address */
2c70c5e3874e8c Chao Yu        2018-10-24  1822  	if (__is_large_section(sbi))
843ddf01eb4efc Chao Yu        2026-08-18  1823  		f2fs_ra_meta_caches(sbi, GET_SUM_BLOCK(sbi, segno),
7ee8bc3942f209 Daeho Jeong    2025-11-11  1824  					sum_blk_cnt, META_SSA, true);
718e53fa633f84 Chao Yu        2016-01-23  1825  
718e53fa633f84 Chao Yu        2016-01-23  1826  	/* reference all summary page */
718e53fa633f84 Chao Yu        2016-01-23  1827  	while (segno < end_segno) {
843ddf01eb4efc Chao Yu        2026-08-18  1828  		struct f2fs_cached_block *sum_entry =
843ddf01eb4efc Chao Yu        2026-08-18  1829  				f2fs_get_sum_cache(sbi, segno);
7ee8bc3942f209 Daeho Jeong    2025-11-11  1830  
e48e16f3e37fac Daeho Jeong    2026-01-10  1831  		segno += sbi->sums_per_block;
843ddf01eb4efc Chao Yu        2026-08-18  1832  		if (IS_ERR(sum_entry)) {
843ddf01eb4efc Chao Yu        2026-08-18  1833  			int err = PTR_ERR(sum_entry);
edc55aaf0d1712 Jaegeuk Kim    2018-09-17  1834  
e48e16f3e37fac Daeho Jeong    2026-01-10  1835  			end_segno = segno - sbi->sums_per_block;
e48e16f3e37fac Daeho Jeong    2026-01-10  1836  			segno = rounddown(start_segno, sbi->sums_per_block);
7ee8bc3942f209 Daeho Jeong    2025-11-11  1837  			while (segno < end_segno) {
843ddf01eb4efc Chao Yu        2026-08-18  1838  				sum_entry = f2fs_find_meta_cache(sbi,
edc55aaf0d1712 Jaegeuk Kim    2018-09-17  1839  						GET_SUM_BLOCK(sbi, segno));
843ddf01eb4efc Chao Yu        2026-08-18  1840  				f2fs_put_cache(sum_entry, false);
843ddf01eb4efc Chao Yu        2026-08-18  1841  				f2fs_put_cache(sum_entry, false);
e48e16f3e37fac Daeho Jeong    2026-01-10  1842  				segno += sbi->sums_per_block;
edc55aaf0d1712 Jaegeuk Kim    2018-09-17  1843  			}
edc55aaf0d1712 Jaegeuk Kim    2018-09-17  1844  			return err;
edc55aaf0d1712 Jaegeuk Kim    2018-09-17  1845  		}
843ddf01eb4efc Chao Yu        2026-08-18  1846  		f2fs_unlock_cache(sum_entry);
843ddf01eb4efc Chao Yu        2026-08-18  1847  
718e53fa633f84 Chao Yu        2016-01-23  1848  	}
7bc0900347e069 Jaegeuk Kim    2012-11-02  1849  
c718379b6b0954 Jaegeuk Kim    2013-04-24  1850  	blk_start_plug(&plug);
c718379b6b0954 Jaegeuk Kim    2013-04-24  1851  
7ee8bc3942f209 Daeho Jeong    2025-11-11  1852  	segno = start_segno;
7ee8bc3942f209 Daeho Jeong    2025-11-11  1853  	while (segno < end_segno) {
7ee8bc3942f209 Daeho Jeong    2025-11-11  1854  		unsigned int cur_segno;
843ddf01eb4efc Chao Yu        2026-08-18  1855  		unsigned int block_end_segno;
aa987273290d20 Jaegeuk Kim    2016-06-06  1856  
718e53fa633f84 Chao Yu        2016-01-23  1857  		/* find segment summary of victim */
843ddf01eb4efc Chao Yu        2026-08-18  1858  		struct f2fs_cached_block *sum_entry =
843ddf01eb4efc Chao Yu        2026-08-18  1859  				f2fs_find_meta_cache(sbi,
718e53fa633f84 Chao Yu        2016-01-23  1860  					GET_SUM_BLOCK(sbi, segno));
843ddf01eb4efc Chao Yu        2026-08-18  1861  
843ddf01eb4efc Chao Yu        2026-08-18  1862  		f2fs_bug_on(sbi, IS_ERR(sum_entry));
843ddf01eb4efc Chao Yu        2026-08-18  1863  
843ddf01eb4efc Chao Yu        2026-08-18  1864  		block_end_segno = rounddown(segno, sbi->sums_per_block)
e48e16f3e37fac Daeho Jeong    2026-01-10  1865  					+ sbi->sums_per_block;
7ee8bc3942f209 Daeho Jeong    2025-11-11  1866  
7ee8bc3942f209 Daeho Jeong    2025-11-11  1867  		if (block_end_segno > end_segno)
7ee8bc3942f209 Daeho Jeong    2025-11-11  1868  			block_end_segno = end_segno;
718e53fa633f84 Chao Yu        2016-01-23  1869  
d625a2b08c0893 Chao Yu        2025-09-01  1870  		if (is_cursec(sbi, GET_SEC_FROM_SEG(sbi, segno))) {
d625a2b08c0893 Chao Yu        2025-09-01  1871  			f2fs_err(sbi, "%s: segment %u is used by log",
d625a2b08c0893 Chao Yu        2025-09-01  1872  							__func__, segno);
d625a2b08c0893 Chao Yu        2025-09-01  1873  			f2fs_bug_on(sbi, 1);
7ee8bc3942f209 Daeho Jeong    2025-11-11  1874  			goto next_block;
d625a2b08c0893 Chao Yu        2025-09-01  1875  		}
d625a2b08c0893 Chao Yu        2025-09-01  1876  
843ddf01eb4efc Chao Yu        2026-08-18  1877  		if (!f2fs_cache_test_uptodate(sum_entry) ||
7ee8bc3942f209 Daeho Jeong    2025-11-11  1878  			unlikely(f2fs_cp_error(sbi)))
7ee8bc3942f209 Daeho Jeong    2025-11-11  1879  			goto next_block;
7ee8bc3942f209 Daeho Jeong    2025-11-11  1880  
7ee8bc3942f209 Daeho Jeong    2025-11-11  1881  		for (cur_segno = segno; cur_segno < block_end_segno;
7ee8bc3942f209 Daeho Jeong    2025-11-11  1882  				cur_segno++) {
7ee8bc3942f209 Daeho Jeong    2025-11-11  1883  			struct f2fs_summary_block *sum;
7ee8bc3942f209 Daeho Jeong    2025-11-11  1884  
7ee8bc3942f209 Daeho Jeong    2025-11-11  1885  			if (get_valid_blocks(sbi, cur_segno, false) == 0)
d6c66cd19ef322 Yunlong Song   2018-10-24  1886  				goto freed;
dabfbbc8f91450 Jaegeuk Kim    2020-02-09  1887  			if (gc_type == BG_GC && __is_large_section(sbi) &&
e3080b0120a15e Chao Yu        2018-10-24  1888  					migrated >= sbi->migration_granularity)
7ee8bc3942f209 Daeho Jeong    2025-11-11  1889  				continue;
de0dcc40f6e24d Jaegeuk Kim    2016-10-12  1890  
5dfb768326b95c Daeho Jeong    2026-05-14  1891  			if (migrated == 0) {
5dfb768326b95c Daeho Jeong    2026-05-14  1892  				type = IS_DATASEG(get_seg_entry(sbi, cur_segno)->type) ?
5dfb768326b95c Daeho Jeong    2026-05-14  1893  							SUM_TYPE_DATA : SUM_TYPE_NODE;
5dfb768326b95c Daeho Jeong    2026-05-14  1894  				data_type = (type == SUM_TYPE_DATA) ? DATA : NODE;
5dfb768326b95c Daeho Jeong    2026-05-14  1895  			}
5dfb768326b95c Daeho Jeong    2026-05-14  1896  
843ddf01eb4efc Chao Yu        2026-08-18 @1897  			sum = SUM_BLK_ENTRY_ADDR(sbi, sum_entry, cur_segno);
e48e16f3e37fac Daeho Jeong    2026-01-10  1898  			if (type != GET_SUM_TYPE(sum_footer(sbi, sum))) {
7ee8bc3942f209 Daeho Jeong    2025-11-11  1899  				f2fs_err(sbi, "Inconsistent segment (%u) type "
98fd20b9cf472d Chao Yu        2026-06-15  1900  						"[%d, %d] in SIT and SSA",
7ee8bc3942f209 Daeho Jeong    2025-11-11  1901  						cur_segno, type,
e48e16f3e37fac Daeho Jeong    2026-01-10  1902  						GET_SUM_TYPE(
e48e16f3e37fac Daeho Jeong    2026-01-10  1903  						sum_footer(sbi, sum)));
a9cfee0ef98e99 Chao Yu        2022-09-28  1904  				f2fs_stop_checkpoint(sbi, false,
a9cfee0ef98e99 Chao Yu        2022-09-28  1905  						STOP_CP_REASON_CORRUPTED_SUMMARY);
7ee8bc3942f209 Daeho Jeong    2025-11-11  1906  				continue;
10d255c3540239 Chao Yu        2018-07-04  1907  			}
7bc0900347e069 Jaegeuk Kim    2012-11-02  1908  
9236cac5666ea8 Jaegeuk Kim    2015-05-28  1909  			/*
9236cac5666ea8 Jaegeuk Kim    2015-05-28  1910  			 * this is to avoid deadlock:
9236cac5666ea8 Jaegeuk Kim    2015-05-28  1911  			 *  - lock_page(sum_page)     - f2fs_replace_block
3d26fa6be3c487 Chao Yu        2017-10-30  1912  			 *   - check_valid_map()        - down_write(sentry_lock)
3d26fa6be3c487 Chao Yu        2017-10-30  1913  			 *    - down_read(sentry_lock) - change_curseg()
9236cac5666ea8 Jaegeuk Kim    2015-05-28  1914  			 *                               - lock_page(sum_page)
9236cac5666ea8 Jaegeuk Kim    2015-05-28  1915  			 */
718e53fa633f84 Chao Yu        2016-01-23  1916  			if (type == SUM_TYPE_NODE)
7ee8bc3942f209 Daeho Jeong    2025-11-11  1917  				submitted += gc_node_segment(sbi, sum->entries,
7ec199117c3254 Daeho Jeong    2025-12-30  1918  						cur_segno, gc_type, &plug);
48018b4cfd07dd Chao Yu        2018-09-13  1919  			else
7ee8bc3942f209 Daeho Jeong    2025-11-11  1920  				submitted += gc_data_segment(sbi, sum->entries,
7ee8bc3942f209 Daeho Jeong    2025-11-11  1921  						gc_list, cur_segno,
7ec199117c3254 Daeho Jeong    2025-12-30  1922  						gc_type, force_migrate, &plug);
c718379b6b0954 Jaegeuk Kim    2013-04-24  1923  
9bf1dcbdfdc889 Chao Yu        2023-08-08  1924  			stat_inc_gc_seg_count(sbi, data_type, gc_type);
07c6b5933ebf58 Daeho Jeong    2021-07-09  1925  			sbi->gc_reclaimed_segs[sbi->gc_mode]++;
8c7b9ac129d096 Jaegeuk Kim    2020-02-09  1926  			migrated++;
c56f16dab0dfc8 Chao Yu        2017-08-11  1927  
d6c66cd19ef322 Yunlong Song   2018-10-24  1928  freed:
c56f16dab0dfc8 Chao Yu        2017-08-11  1929  			if (gc_type == FG_GC &&
7ee8bc3942f209 Daeho Jeong    2025-11-11  1930  					get_valid_blocks(sbi, cur_segno, false) == 0)
c56f16dab0dfc8 Chao Yu        2017-08-11  1931  				seg_freed++;
e3080b0120a15e Chao Yu        2018-10-24  1932  
e219aecfd4b766 Yonggil Song   2022-11-22  1933  			if (__is_large_section(sbi))
e219aecfd4b766 Yonggil Song   2022-11-22  1934  				sbi->next_victim_seg[gc_type] =
7ee8bc3942f209 Daeho Jeong    2025-11-11  1935  					(cur_segno + 1 < sec_end_segno) ?
7ee8bc3942f209 Daeho Jeong    2025-11-11  1936  					cur_segno + 1 : NULL_SEGNO;
02d91398a602c3 Daeho Jeong    2026-03-16  1937  
02d91398a602c3 Daeho Jeong    2026-03-16  1938  			if (unlikely(freezing(current))) {
843ddf01eb4efc Chao Yu        2026-08-18  1939  				f2fs_put_cache(sum_entry, false);
843ddf01eb4efc Chao Yu        2026-08-18  1940  				f2fs_put_cache(sum_entry, false);
02d91398a602c3 Daeho Jeong    2026-03-16  1941  				goto stop;
02d91398a602c3 Daeho Jeong    2026-03-16  1942  			}
7ee8bc3942f209 Daeho Jeong    2025-11-11  1943  		}
7ee8bc3942f209 Daeho Jeong    2025-11-11  1944  next_block:
843ddf01eb4efc Chao Yu        2026-08-18  1945  		f2fs_put_cache(sum_entry, false);
843ddf01eb4efc Chao Yu        2026-08-18  1946  		f2fs_put_cache(sum_entry, false);
7ee8bc3942f209 Daeho Jeong    2025-11-11  1947  		segno = block_end_segno;
718e53fa633f84 Chao Yu        2016-01-23  1948  	}
718e53fa633f84 Chao Yu        2016-01-23  1949  
02d91398a602c3 Daeho Jeong    2026-03-16  1950  stop:
48018b4cfd07dd Chao Yu        2018-09-13  1951  	if (submitted)
9bf1dcbdfdc889 Chao Yu        2023-08-08  1952  		f2fs_submit_merged_write(sbi, data_type);
718e53fa633f84 Chao Yu        2016-01-23  1953  
718e53fa633f84 Chao Yu        2016-01-23  1954  	blk_finish_plug(&plug);
718e53fa633f84 Chao Yu        2016-01-23  1955  
9bf1dcbdfdc889 Chao Yu        2023-08-08  1956  	if (migrated)
9bf1dcbdfdc889 Chao Yu        2023-08-08  1957  		stat_inc_gc_sec_count(sbi, data_type, gc_type);
17d899df4678a1 Chao Yu        2016-02-22  1958  
c56f16dab0dfc8 Chao Yu        2017-08-11  1959  	return seg_freed;
7bc0900347e069 Jaegeuk Kim    2012-11-02  1960  }
7bc0900347e069 Jaegeuk Kim    2012-11-02  1961  

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.