Yaffs通过VFS层的读写.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Yaffs通过VFS层的读写

Yaffs通过VFS层的读写 Mournjust(sev7ncolor@) 在看过dreamice的《yaffs文件系统分析》之后,总是感到意犹未尽,还不够深入,所以先结合自己了解的一些知识继续写下去。 Yaffs文件系统最终是通过VFS层接口被调用的,所以yaffs必须给VFS层提供相应的接口。VFS提供的标准接口结构是inode和dentry结构,也就是说不管最终yaffs是如何实现的,提供给VFS层的必须是inode和dentry结构。 在yaffs中,函数yaffs_fill_inode_from_obj用于根据yaffs的结构体yaffs_obj来填充inode结构体,以便于VFS层使用。 static void yaffs_fill_inode_from_obj(struct inode *inode, struct yaffs_obj *obj) { switch (obj-yst_mode S_IFMT) { default: /* fifo, device or socket */ init_special_inode(inode, obj-yst_mode, old_decode_dev(obj-yst_rdev)); break; case S_IFREG: /* file */ inode-i_op = yaffs_file_inode_operations; inode-i_fop = yaffs_file_operations; inode-i_mapping-a_ops = yaffs_file_address_operations; break; case S_IFDIR: /* directory */ inode-i_op = yaffs_dir_inode_operations; inode-i_fop = yaffs_dir_operations; break; case S_IFLNK: /* symlink */ inode-i_op = yaffs_symlink_inode_operations; break; } } 其中obj-yst_mode 用于表示yaffs_obj指代的object是具体文件、目录、symlink,以及hardlink等等。对于不同类型的object,显然处理的方法是不一样。 首先需要关注的是关于VFS的缓冲页的操作结构体: static struct address_space_operations yaffs_file_address_operations = { .readpage = yaffs_readpage, .writepage = yaffs_writepage, #if (YAFFS_USE_WRITE_BEGIN_END 0) .write_begin = yaffs_write_begin, .write_end = yaffs_write_end, #else .prepare_write = yaffs_prepare_write, .commit_write = yaffs_commit_write, #endif}; 因为内核版本的更新,原版本的prepare_write和commit_write函数被write_begin和write_end函数所代替,这儿为了保持yaffs的可移植性,采用了一个条件编译。 其中write_begin函数主要调用grab_cache_page_write_begin在radix树里面查找要被写的page,如果不存在则创建一个。如果被写入的设备是一个块设备的话,调用__block_prepare_write为这个page准备一组buffer_head结构,用于描述组成这个page的数据块 。 write_end主要用于将被写入的page标记为脏,后台进程pdflush会寻找这些脏页,并将数据写入设备中去。如果被写入的设备是块设备的话,还需要将相应的buffer-head标记为脏。 static int yaffs_write_begin(struct file *filp, struct address_space *mapping, loff_t pos, unsigned len, unsigned flags, struct page **pagep, void **fsdata) { struct page *pg = NULL; pgoff_t index = pos PAGE_CACHE_SHIFT; int ret = 0; i

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档