文件系统学习4 文件操作

来源:互联网 发布:网络犯罪调查 编辑:程序博客网 时间:2024/06/04 18:28

系统调用接口

const struct file_operations ext2_file_operations = {    .llseek     = generic_file_llseek,    .read       = do_sync_read,    .write      = do_sync_write,    .aio_read   = generic_file_aio_read,    .aio_write  = generic_file_aio_write,    .ioctl      = ext2_ioctl,    .mmap       = generic_file_mmap,    .open       = generic_file_open,    .release    = ext2_release_file,    .fsync      = ext2_sync_file,    .splice_read    = generic_file_splice_read,    .splice_write   = generic_file_splice_write,};

打开文件

asmlinkage long sys_open(const char __user *filename, int flags, int mode)    =>ret = do_sys_open(AT_FDCWD, filename, flags, mode);        =>fd = get_unused_fd_flags(flags);        =>struct file *f = do_filp_open(dfd, tmp, flags, mode);            =>error = open_namei(dfd, filename, namei_flags, mode, &nd);                =>if (!(flag & O_CREAT))                    ==>error = path_lookup_open(dfd, pathname, lookup_flags(flag), nd, flag);                        =>__path_lookup_intent_open(dfd, name, lookup_flags, nd, open_flags, 0);                            =>struct file *filp = get_empty_filp();                            =>nd->intent.open.file = filp;                            nd->intent.open.flags = open_flags;                            nd->intent.open.create_mode = create_mode;                            =>err = do_path_lookup(dfd, name, lookup_flags|LOOKUP_OPEN, nd);                                =>retval = path_walk(name, nd);                    ==>goto ok;                =>error = path_lookup_create(dfd,pathname,LOOKUP_PARENT,nd,flag,mode);//如果open带不存在则创建的话                =>error = open_namei_create(nd, &path, flag, mode);                    =>error = vfs_create(dir->d_inode, path->dentry, mode, nd);                        =>error = dir->i_op->create(dir, dentry, mode, nd);//inode方法                            =>static int ext2_create (struct inode * dir, struct dentry * dentry, int mode, struct nameidata *nd)                                =>struct inode * inode = ext2_new_inode (dir, mode);                                    =>inode = new_inode(sb);                                        =>inode = alloc_inode(sb);                                            =>inode = sb->s_op->alloc_inode(sb);//超级块方法                                                =>static struct inode *ext2_alloc_inode(struct super_block *sb)            =>nameidata_to_filp(&nd, flags);                =>filp = nd->intent.open.file;                =>if (filp->f_path.dentry == NULL)                    ==>filp = __dentry_open(nd->dentry, nd->mnt, flags, filp, NULL);                        =>f->f_flags = flags;                        =>f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE;                        =>inode = dentry->d_inode;                        =>f->f_mapping = inode->i_mapping;                        f->f_path.dentry = dentry;                        f->f_path.mnt = mnt;                        f->f_pos = 0;                        f->f_op = fops_get(inode->i_fop);                        file_move(f, &inode->i_sb->s_files);                        =>if (!open && f->f_op)                            ==>open = f->f_op->open;                        =>if (open)                            ==>error = open(inode, f);                        =>f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);                =>else                    ==>path_release(nd);

读取文件

asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)    =>file = fget_light(fd, &fput_needed);    =>loff_t pos = file_pos_read(file);//获取位置    =>ret = vfs_read(file, buf, count, &pos);        =>ret = file->f_op->read(file, buf, count, pos);            =>size_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)    =>file_pos_write(file, pos);//更新位置    =>fput_light(file, fput_needed);//释放文件对象

删除结点

Super.c (c:\linux\linux-2.6.23\fs\ext2):    .delete_inode   = ext2_delete_inode,void ext2_delete_inode (struct inode * inode)    =>truncate_inode_pages(&inode->i_data, 0);//释放磁盘页高速缓存        =>truncate_inode_pages_range(mapping, lstart, (loff_t)-1);            =>两个大的循环,第一个循环发现页没有lock和write_back的话立即释放;否则Pass            =>第二个循环收拾剩下的lock和write_back页    =>mark_inode_dirty(inode);        =>__mark_inode_dirty(inode, I_DIRTY);            =>inode->i_state |= flags;//设置dirty标志位            =>list_move(&inode->i_list, &sb->s_dirty);//把inode移到dirty链表    =>ext2_update_inode(inode, inode_needs_sync(inode));    =>if (inode->i_blocks)        ext2_truncate (inode);    =>ext2_free_inode (inode);
原创粉丝点击