fs/f2fs/inode.c
Source file repositories/reference/linux-study-clean/fs/f2fs/inode.c
File Facts
- System
- Linux kernel
- Corpus path
fs/f2fs/inode.c- Extension
.c- Size
- 30551 bytes
- Lines
- 1067
- 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/writeback.hlinux/sched/mm.hlinux/lz4.hlinux/zstd.hf2fs.hnode.hsegment.hxattr.htrace/events/f2fs.h
Detected Declarations
function f2fs_mark_inode_dirty_syncfunction f2fs_set_inode_flagsfunction __get_inode_rdevfunction __set_inode_rdevfunction __recover_inline_statusfunction f2fs_enable_inode_chksumfunction f2fs_inode_chksumfunction f2fs_inode_chksum_verifyfunction f2fs_inode_chksum_setfunction sanity_check_compress_inodefunction SECTOR_TO_BLOCKfunction sanity_check_inodefunction init_idisk_timefunction do_read_inodefunction f2fs_has_inline_dentryfunction is_meta_inofunction S_ISFIFOfunction f2fs_update_inodefunction f2fs_update_inode_pagefunction f2fs_write_inodefunction f2fs_remove_donate_inodefunction iputfunction f2fs_truncatefunction f2fs_handle_failed_inode
Annotated Snippet
S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
if (addr[0])
inode->i_rdev = old_decode_dev(le32_to_cpu(addr[0]));
else
inode->i_rdev = new_decode_dev(le32_to_cpu(addr[1]));
}
}
static void __set_inode_rdev(struct inode *inode, struct folio *node_folio)
{
__le32 *addr = get_dnode_addr(inode, node_folio);
if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
if (old_valid_dev(inode->i_rdev)) {
addr[0] = cpu_to_le32(old_encode_dev(inode->i_rdev));
addr[1] = 0;
} else {
addr[0] = 0;
addr[1] = cpu_to_le32(new_encode_dev(inode->i_rdev));
addr[2] = 0;
}
}
}
static void __recover_inline_status(struct inode *inode, struct folio *ifolio)
{
void *inline_data = inline_data_addr(inode, ifolio);
__le32 *start = inline_data;
__le32 *end = start + MAX_INLINE_DATA(inode) / sizeof(__le32);
while (start < end) {
if (*start++) {
f2fs_folio_wait_writeback(ifolio, NODE, true, true);
set_inode_flag(inode, FI_DATA_EXIST);
set_raw_inline(inode, F2FS_INODE(ifolio));
folio_mark_dirty(ifolio);
return;
}
}
return;
}
static
bool f2fs_enable_inode_chksum(struct f2fs_sb_info *sbi, struct folio *folio)
{
struct f2fs_inode *ri = &F2FS_NODE(folio)->i;
if (!f2fs_sb_has_inode_chksum(sbi))
return false;
if (!IS_INODE(folio) || !(ri->i_inline & F2FS_EXTRA_ATTR))
return false;
if (!F2FS_FITS_IN_INODE(ri, le16_to_cpu(ri->i_extra_isize),
i_inode_checksum))
return false;
return true;
}
static __u32 f2fs_inode_chksum(struct f2fs_sb_info *sbi, struct folio *folio)
{
struct f2fs_node *node = F2FS_NODE(folio);
struct f2fs_inode *ri = &node->i;
__le32 ino = node->footer.ino;
__le32 gen = ri->i_generation;
__u32 chksum, chksum_seed;
__u32 dummy_cs = 0;
unsigned int offset = offsetof(struct f2fs_inode, i_inode_checksum);
unsigned int cs_size = sizeof(dummy_cs);
chksum = f2fs_chksum(sbi->s_chksum_seed, (__u8 *)&ino, sizeof(ino));
chksum_seed = f2fs_chksum(chksum, (__u8 *)&gen, sizeof(gen));
chksum = f2fs_chksum(chksum_seed, (__u8 *)ri, offset);
chksum = f2fs_chksum(chksum, (__u8 *)&dummy_cs, cs_size);
offset += cs_size;
chksum = f2fs_chksum(chksum, (__u8 *)ri + offset,
F2FS_BLKSIZE - offset);
return chksum;
}
bool f2fs_inode_chksum_verify(struct f2fs_sb_info *sbi, struct folio *folio)
{
struct f2fs_inode *ri;
__u32 provided, calculated;
if (unlikely(is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN)))
return true;
Annotation
- Immediate include surface: `linux/fs.h`, `linux/f2fs_fs.h`, `linux/writeback.h`, `linux/sched/mm.h`, `linux/lz4.h`, `linux/zstd.h`, `f2fs.h`, `node.h`.
- Detected declarations: `function f2fs_mark_inode_dirty_sync`, `function f2fs_set_inode_flags`, `function __get_inode_rdev`, `function __set_inode_rdev`, `function __recover_inline_status`, `function f2fs_enable_inode_chksum`, `function f2fs_inode_chksum`, `function f2fs_inode_chksum_verify`, `function f2fs_inode_chksum_set`, `function sanity_check_compress_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.