* [f2fs-dev] [bug report] f2fs: avoid reading already updated pages during GC
@ 2026-04-10 10:15 Dan Carpenter
0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2026-04-10 10:15 UTC (permalink / raw)
To: Jianan Huang; +Cc: linux-f2fs-devel
Hello Jianan Huang,
Commit 570e2ccc7cb3 ("f2fs: avoid reading already updated pages
during GC") from Mar 5, 2026 (linux-next), leads to the following
Smatch static checker warning:
fs/f2fs/gc.c:1291 ra_data_block()
warn: missing error code 'err'
fs/f2fs/gc.c
1220 static int ra_data_block(struct inode *inode, pgoff_t index)
1221 {
1222 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1223 struct address_space *mapping = f2fs_is_cow_file(inode) ?
1224 F2FS_I(inode)->atomic_inode->i_mapping : inode->i_mapping;
1225 struct dnode_of_data dn;
1226 struct folio *folio, *efolio;
1227 struct f2fs_io_info fio = {
1228 .sbi = sbi,
1229 .ino = inode->i_ino,
1230 .type = DATA,
1231 .temp = COLD,
1232 .op = REQ_OP_READ,
1233 .op_flags = 0,
1234 .encrypted_page = NULL,
1235 .in_list = 0,
1236 };
1237 int err = 0;
1238
1239 folio = f2fs_grab_cache_folio(mapping, index, true);
1240 if (IS_ERR(folio))
1241 return PTR_ERR(folio);
1242
1243 if (f2fs_lookup_read_extent_cache_block(inode, index,
1244 &dn.data_blkaddr)) {
1245 if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr,
1246 DATA_GENERIC_ENHANCE_READ))) {
1247 err = -EFSCORRUPTED;
1248 goto put_folio;
1249 }
1250 goto got_it;
1251 }
1252
1253 set_new_dnode(&dn, inode, NULL, NULL, 0);
1254 err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE);
1255 if (err)
1256 goto put_folio;
1257 f2fs_put_dnode(&dn);
1258
1259 if (!__is_valid_data_blkaddr(dn.data_blkaddr)) {
1260 err = -ENOENT;
1261 goto put_folio;
1262 }
1263 if (unlikely(!f2fs_is_valid_blkaddr(sbi, dn.data_blkaddr,
1264 DATA_GENERIC_ENHANCE))) {
1265 err = -EFSCORRUPTED;
1266 goto put_folio;
1267 }
1268 got_it:
1269 /* read folio */
1270 fio.folio = folio;
1271 fio.new_blkaddr = fio.old_blkaddr = dn.data_blkaddr;
1272
1273 /*
1274 * don't cache encrypted data into meta inode until previous dirty
1275 * data were writebacked to avoid racing between GC and flush.
1276 */
1277 f2fs_folio_wait_writeback(folio, DATA, true, true);
1278
1279 f2fs_wait_on_block_writeback(inode, dn.data_blkaddr);
1280
1281 efolio = f2fs_filemap_get_folio(META_MAPPING(sbi), dn.data_blkaddr,
1282 FGP_LOCK | FGP_CREAT, GFP_NOFS);
1283 if (IS_ERR(efolio)) {
1284 err = PTR_ERR(efolio);
1285 goto put_folio;
1286 }
1287
1288 fio.encrypted_page = &efolio->page;
1289
1290 if (folio_test_uptodate(efolio))
--> 1291 goto put_encrypted_page;
Should we set an error code here?
1292
1293 err = f2fs_submit_page_bio(&fio);
1294 if (err)
1295 goto put_encrypted_page;
1296 f2fs_put_page(fio.encrypted_page, false);
1297 f2fs_folio_put(folio, true);
1298
1299 f2fs_update_iostat(sbi, inode, FS_DATA_READ_IO, F2FS_BLKSIZE);
1300 f2fs_update_iostat(sbi, NULL, FS_GDATA_READ_IO, F2FS_BLKSIZE);
1301
1302 return 0;
1303 put_encrypted_page:
1304 f2fs_put_page(fio.encrypted_page, true);
1305 put_folio:
1306 f2fs_folio_put(folio, true);
1307 return err;
1308 }
This email is a free service from the Smatch-CI project [smatch.sf.net].
regards,
dan carpenter
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-04-10 10:15 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-10 10:15 [f2fs-dev] [bug report] f2fs: avoid reading already updated pages during GC Dan Carpenter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.