ファイルシステム--登録


登録されたファイルシステムごとにfile_というタイプが使用されます.system_typeのオブジェクトを表す:
struct file_system_type {
	const char *name;/*   */
	int fs_flags;	 /*   */
	int (*get_sb) (struct file_system_type *, int,  /*   */
		       const char *, void *, struct vfsmount *);
	void (*kill_sb) (struct super_block *);	/*   */
	struct module *owner;			 /*   */
	struct file_system_type * next;  /*   */
	struct list_head fs_supers;	 /*   */

	struct lock_class_key s_lock_key;
	struct lock_class_key s_umount_key;
	struct lock_class_key s_vfs_rename_key;

	struct lock_class_key i_lock_key;
	struct lock_class_key i_mutex_key;
	struct lock_class_key i_mutex_dir_key;
	struct lock_class_key i_alloc_sem_key;
};

fs_flageは次の値をとることができます.
FS_REQUIRES_DEV: 
FS_BINARY_MOUNTDATA: 
FS_REVAL_DOT: “.” “..” ( )
FS_ODD_RENAME:“ ” “ ”

ファイルシステムの登録は関数register_を通じてfilesystem完了:
int register_filesystem(struct file_system_type * fs)
{
	int res = 0;
	struct file_system_type ** p;

	BUG_ON(strchr(fs->name, '.'));
	if (fs->next)
		return -EBUSY;
	INIT_LIST_HEAD(&fs->fs_supers);// 
	write_lock(&file_systems_lock);
	p = find_filesystem(fs->name, strlen(fs->name));
	if (*p)// ?
		res = -EBUSY;
	else
		*p = fs;//*p NULL,   
	write_unlock(&file_systems_lock);
	return res;
}

この関数は、まずファイルシステムが登録されているかどうかを検索し、登録されている場合はエラーを返します.ここで2次ポインタを定義しますfind_を見てくださいfilesystem
static struct file_system_type **find_filesystem(const char *name, unsigned len)
{
	struct file_system_type **p;
	for (p=&file_systems; *p; p=&(*p)->next)
		if (strlen((*p)->name) == len &&
		    strncmp((*p)->name, name, len) == 0)
			break;
	return p;
}

ここでpも二次ポインタであり、*pは次のファイルシステムを表し、ここでは二次ポインタが返され、register_filesystemが*pに値を付与すると、この登録するファイルシステムをfile_に追加します.Systemsのチェーンテーブルの末尾.