1. static const struct file_operations fuse_file_operations = {
    2. .llseek = fuse_file_llseek,
    3. .read_iter = fuse_file_read_iter,
    4. .write_iter = fuse_file_write_iter,
    5. .mmap = fuse_file_mmap,
    6. .open = fuse_open,
    7. .flush = fuse_flush,
    8. .release = fuse_release,
    9. .fsync = fuse_fsync,
    10. .lock = fuse_file_lock,
    11. .flock = fuse_file_flock,
    12. .splice_read = generic_file_splice_read,
    13. .unlocked_ioctl = fuse_file_ioctl,
    14. .compat_ioctl = fuse_file_compat_ioctl,
    15. .poll = fuse_file_poll,
    16. .fallocate = fuse_file_fallocate,
    17. };
    1. static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr)
    2. {
    3. inode->i_mode = attr->mode & S_IFMT;
    4. inode->i_size = attr->size;
    5. inode->i_mtime.tv_sec = attr->mtime;
    6. inode->i_mtime.tv_nsec = attr->mtimensec;
    7. inode->i_ctime.tv_sec = attr->ctime;
    8. inode->i_ctime.tv_nsec = attr->ctimensec;
    9. if (S_ISREG(inode->i_mode)) {
    10. fuse_init_common(inode);
    11. fuse_init_file_inode(inode);
    12. } else if (S_ISDIR(inode->i_mode))
    13. fuse_init_dir(inode);
    14. else if (S_ISLNK(inode->i_mode))
    15. fuse_init_symlink(inode);
    16. else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
    17. S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
    18. fuse_init_common(inode);
    19. init_special_inode(inode, inode->i_mode,
    20. new_decode_dev(attr->rdev));
    21. } else
    22. BUG();
    23. }

    USER Space

    static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file, struct fuse_copy_state *cs, size_t nbytes)
    

    fuse_do_work