天天看點

檔案系統學習2 inode

硬連結的inode相同,dentry不同;軟連接配接的inode不同。

是以硬連結不可以跨越分區,而軟連接配接可以。

我們找檔案的本質是根據檔案的目錄屬性dentry找inode---->檔案内容

為索引節點配置設定空間
struct inode *ext2_alloc_inode(struct super_block *sb)
	=>struct inode *ext2_alloc_inode(struct super_block *sb)
		=>struct ext2_inode_info *ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL);
		=>return &ei->vfs_inode;//殼子是各種檔案系統,核心是虛函數結構
           
删除inode
.delete_inode	= ext2_delete_inode,
	=>truncate_inode_pages(&inode->i_data, 0);//0表示從頭開始删除
		//* Truncate the page cache, removing the pages that are between
		 //* specified offsets 删除磁盤頁高速緩存
		=>truncate_inode_pages_range(mapping, lstart, (loff_t)-1);
	=>mark_inode_dirty(inode);
	=>ext2_update_inode(inode, inode_needs_sync(inode));//最後的參數表示同步還是異步
	=>inode->i_size = 0;
	=>if (inode->i_blocks)
		ext2_truncate (inode);
	=>ext2_free_inode (inode);


這個函數在如下函數裡面調用
void generic_delete_inode(struct inode *inode)
	=>void (*delete)(struct inode *) = op->delete_inode;
	=>delete(inode);
           
從磁盤讀取inode填充VFS的Inode結構體
.read_inode	= ext2_read_inode
	=>void ext2_read_inode (struct inode * inode)
		=>struct ext2_inode * raw_inode = ext2_get_inode(inode->i_sb, ino, &bh);//從磁盤高速緩存擷取原始的具體檔案系統inode資訊,應該隐含有增加磁盤頁高速緩存引用計數增加的功能
		=>for (n = 0; n < EXT2_N_BLOCKS; n++)
			ei->i_data[n] = raw_inode->i_block[n];
		=>if (S_ISREG(inode->i_mode))
			inode->i_mapping->a_ops = &ext2_aops;
			inode->i_fop = &ext2_file_operations;
		=>else if (S_ISDIR(inode->i_mode))
			inode->i_op = &ext2_dir_inode_operations;
			inode->i_fop = &ext2_dir_operations;
			inode->i_mapping->a_ops = &ext2_aops;
		=>brelse (bh);//減少磁盤頁高速緩存的引用計數
		=>ext2_set_inode_flags(inode);//設定記憶體inode标記
           
.write_inode	= ext2_write_inode
	=>int ext2_write_inode(struct inode *inode, int wait)
		=>ext2_update_inode(inode, wait)
			=>struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh);//從磁盤頁高速緩存讀取原始節點
			=>raw_inode->i_mode = cpu_to_le16(inode->i_mode);//用記憶體的資訊重新整理原始節點結構體資訊
			......
			=>mark_buffer_dirty(bh);//設定髒标志位
			=>if (do_sync)//同步的話需要馬上重新整理磁盤頁高速緩存
				sync_dirty_buffer(bh);
			=>brelse (bh);
           

S_IFMT 0170000 檔案類型的位遮罩

S_IFSOCK 0140000 socket

S_IFLNK 0120000 符号連結(symbolic link)

S_IFREG 0100000 一般檔案

S_IFBLK 0060000 區塊裝置(block device)

S_IFDIR 0040000 目錄

S_IFCHR 0020000 字元裝置(character device)

S_IFIFO 0010000 先進先出(fifo)

S_ISUID 0004000 檔案的(set user-id on execution)位

S_ISGID 0002000 檔案的(set group-id on execution)位

S_ISVTX 0001000 檔案的sticky位

S_IRWXU 00700 檔案所有者的遮罩值(即所有權限值)

S_IRUSR 00400 檔案所有者具可讀取權限

S_IWUSR 00200 檔案所有者具可寫入權限

S_IXUSR 00100 檔案所有者具可執行權限

S_IRWXG 00070 使用者組的遮罩值(即所有權限值)

S_IRGRP 00040 使用者組具可讀取權限

S_IWGRP 00020 使用者組具可寫入權限

S_IXGRP 00010 使用者組具可執行權限

S_IRWXO 00007 其他使用者的遮罩值(即所有權限值)

S_IROTH 00004 其他使用者具可讀取權限

S_IWOTH 00002 其他使用者具可寫入權限

S_IXOTH 00001 其他使用者具可執行權限

摘自《Linux C 函數庫參考手冊》

參考

Linux的inode的了解

http://www.linuxidc.com/Linux/2014-09/106457.htm

ext2檔案系統之ext2_lookup函數源代碼分析

http://blog.csdn.net/sanwenyublog/article/details/50830957

柳大的Linux講義·基礎篇(2)Linux檔案系統的inode

http://blog.csdn.net/poechant/article/details/7214926

http://blog.csdn.net/shanshanpt/article/details/39059411

Linux檔案系統(四)—三大緩沖區之inode緩沖區 (記憶體inode映像 )

【linux】核心中根據inode得到檔案名

https://www.it610.com/article/4993393.htm

繼續閱讀