EXT4檔案系統學習(12)VFS之檔案系統物件file_system_type

王二車發表於2019-02-14

Linux支援各種不同的檔案系統,但是上層應用只需使用open(),read(),write()等系統呼叫就可以對磁碟檔案進行操作,而不需關心具體檔案系統的細節問題。為此提出了虛擬檔案系統VFS,作為中間層遮蔽了底層不同檔案系統之間的差異,向上提供統一的介面,虛擬檔案系統根據不同的檔案系統構造出超級塊,inode和direntry等,這些結構在VFS中是一致的。

檔案系統物件

每一個檔案系統驅動程式都有一個檔案系統物件,定義如下:

include/linux/fs.h

struct file_system_type {
	const char *name;檔案系統名稱
	int fs_flags;
#define FS_REQUIRES_DEV		1 
#define FS_BINARY_MOUNTDATA	2
#define FS_HAS_SUBTYPE		4
#define FS_USERNS_MOUNT		8	/* Can be mounted by userns root */
#define FS_USERNS_DEV_MOUNT	16 /* A userns mount does not imply MNT_NODEV */
#define FS_USERNS_VISIBLE	32	/* FS must already be visible */
#define FS_RENAME_DOES_D_MOVE	32768	/* FS will handle d_move() during rename() internally. */
	struct dentry *(*mount) (struct file_system_type *, int,
		       const char *, void *);掛載函式指標
	void (*kill_sb) (struct super_block *);釋放超級塊函式指標
	struct module *owner;
	struct file_system_type * next;
	struct hlist_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 s_writers_key[SB_FREEZE_LEVELS];

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

呼叫register_filesystem註冊時檔案系統物件,所以的檔案系統物件通過struct file_system_type * next指標連結成連結串列,全部結構體變數static struct file_system_type *file_systems指向連結串列的頭部。

register_filesystem在作用是把檔案系統物件加入到連結串列中且防止重複。

ext4的file_system_type結構體成員賦值如下:

static struct file_system_type ext4_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "ext4",
	.mount		= ext4_mount,
	.kill_sb	= kill_block_super,
	.fs_flags	= FS_REQUIRES_DEV,
};
MODULE_ALIAS_FS("ext4");

ext4檔案系統註冊:

fs/ext4/super.c
module_init(ext4_init_fs)
	register_as_ext3();開了巨集CONFIG_EXT4_USE_FOR_EXT23會相容ext3和ext2
	register_as_ext2();
	err = register_filesystem(&ext4_fs_type);

下一篇介紹VFS的超級塊。

 

相關文章