Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2353383
  • 博文数量: 141
  • 博客积分: 3552
  • 博客等级: 中校
  • 技术积分: 4148
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-15 14:39
个人简介

熟悉Linux下程序设计及各种应用程序 熟悉C Language 熟悉Glusterfs、FFmpeg、CDN 系统设计,计算机图形系统设计、分布式程序设计 目前主要研究方向:流媒体

文章分类

全部博文(141)

分类: LINUX

2010-08-13 22:09:31

register_as_ext2();
    register_as_ext3();
    err = register_filesystem(&ext4_fs_type);

可以看出来注册了ext2,ext3,ext4
看一下注册的过程

56 /**
 57 * register_filesystem - register a new filesystem
 58 * @fs: the file system structure
 59 *
 60 * Adds the file system passed to the list of file systems the kernel
 61 * is aware of for mount and other syscalls. Returns 0 on success,
 62 * or a negative errno code on an error.
 63 *
 64 * The &struct file_system_type that is passed is linked into the kernel
 65 * structures and must not be freed until the file system has been
 66 * unregistered.
 67 */

 68
 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 *= fs;
 84 write_unlock(&file_systems_lock);
 85 return res;
 86 }
 87
 88 EXPORT_SYMBOL(register_filesystem);


在这里面调用了find_filesystem,先找一下看看是不是有同样的文件系统类型被使用了,这个就像银行卡号一样,不能重复,否则会出现自己存的钱被另一个人取走的可能,如果存在了文件系统就返回错误,如果没有存在就添加到支持的文件系统的列表里面,开始支持注册的文件系统,比如ext4
注册的ext4的文件系统的类型结构,这个在do_kernel_mount的时候会通过这个的name来查找fstype

static struct file_system_type ext4_fs_type = {
    
.owner = THIS_MODULE,
    
.name = "ext4",
    
.get_sb = ext4_get_sb,
    
.kill_sb = kill_block_super,
    
.fs_flags = FS_REQUIRES_DEV,
};

这里的ext4_get_sb是在do_kern_mount的时候调用到的,走一下流程

2122 SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *,dir_name,
2123 
char __user *, type, unsigned long, flags, void __user *,data)
2124 
{
2125 
int ret;
2126 
char *kernel_type;
2127 
char *kernel_dir;
2128 
char *kernel_dev;
2129 
unsigned long data_page;
2130
2131 ret 
= copy_mount_string(type, &kernel_type);
2132 
if (ret < 0)
2133 
goto out_type;
2134
2135 kernel_dir 
= getname(dir_name);
2136 
if (IS_ERR(kernel_dir)) {
2137 ret 
= PTR_ERR(kernel_dir);
2138 
goto out_dir;
2139 
}
2140
2141 ret 
= copy_mount_string(dev_name, &kernel_dev);
2142 
if (ret < 0)
2143 
goto out_dev;
2144
2145 ret 
= copy_mount_options(data, &data_page);
2146 
if (ret < 0)
2147 
goto out_data;
2148
2149 ret 
= do_mount(kernel_dev, kernel_dir, kernel_type, flags,
2150 
(void *) data_page);
2151
2152 free_page
(data_page);
2153 out_data
:
2154 kfree
(kernel_dev);
2155 out_dev
:
2156 putname
(kernel_dir);
2157 out_dir
:
2158 kfree
(kernel_type);
2159 out_type
:
2160 
return ret;
2161 
}

系统调用的mount,会走到这里,
阅读(4525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~