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.

Dependency Surface

Detected Declarations

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

Implementation Notes