文件系统-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编辑  收藏  举报

导航