fs/f2fs/inline.c
Source file repositories/reference/linux-study-clean/fs/f2fs/inline.c
File Facts
- System
- Linux kernel
- Corpus path
fs/f2fs/inline.c- Extension
.c- Size
- 20811 bytes
- Lines
- 851
- 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/f2fs_fs.hlinux/fiemap.hf2fs.hnode.htrace/events/f2fs.h
Detected Declarations
function Copyrightfunction f2fs_may_inline_datafunction inode_has_blocksfunction f2fs_sanity_check_inline_datafunction f2fs_may_inline_dentryfunction f2fs_do_read_inline_datafunction f2fs_truncate_inline_inodefunction f2fs_read_inline_datafunction f2fs_convert_inline_foliofunction f2fs_convert_inline_inodefunction f2fs_write_inline_datafunction f2fs_recover_inline_datafunction f2fs_make_empty_inline_dirfunction f2fs_move_inline_direntsfunction f2fs_add_inline_entriesfunction f2fs_move_rehashed_direntsfunction do_convert_inline_dirfunction f2fs_try_convert_inline_dirfunction f2fs_add_inline_entryfunction f2fs_delete_inline_entryfunction f2fs_empty_inline_dirfunction f2fs_read_inline_dirfunction f2fs_inline_data_fiemap
Annotated Snippet
if (!test_bit_le(bit_pos, d.bitmap)) {
bit_pos++;
continue;
}
de = &d.dentry[bit_pos];
if (unlikely(!de->name_len)) {
bit_pos++;
continue;
}
/*
* We only need the disk_name and hash to move the dentry.
* We don't need the original or casefolded filenames.
*/
memset(&fname, 0, sizeof(fname));
fname.disk_name.name = d.filename[bit_pos];
fname.disk_name.len = le16_to_cpu(de->name_len);
fname.hash = de->hash_code;
ino = le32_to_cpu(de->ino);
fake_mode = fs_ftype_to_dtype(de->file_type) << S_DT_SHIFT;
err = f2fs_add_regular_entry(dir, &fname, NULL, ino, fake_mode);
if (err)
goto punch_dentry_pages;
bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
}
return 0;
punch_dentry_pages:
truncate_inode_pages(&dir->i_data, 0);
f2fs_truncate_blocks(dir, 0, false);
f2fs_remove_dirty_inode(dir);
return err;
}
static int f2fs_move_rehashed_dirents(struct inode *dir, struct folio *ifolio,
void *inline_dentry)
{
void *backup_dentry;
int err;
backup_dentry = f2fs_kmalloc(F2FS_I_SB(dir),
MAX_INLINE_DATA(dir), GFP_F2FS_ZERO);
if (!backup_dentry) {
f2fs_folio_put(ifolio, true);
return -ENOMEM;
}
memcpy(backup_dentry, inline_dentry, MAX_INLINE_DATA(dir));
f2fs_truncate_inline_inode(dir, ifolio, 0);
folio_unlock(ifolio);
err = f2fs_add_inline_entries(dir, backup_dentry);
if (err)
goto recover;
folio_lock(ifolio);
stat_dec_inline_dir(dir);
clear_inode_flag(dir, FI_INLINE_DENTRY);
/*
* should retrieve reserved space which was used to keep
* inline_dentry's structure for backward compatibility.
*/
if (!f2fs_sb_has_flexible_inline_xattr(F2FS_I_SB(dir)) &&
!f2fs_has_inline_xattr(dir))
F2FS_I(dir)->i_inline_xattr_size = 0;
kfree(backup_dentry);
return 0;
recover:
folio_lock(ifolio);
f2fs_folio_wait_writeback(ifolio, NODE, true, true);
memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA(dir));
f2fs_i_depth_write(dir, 0);
f2fs_i_size_write(dir, MAX_INLINE_DATA(dir));
folio_mark_dirty(ifolio);
f2fs_folio_put(ifolio, true);
kfree(backup_dentry);
return err;
}
static int do_convert_inline_dir(struct inode *dir, struct folio *ifolio,
void *inline_dentry)
Annotation
- Immediate include surface: `linux/fs.h`, `linux/f2fs_fs.h`, `linux/fiemap.h`, `f2fs.h`, `node.h`, `trace/events/f2fs.h`.
- Detected declarations: `function Copyright`, `function f2fs_may_inline_data`, `function inode_has_blocks`, `function f2fs_sanity_check_inline_data`, `function f2fs_may_inline_dentry`, `function f2fs_do_read_inline_data`, `function f2fs_truncate_inline_inode`, `function f2fs_read_inline_data`, `function f2fs_convert_inline_folio`, `function f2fs_convert_inline_inode`.
- 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.