- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)