mapping 關係

linux中i_rdev i_bdev i_mapping 關係

i_bdev只有塊設備文件系統的inode會設置該屬性,對應的是塊設備的數據結構

i_rdev 通過mknod創建的inode都會指定設備號

一個塊設備可以通過mknod創建多個具有相同i_rdev的inode,那麼在訪問這些inode的時候,具體對應的塊設備是i_bdev指定的,這和普通的文件系統是不一樣的,普通文件系統只使用sb中記錄的s_bdev。所有使用相同設備號創建的inode的i_mapping屬性都是相同的,他們等於inode->i_mapping = bdev->bd_inode->i_mapping。inode的i_bdev開始可能是空的,在blkdev_open函數中會調用bd_acquire函數,這裡面會根據i_rdev值調用bdget函數,該函數會調用iget5_locked在塊文件系統的超級塊blockdev_superblock中查找對應的inode,獲取bdev_inode的bdev屬性,並設置inode的bdev

blkdev_get_block 和普通文件系統,例如ext2_get_block

blkdev_get_block 把bh->b_bdev 設置為inode對應的i_bdev, 而其他文件系統則使用map_bh, 把bh的b_bdev設置為sb的s_bdev,在最後調用submit_bid的時候會根據b_bdev獲取設備的request_queue

在執行echo u > /proc/sysrq-trigger時執行remount_ro將系統中已經掛載的文件系統設置為只讀,但在選取要設置的文件系統時有一個判斷條件s_bdev是否為空,如果為空那麼不設置該文件系統為只讀,而網路文件系統nfs的s_bdev是為NULL的,所以這個操作對它們是無效的。

super_block的s_bdev是在mount時指定的,mount會分為兩個分支mount_noblk和mount_blk,mount_noblk每次都指定的dev指針為空,所以每次都是創建新的super_block對象,而mount_blk會根據指定的dev,這個dev也是根據path查找的,查找的過程中會根據holder屬性判斷,是否有其他文件系統類型已經佔用該dev了,這個是在全局鏈表上進行的,先進行查找看是否已經創建了和該dev關聯的super_block對象,如果還沒有則創建super_block對象,並把它加入到file_system_type對象的成員鏈表中,如果查找和該dev關聯的super_block對象,則引用加一,並使用該super_block對象,因此同一個設備多次mount使用的是同一個super_block

如何分配唯一的ID,並且可以服用,可以參看idr和ida模塊

fuse有兩種類型的文件系統fuseblk和fuse,fuseblk文件系統需要指定device,而fuse類型不需要,但是使用fuse類型時bmap接口應該是不能使用的。

塊文件系統和普通文件系統共用塊緩存,buffer_head, buffer_head都有指針只想pagecache中的page


分享到:


相關文章: