小型文件系统bfs分析(2)---支持的操作

来源:互联网 发布:英国博尔顿大学 知乎 编辑:程序博客网 时间:2024/04/30 15:15

支持的操作

通过浏览bfs_iget函数的如下代码,确定bfs只支持普通文件和目录两种文件类型。

    if (le32_to_cpu(di->i_vtype) == BFS_VDIR) {        inode->i_mode |= S_IFDIR;        inode->i_op = &bfs_dir_inops;        inode->i_fop = &bfs_dir_operations;    } else if (le32_to_cpu(di->i_vtype) == BFS_VREG) {        inode->i_mode |= S_IFREG;        inode->i_op = &bfs_file_inops;        inode->i_fop = &bfs_file_operations;        inode->i_mapping->a_ops = &bfs_aops;    }

普通文件

inode_operations

const struct inode_operations bfs_file_inops;

普通文件的inode_operations没有任何初始化,仅仅是定义了bfs_file_inops。对比minix fs

const struct inode_operations minix_file_inode_operations = {    .truncate   = minix_truncate,    .getattr    = minix_getattr,};

bfs无法对文件进行截断操作,以及获取文件的属性。实际发现可以进行截断操作,后续再看

file_operations

const struct file_operations bfs_file_operations = {    .llseek     = generic_file_llseek,    .read       = do_sync_read,    .aio_read   = generic_file_aio_read,    .write      = do_sync_write,    .aio_write  = generic_file_aio_write,    .mmap       = generic_file_mmap,    .splice_read    = generic_file_splice_read,};

这部分和minix fs完全一样,全都使用kernel的标准函数

address_space_operations

const struct address_space_operations bfs_aops = {    .readpage   = bfs_readpage,    .writepage  = bfs_writepage,    .sync_page  = block_sync_page,    .write_begin    = bfs_write_begin,    .write_end  = generic_write_end,    .bmap       = bfs_bmap,};

这部分和minix fs也差不多,实际上都是调用标准函数,只是给这些标准函数传递了bfs_get_block而已。

目录

inode_operations

const struct inode_operations bfs_dir_inops = {    .create         = bfs_create,    .lookup         = bfs_lookup,    .link           = bfs_link,    .unlink         = bfs_unlink,    .rename         = bfs_rename,};

可以看出bfs支持:

  • 创建文件
  • 路径查询
  • 硬链接
  • 删除文件
  • 文件重命名

对比minix fs

const struct inode_operations minix_dir_inode_operations = {    .create     = minix_create,    .lookup     = minix_lookup,    .link       = minix_link,    .unlink     = minix_unlink,    .symlink    = minix_symlink,    .mkdir      = minix_mkdir,    .rmdir      = minix_rmdir,    .mknod      = minix_mknod,    .rename     = minix_rename,    .getattr    = minix_getattr,};

发现bfs不能进行如下操作:

  • 创建符号链接
  • 创建目录
  • 删除目录
  • 创建设备节点
  • 获取目录属性
    实际上可以获取目录属性,之后再看。

file_operations

const struct file_operations bfs_dir_operations = {    .read       = generic_read_dir,    .readdir    = bfs_readdir,    .fsync      = file_fsync,    .llseek     = generic_file_llseek,};

和minix fs对比

const struct file_operations minix_dir_operations = {    .read       = generic_read_dir,    .readdir    = minix_readdir,    .fsync      = minix_sync_file,};

minix fs没有实现目录的llseek,这个操作目前还不清楚用途

0 0
原创粉丝点击