fs/fs_struct.c
Source file repositories/reference/linux-study-clean/fs/fs_struct.c
File Facts
- System
- Linux kernel
- Corpus path
fs/fs_struct.c- Extension
.c- Size
- 3151 bytes
- Lines
- 156
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/export.hlinux/sched/signal.hlinux/sched/task.hlinux/fs.hlinux/path.hlinux/slab.hlinux/fs_struct.hlinux/init_task.hinternal.h
Detected Declarations
function set_fs_rootfunction set_fs_pwdfunction replace_pathfunction chroot_fs_refsfunction free_fs_structfunction exit_fsfunction unshare_fs_structexport unshare_fs_struct
Annotated Snippet
if (fs) {
int hits = 0;
write_seqlock(&fs->seq);
hits += replace_path(&fs->root, old_root, new_root);
hits += replace_path(&fs->pwd, old_root, new_root);
while (hits--) {
count++;
path_get(new_root);
}
write_sequnlock(&fs->seq);
}
task_unlock(p);
}
read_unlock(&tasklist_lock);
while (count--)
path_put(old_root);
}
void free_fs_struct(struct fs_struct *fs)
{
path_put(&fs->root);
path_put(&fs->pwd);
kmem_cache_free(fs_cachep, fs);
}
void exit_fs(struct task_struct *tsk)
{
struct fs_struct *fs = tsk->fs;
if (fs) {
int kill;
task_lock(tsk);
read_seqlock_excl(&fs->seq);
tsk->fs = NULL;
kill = !--fs->users;
read_sequnlock_excl(&fs->seq);
task_unlock(tsk);
if (kill)
free_fs_struct(fs);
}
}
struct fs_struct *copy_fs_struct(struct fs_struct *old)
{
struct fs_struct *fs = kmem_cache_alloc(fs_cachep, GFP_KERNEL);
/* We don't need to lock fs - think why ;-) */
if (fs) {
fs->users = 1;
fs->in_exec = 0;
seqlock_init(&fs->seq);
fs->umask = old->umask;
read_seqlock_excl(&old->seq);
fs->root = old->root;
path_get(&fs->root);
fs->pwd = old->pwd;
path_get(&fs->pwd);
read_sequnlock_excl(&old->seq);
}
return fs;
}
int unshare_fs_struct(void)
{
struct fs_struct *fs = current->fs;
struct fs_struct *new_fs = copy_fs_struct(fs);
int kill;
if (!new_fs)
return -ENOMEM;
task_lock(current);
read_seqlock_excl(&fs->seq);
kill = !--fs->users;
current->fs = new_fs;
read_sequnlock_excl(&fs->seq);
task_unlock(current);
if (kill)
free_fs_struct(fs);
return 0;
}
EXPORT_SYMBOL_GPL(unshare_fs_struct);
/* to be mentioned only in INIT_TASK */
struct fs_struct init_fs = {
.users = 1,
.seq = __SEQLOCK_UNLOCKED(init_fs.seq),
.umask = 0022,
Annotation
- Immediate include surface: `linux/export.h`, `linux/sched/signal.h`, `linux/sched/task.h`, `linux/fs.h`, `linux/path.h`, `linux/slab.h`, `linux/fs_struct.h`, `linux/init_task.h`.
- Detected declarations: `function set_fs_root`, `function set_fs_pwd`, `function replace_path`, `function chroot_fs_refs`, `function free_fs_struct`, `function exit_fs`, `function unshare_fs_struct`, `export unshare_fs_struct`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: integration implementation candidate.
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.