文件系统学习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);
阅读全文
0 0
- 文件系统学习4 文件操作
- 【Linux学习】Linux文件系统3—文件操作命令
- Linux学习第二天-文件系统和简单文件操作命令
- linux驱动学习--第七天:第五章 Linux 文件系统与设备文件系统 之 linux文件操作
- 文件系统开发--文件流操作
- Day1-文件系统及文件操作
- php学习基础-文件系统(二) 文件读写操作、文件资源处理
- php学习基础-文件系统(三) 文件夹的相关操作、php文件上传、php文件下载
- Linux 的文件系统以及文件操作
- 文件操作(文件系统设计项目总结)
- 详解ios文件系统文件目录读写操作
- 详解ios文件系统文件目录读写操作
- 实现简单文件系统文件相关操作
- android 文件系统操作 文件读取与写入
- 常用的文件系统操作命令--文件命令
- nodejs-操作文件系统读取写入文件
- php操作服务器文件系统中的文件内容
- Linux学习记录--文件系统简单操作
- Meta Learning/Learning to learn
- EMS开发教程概述
- MS coco数据集下载
- Android系统架构
- C++ 模板(3) 模板的特化
- 文件系统学习4 文件操作
- JDK的下载和安装
- 大数据正式16
- mysql事务
- iOS 异步图片加载优化与常用开源库分析
- SpringBoot简单入门(二)
- 怎么查看linux系统的版本,以及是32位或64位系统
- Python的列表操作List
- firewall--Centos7中的防火墙管理