fs/f2fs/checkpoint.c
Source file repositories/reference/linux-study-clean/fs/f2fs/checkpoint.c
File Facts
- System
- Linux kernel
- Corpus path
fs/f2fs/checkpoint.c- Extension
.c- Size
- 55984 bytes
- Lines
- 2196
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/fs.hlinux/bio.hlinux/mpage.hlinux/writeback.hlinux/blkdev.hlinux/f2fs_fs.hlinux/folio_batch.hlinux/swap.hlinux/kthread.hlinux/delayacct.hlinux/ioprio.hlinux/math64.hf2fs.hnode.hsegment.hiostat.htrace/events/f2fs.h
Detected Declarations
function Copyrightfunction trace_lock_elapsed_time_startfunction trace_lock_elapsed_time_endfunction need_uplift_priorityfunction uplift_priorityfunction restore_priorityfunction f2fs_down_read_tracefunction f2fs_down_read_trylock_tracefunction f2fs_up_read_tracefunction f2fs_down_write_tracefunction f2fs_down_write_trylock_tracefunction f2fs_up_write_tracefunction f2fs_lock_opfunction f2fs_trylock_opfunction f2fs_unlock_opfunction f2fs_lock_allfunction f2fs_unlock_allfunction __is_bitmap_validfunction __f2fs_is_valid_blkaddrfunction f2fs_is_valid_blkaddrfunction f2fs_is_valid_blkaddr_rawfunction f2fs_ra_meta_pagesfunction f2fs_ra_meta_pages_condfunction __f2fs_write_meta_foliofunction f2fs_write_meta_pagesfunction f2fs_sync_meta_pagesfunction f2fs_dirty_meta_foliofunction __add_ino_entryfunction __remove_ino_entryfunction f2fs_add_ino_entryfunction f2fs_remove_ino_entryfunction f2fs_exist_written_datafunction f2fs_release_ino_entryfunction list_for_each_entry_safefunction f2fs_set_dirty_devicefunction f2fs_is_dirty_devicefunction f2fs_acquire_orphan_inodefunction f2fs_release_orphan_inodefunction f2fs_add_orphan_inodefunction f2fs_remove_orphan_inodefunction recover_orphan_inodefunction f2fs_recover_orphan_inodesfunction write_orphan_inodesfunction f2fs_checkpoint_chksumfunction get_checkpoint_versionfunction f2fs_get_valid_checkpointfunction __add_dirty_inodefunction __remove_dirty_inode
Annotated Snippet
switch (type) {
case META_NAT:
if (unlikely(blkno >=
NAT_BLOCK_OFFSET(NM_I(sbi)->max_nid)))
blkno = 0;
/* get nat block addr */
fio.new_blkaddr = current_nat_addr(sbi,
blkno * NAT_ENTRY_PER_BLOCK);
break;
case META_SIT:
if (unlikely(blkno >= TOTAL_SEGS(sbi)))
goto out;
/* get sit block addr */
fio.new_blkaddr = current_sit_addr(sbi,
blkno * SIT_ENTRY_PER_BLOCK);
break;
case META_SSA:
case META_CP:
case META_POR:
fio.new_blkaddr = blkno;
break;
default:
BUG();
}
folio = f2fs_grab_cache_folio(META_MAPPING(sbi),
fio.new_blkaddr, false);
if (IS_ERR(folio))
continue;
if (folio_test_uptodate(folio)) {
f2fs_folio_put(folio, true);
continue;
}
fio.folio = folio;
err = f2fs_submit_page_bio(&fio);
f2fs_folio_put(folio, err ? true : false);
if (!err)
f2fs_update_iostat(sbi, NULL, FS_META_READ_IO,
F2FS_BLKSIZE);
}
out:
blk_finish_plug(&plug);
return blkno - start;
}
void f2fs_ra_meta_pages_cond(struct f2fs_sb_info *sbi, pgoff_t index,
unsigned int ra_blocks)
{
struct folio *folio;
bool readahead = false;
if (ra_blocks == RECOVERY_MIN_RA_BLOCKS)
return;
folio = filemap_get_folio(META_MAPPING(sbi), index);
if (IS_ERR(folio) || !folio_test_uptodate(folio))
readahead = true;
f2fs_folio_put(folio, false);
if (readahead)
f2fs_ra_meta_pages(sbi, index, ra_blocks, META_POR, true);
}
static bool __f2fs_write_meta_folio(struct folio *folio,
struct writeback_control *wbc,
enum iostat_type io_type)
{
struct f2fs_sb_info *sbi = F2FS_F_SB(folio);
trace_f2fs_writepage(folio, META);
if (unlikely(f2fs_cp_error(sbi))) {
if (is_sbi_flag_set(sbi, SBI_IS_CLOSE)) {
folio_clear_uptodate(folio);
dec_page_count(sbi, F2FS_DIRTY_META);
folio_unlock(folio);
return true;
}
goto redirty_out;
}
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
goto redirty_out;
f2fs_do_write_meta_page(sbi, folio, io_type);
dec_page_count(sbi, F2FS_DIRTY_META);
folio_unlock(folio);
Annotation
- Immediate include surface: `linux/fs.h`, `linux/bio.h`, `linux/mpage.h`, `linux/writeback.h`, `linux/blkdev.h`, `linux/f2fs_fs.h`, `linux/folio_batch.h`, `linux/swap.h`.
- Detected declarations: `function Copyright`, `function trace_lock_elapsed_time_start`, `function trace_lock_elapsed_time_end`, `function need_uplift_priority`, `function uplift_priority`, `function restore_priority`, `function f2fs_down_read_trace`, `function f2fs_down_read_trylock_trace`, `function f2fs_up_read_trace`, `function f2fs_down_write_trace`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.