免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1592 | 回复: 5
打印 上一主题 下一主题

[文件系统] super.c里的几个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-14 13:39 |只看该作者 |倒序浏览
看文件系统的code时,以下几个问题,请大家指点:
1)        结构体
  static struct file_system_type ext3_fs_type = {
          .owner          = THIS_MODULE,
          .name           = "ext3",
          .get_sb         = ext3_get_sb,
          .kill_sb        = kill_block_super,
          .fs_flags       = FS_REQUIRES_DEV,
  };
前面只所以用.来表示,这是编译器的一个特性,为了和file_system_type的内部定义的变量对应,因为file_system_type定义的变量要比这个地方多不少。前边的.name之类,只是辅助作用。理解对否?

2)
register_filesystem(&ext3_fs_type);
注册这个文件系统后,如果在注册一个register_filesystem(&ext2_fs_type),没看到有全局变量让所有的文件系统串起来,再说这个ext3_fs_type还是一个static类型,即只能在本文件内访问,那跨文件系统是怎么实现的呢?
  int register_filesystem(struct file_system_type * fs)
  {
          int res = 0;
          struct file_system_type ** p;

          if (fs->next)
                  return -EBUSY;
          INIT_LIST_HEAD(&fs->fs_supers);
          write_lock(&file_systems_lock);
          p = find_filesystem(fs->name);
          if (*p)
                  res = -EBUSY;
          else
                  *p = fs;
          write_unlock(&file_systems_lock);
          return res;
  }

-3)
在结构体中定义了 .get_sb = ext3_get_sb,
可是在super.c文件中没看到对调用这个函数的地方,那定义了这个函数,应该怎么用呢?
另外这个函数也是static的,即只能在本文件内访问。

论坛徽章:
0
2 [报告]
发表于 2012-07-15 15:10 |只看该作者
没人给说道说道?

论坛徽章:
0
3 [报告]
发表于 2012-07-16 08:36 |只看该作者
1)不懂,同问!
2)注册文件系统时将file_system_type放在以file_systems为表头的一个链表中,不太明白你说的跨文件系统是什么意思呢?
3)get_sb一般不会是实际的文件系统调用的,而是在上层vfs调用的,类似file_system_type->get_sb(……),具体的你可以看vfs_kern_mount函数(namespace.c)

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
4 [报告]
发表于 2012-07-16 09:53 |只看该作者
回复 1# 怪怪虎


    看文件系统的code时,以下几个问题,请大家指点: 1) 结构体 static struct file_system_type ext3_fs_type = { .owner = THIS_MODULE, .name = \"ext3\", .get_sb = ext3_get_sb, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; 前面只所以用.来表示,这是编译器的一个特性,为了和file_system_type的内部定义的变量对应,因为file_system_type定义的变量要比这个地方多不少。前边的.name之类,只是辅助作用。理解对否? ==============>
  1. cat /proc/filesystems nodev sysfs nodev rootfs nodev bdev nodev proc nodev cgroup nodev cpuset nodev tmpfs nodev devtmpfs nodev binfmt_misc nodev debugfs nodev securityfs nodev sockfs nodev usbfs nodev pipefs nodev anon_inodefs nodev inotifyfs nodev devpts nodev ramfs nodev hugetlbfs iso9660 nodev mqueue ext4 nodev rpc_pipefs nodev fuse fuseblk nodev fusectl
复制代码
  1. 1961 struct vfsmount * 1962 do_kern_mount(const char *fstype, int flags, const char *name, void *data) 1963 { 1964 struct file_system_type *type = get_fs_type(fstype); 1965 struct vfsmount *mnt; 1966 if (!type) 1967 return ERR_PTR(-ENODEV); 1968 mnt = vfs_kern_mount(type, flags, name, data); 1969 if (!IS_ERR(mnt) && (type->fs_flags & FS_HAS_SUBTYPE) && 1970 !mnt->mnt_sb->s_subtype) 1971 mnt = fs_set_subtype(mnt, fstype); 1972 put_filesystem(type); 1973 return mnt; 1974 }
复制代码
主要是通过get_fs_type来获得的文件系统类型,这个是在vfs里面做的,file_system_type主要是在vfs里面来将具体的磁盘fs挂载到vfs的file_system_type链上,你说的那个.name。方便fstype记录 2) register_filesystem(&ext3_fs_type); 注册这个文件系统后,如果在注册一个register_filesystem(&ext2_fs_type),没看到有全局变量让所有的文件系统串起来,再说这个ext3_fs_type还是一个static类型,即只能在本文件内访问,那跨文件系统是怎么实现的呢? int register_filesystem(struct file_system_type * fs) { int res = 0; struct file_system_type ** p; if (fs->next) return -EBUSY; INIT_LIST_HEAD(&fs->fs_supers); write_lock(&file_systems_lock); p = find_filesystem(fs->name); if (*p) res = -EBUSY; else *p = fs; write_unlock(&file_systems_lock); return res; } ====================>
  1. 69 int register_filesystem(struct file_system_type * fs) 70 { 71 int res = 0; 72 struct file_system_type ** p; 73 74 BUG_ON(strchr(fs->name, \'.\')); 75 if (fs->next) 76 return -EBUSY; 77 INIT_LIST_HEAD(&fs->fs_supers); 78 write_lock(&file_systems_lock); 79 p = find_filesystem(fs->name, strlen(fs->name)); 80 if (*p) 81 res = -EBUSY; 82 else 83 *p = fs; 84 write_unlock(&file_systems_lock); 85 return res; 86 }
复制代码
你只要在稍微深入一点就看到将文件系统串联起来的链了,进入fine_filesystem
  1. 46 static struct file_system_type **find_filesystem(const char *name, unsigned len) 47 { 48 struct file_system_type **p; 49 for (p=&file_systems; *p; p=&(*p)->next) 50 if (strlen((*p)->name) == len && 51 strncmp((*p)->name, name, len) == 0) 52 break; 53 return p; 54 }
复制代码
看到了file_system没,这个是这个文件里的一个链首
  1. 32 static struct file_system_type *file_systems;
复制代码
跨文件系统的话,你可以看看do_mount,里面有kern_path,里面忽悠walk相关的操作 -3)在结构体中定义了 .get_sb = ext3_get_sb, 可是在super.c文件中没看到对调用这个函数的地方,那定义了这个函数,应该怎么用呢?另外这个函数也是static的,即只能在本文件内访问。 这个static是你的ext3的module里的,但是里面有一个被注册在file_system链上的.get_sb 这个.get_sb,在mount的时候,就已经被调用了
  1. 1074 struct dentry * 1075 mount_fs(struct file_system_type *type, int flags, const char *name, void *data) 1076 { 1077 struct dentry *root; 1078 struct super_block *sb; 1079 char *secdata = NULL; 1080 int error = -ENOMEM; ................... 1091 1092 root = type->mount(type, flags, name, data); 1093 if (IS_ERR(root)) { 1094 error = PTR_ERR(root); 1095 goto out_free_secdata; 1096 } 1097 sb = root->d_sb; .........
复制代码
我这个代码比较新,不是get_sb了,是mount了,通过之前的.name,找到对挺的type,然后type就是你之前注册到文件系统链上的fs,里面的get_sb,我这里是mount,就在这个1092行被执行了

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
5 [报告]
发表于 2012-07-16 09:54 |只看该作者
看上去有点乱。。。。。
刚才数据库出错了,结果就这样了……

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
6 [报告]
发表于 2012-07-16 15:20 |只看该作者
顶4楼!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP