文件系统-3-struct file结构
基于msm-5.4
一、struct file 定义
struct file { //fs.h union { struct llist_node fu_llist; struct rcu_head fu_rcuhead; } f_u; struct path f_path; struct inode *f_inode; const struct file_operations *f_op; spinlock_t f_lock; enum rw_hint f_write_hint; atomic_long_t f_count; unsigned int f_flags; fmode_t f_mode; struct mutex f_pos_lock; loff_t f_pos; struct fown_struct f_owner; const struct cred *f_cred; struct file_ra_state f_ra; u64 f_version; #ifdef CONFIG_SECURITY void *f_security; #endif void *private_data; #ifdef CONFIG_EPOLL struct list_head f_ep_links; struct list_head f_tfile_llink; #endif struct address_space *f_mapping; errseq_t f_wb_err; } __randomize_layout __attribute__((aligned(4))); /* 4字节对齐的 */
一个 struct file 结构表示一个打开的文件,若一个文件被多个进程打开,将会产生多个 struct file 结构。
二、成员解释
1. file->f_count
其赋值路径:
open_exec //exec.c __do_execve_file //exec.c do_open_execat //exec.c //fs和drivers下有大量调用路径 filp_open //open.c file_open_name //open.c SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) //open.c SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags, umode_t, mode) //open.c COMPAT_SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) //open.c COMPAT_SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags, umode_t, mode) //open.c do_sys_open //open.c do_filp_open //namei.c do_file_open_root //namei.c path_openat //namei.c alloc_file_pseudo //file_table.c alloc_file_clone //file_table.c alloc_file //file_table.c file_clone_open //fs.h do_mq_open //mqueue.c open_detached_copy //namespace.c SYSCALL_DEFINE3(open_tree, int, dfd, const char *, filename, unsigned, flags) //namespace.c SYSCALL_DEFINE3(fsmount, int, fs_fd, unsigned int, flags, unsigned int, attr_flags) //namespace.c __nfsd_open //nfs.c dentry_open //open.c alloc_empty_file //file_table.c alloc_empty_file_noaccount __alloc_file //file_table.c 分配一个struct file结构并将其 f_count 初始化为1 atomic_long_set(&f->f_count, 1); //各子系统中大量调用 fput(*file) //传参 refs=1 io_file_put //io_uring.c fput_many(*file, refs) //file_table.c 若减为0了则延迟释放struct file结构 atomic_long_sub_and_test(refs, &file->f_count) dma_buf_put_sync dma-buf.c close_work //acct.c __fput_sync(*file) //file_table.c 若减为0了则延迟释放struct file结构 atomic_long_dec_and_test(&file->f_count) //各子系统中大量调用 get_file(struct file *f) //fs.h atomic_long_inc(&f->f_count);
可以看到,只要是open()一个文件节点,创建一个 struct file 结构时就对 f->f_count 初始化为1了。并使用 f->f_count 控制 struct file 的生命周期,当 f->f_count 计数减为0时,struct file 结构将会被释放。
注:只是部分调用路径。
还有通过fd进行计数的:
ep_loop_check_proc //eventpoll.c get_mm_exe_file //fork.c get_file_rcu(x) fget(fd) //file.c 传参 refs=1 __fget //file.c __fget_files_rcu //file.c get_file_rcu_many(x, cnt) //fs.h atomic_long_add_unless(&(x)->f_count, (cnt), 0) // if(f->f_count != 0) f->f_count++;
通常用法 file = fget(fd); 使用完后 fput(file);
posted on 2024-09-04 15:37 Hello-World3 阅读(37) 评论(0) 编辑 收藏 举报