fs/ntfs/inode.c
Source file repositories/reference/linux-study-clean/fs/ntfs/inode.c
File Facts
- System
- Linux kernel
- Corpus path
fs/ntfs/inode.c- Extension
.c- Size
- 111902 bytes
- Lines
- 3807
- 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/writeback.hlinux/seq_file.hlcnalloc.htime.hntfs.hindex.hattrlist.hreparse.hea.hattrib.hiomap.hobject_id.h
Detected Declarations
function Copyrightfunction ntfs_test_inodefunction inodefunction thefunction thefunction ntfs_free_big_inodefunction ntfs_non_resident_dealloc_clustersfunction evictfunction ntfs_drop_big_inodefunction ntfs_destroy_extent_inodefunction __ntfs_init_inodefunction ntfs_is_extended_system_filefunction ntfs_set_vfs_operationsfunction ntfs_read_locked_inodefunction ntfs_read_locked_attr_inodefunction ntfs_read_locked_index_inodefunction le16_to_cpufunction ntfs_index_entries_inconsistentfunction le16_to_cpufunction NInoSparsefunction load_attribute_list_mountfunction read_superfunction __ntfs_clear_inodefunction ntfs_clear_extent_inodefunction ntfs_delete_base_inodefunction ntfs_evict_big_inodefunction ntfs_show_optionsfunction ntfs_extend_initialized_sizefunction ntfs_truncate_vfsfunction ntfs_inode_sync_standard_informationfunction ntfs_inode_sync_filenamefunction ntfs_get_block_mft_recordfunction write_mft_recordfunction ntfs_inode_attach_all_extentsfunction ntfs_inode_add_attrlistfunction le32_to_cpufunction ntfs_inode_closefunction reallocfunction ntfs_destroy_ext_inodefunction ntfs_attr_positionfunction ntfs_inode_free_spacefunction ntfs_inode_attr_preadfunction ntfs_enlarge_attributefunction __ntfs_inode_resident_attr_pwritefunction __ntfs_inode_non_resident_attr_pwritefunction ntfs_inode_attr_pwrite
Annotated Snippet
if (IS_ERR(rl)) {
err = PTR_ERR(rl);
ntfs_error(sb,
"Failed to decompress runlist. Leaving inconsistent metadata.\n");
continue;
}
err = ntfs_cluster_free_from_rl(ni->vol, rl);
if (err)
ntfs_error(sb,
"Failed to free attribute clusters. Leaving inconsistent metadata.\n");
kvfree(rl);
}
}
ntfs_release_dirty_clusters(ni->vol, ni->i_dealloc_clusters);
ntfs_attr_put_search_ctx(actx);
return err;
}
int ntfs_drop_big_inode(struct inode *inode)
{
struct ntfs_inode *ni = NTFS_I(inode);
if (!inode_unhashed(inode) && inode_state_read_once(inode) & I_SYNC) {
if (ni->type == AT_DATA || ni->type == AT_INDEX_ALLOCATION) {
if (!inode->i_nlink) {
struct ntfs_inode *ni = NTFS_I(inode);
if (ni->data_size == 0)
return 0;
/* To avoid evict_inode call simultaneously */
atomic_inc(&inode->i_count);
spin_unlock(&inode->i_lock);
truncate_setsize(VFS_I(ni), 0);
ntfs_truncate_vfs(VFS_I(ni), 0, 1);
sb_start_intwrite(inode->i_sb);
i_size_write(inode, 0);
ni->allocated_size = ni->initialized_size = ni->data_size = 0;
truncate_inode_pages_final(inode->i_mapping);
sb_end_intwrite(inode->i_sb);
spin_lock(&inode->i_lock);
atomic_dec(&inode->i_count);
}
}
return 0;
}
return inode_generic_drop(inode);
}
static inline struct ntfs_inode *ntfs_alloc_extent_inode(void)
{
struct ntfs_inode *ni;
ntfs_debug("Entering.");
ni = kmem_cache_alloc(ntfs_inode_cache, GFP_NOFS);
if (likely(ni != NULL)) {
ni->state = 0;
return ni;
}
ntfs_error(NULL, "Allocation of NTFS inode structure failed.");
return NULL;
}
static void ntfs_destroy_extent_inode(struct ntfs_inode *ni)
{
ntfs_debug("Entering.");
if (!atomic_dec_and_test(&ni->count))
WARN_ON(1);
if (ni->folio)
folio_put(ni->folio);
kfree(ni->mrec);
kmem_cache_free(ntfs_inode_cache, ni);
}
static struct lock_class_key attr_inode_mrec_lock_class;
static struct lock_class_key attr_list_inode_mrec_lock_class;
/*
* The attribute runlist lock has separate locking rules from the
* normal runlist lock, so split the two lock-classes:
*/
static struct lock_class_key attr_list_rl_lock_class;
Annotation
- Immediate include surface: `linux/writeback.h`, `linux/seq_file.h`, `lcnalloc.h`, `time.h`, `ntfs.h`, `index.h`, `attrlist.h`, `reparse.h`.
- Detected declarations: `function Copyright`, `function ntfs_test_inode`, `function inode`, `function the`, `function the`, `function ntfs_free_big_inode`, `function ntfs_non_resident_dealloc_clusters`, `function evict`, `function ntfs_drop_big_inode`, `function ntfs_destroy_extent_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.