- 论坛徽章:
- 5
|
回复 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之类,只是辅助作用。理解对否? ==============>- 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
复制代码- 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; } ====================>- 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- 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没,这个是这个文件里的一个链首- 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的时候,就已经被调用了- 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行被执行了 |
|