12. Mount Flow
memory
ext4@storage
*. 建 mount
*. 建 sb/sbi, 根據讀入的 es 設定
*. 為 sb 安裝 sops
*. 載入 journal
ext4m
s sop
s i i i i i i
root journal
journal
i i
13. Mount Flow
memory
ext4@storage
*. 建 mount
*. 建 sb/sbi, 根據讀入的 es 設定
*. 為 sb 安裝 sops
*. 載入 journal
*. 建 root inode/dentry
fop
iopi
d “/”
ext4m
s sop
s i i i i i i
root journal
journal
i i
14. Mount Flow
memory
ext4@storage
*. 建 mount
*. 建 sb/sbi, 根據讀入的 es 設定
*. 為 sb 安裝 sops
*. 載入 journal
*. 建 root inode/dentry
*. 串入 parent mount
s i i i i i i
root journal
journal
i i
fopiopi
“/”d
rootfsm
fopiopi
d “aaa”
ext4m
fopiopi
d “/”
22. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi
d “Desktop”
s sop
23. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_lookup
d “Desktop”
s sop
24. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
*. 執行 dir(pi) 自帶 ext4_mkdir
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_lookup
d “Desktop”
s sop
ext4_mkdir
25. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
*. 執行 dir(pi) 自帶 ext4_mkdir
+. 執行 sb 自帶 ext4_alloc_inode
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_lookup
i
d “Desktop”
s sop ext4_alloc_inode
ext4_mkdir
26. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
*. 執行 dir(pi) 自帶 ext4_mkdir
+. 執行 sb 自帶 ext4_alloc_inode
+. 為 inode 安裝 fop/iop
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_lookup
fop
iopi
d “Desktop”
s sop ext4_alloc_inode
ext4_mkdir
27. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
*. 執行 dir(pi) 自帶 ext4_mkdir
+. 執行 sb 自帶 ext4_alloc_inode
+. 為 inode 安裝 fop/iop
+. 準備 Desktop/ 內容
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
dirent dirent
Desktop
d “pi”
fop
iopi ext4_lookup
fop
iopi
d “Desktop”
s sop ext4_alloc_inode
ext4_mkdir
28. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
*. 執行 dir(pi) 自帶 ext4_mkdir
+. 執行 sb 自帶 ext4_alloc_inode
+. 為 inode 安裝 fop/iop
+. 準備 Desktop/ 內容
+. 加入 pi/
memory
ext4@storage
s i
pi
dirent dirent
dirent dirent
dirent dirent
pi
Desktop
dirent dirent
Desktop
d “pi”
fop
iopi ext4_lookup
fop
iopi
d “Desktop”
s sop ext4_alloc_inode
ext4_mkdir
29. Operations(mkdir)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
*. 執行 dir(pi) 自帶 ext4_mkdir
+. 執行 sb 自帶 ext4_alloc_inode
+. 為 inode 安裝 fop/iop
+. 準備 Desktop/ 內容
+. 加入 pi/
+. 關連 dentry & inode
memory
ext4@storage
s i
pi
dirent dirent
dirent dirent
dirent dirent
pi
Desktop
dirent dirent
Desktop
d “pi”
fop
iopi ext4_lookup
fop
iopi
d “Desktop”
s sop ext4_alloc_inode
ext4_mkdir
30. Operations(touch)
e.g. /home/pi/Desktop
*. 在 table 找無 , 新建 dentry
*. 執行 dir(pi) 自帶 ext4_lookup, 找無
*. 執行 dir(pi) 自帶 ext4_create
+. 執行 sb 自帶 ext4_alloc_inode
+. 為 inode 安裝 fop/iop/aop
+. 準備 Desktop/ 內容
+. 加入 pi/
+. 關連 dentry & inode
*. open & release
memory
ext4@storage
s i
pi
dirent dirent
dirent dirent
dirent dirent
pi
Desktop
dirent dirent
Desktop
d “pi”
fop
iopi ext4_lookup
iopi
d “Desktop”
s sop ext4_alloc_inode
ext4_mkdir
aop fop
ext4_file_open
ext4_release_file
32. fop
Operations(rm/rmdir)
e.g. /home/pi/Desktop
*. 執行 dir(pi) 自帶 unlink 或 rmdir
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_unlink
iopi
d “Desktop”
s sop
ext4_rmdir
dirent dirent
dirent
33. fop
Operations(rm/rmdir)
e.g. /home/pi/Desktop
*. 執行 dir(pi) 自帶 unlink 或 rmdir
+. 從 dir(pi) 移除 de(Desktop)
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_unlink
iopi
d “Desktop”
s sop
ext4_rmdir
dirent dirent
34. fop
Operations(rm/rmdir)
e.g. /home/pi/Desktop
*. 執行 dir(pi) 自帶 unlink 或 rmdir
+. 從 dir(pi) 移除 de(Desktop)
*. 執行 sb 自帶 ext4_evict_inode
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_unlink
iopi
d “Desktop”
s sop ext4_evict_inode
ext4_rmdir
dirent dirent
35. fop
Operations(rm/rmdir)
e.g. /home/pi/Desktop
*. 執行 dir(pi) 自帶 unlink 或 rmdir
+. 從 dir(pi) 移除 de(Desktop)
*. 執行 sb 自帶 ext4_evict_inode
+. 歸還 ext4 inode 的 data block
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_unlink
iopi
d “Desktop”
s sop ext4_evict_inode
ext4_rmdir
36. fop
Operations(rm/rmdir)
e.g. /home/pi/Desktop
*. 執行 dir(pi) 自帶 unlink 或 rmdir
+. 從 dir(pi) 移除 de(Desktop)
*. 執行 sb 自帶 ext4_evict_inode
+. 歸還 ext4 inode 的 data block
+. 歸還 ext4 inode 本身
memory
ext4@storage
s
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
d “pi”
fop
iopi ext4_unlink
iopi
d “Desktop”
s sop ext4_evict_inode
ext4_rmdir
37. fop
Journal
e.g. /home/pi/Desktop
*. 執行 dir(pi) 自帶 unlink 或 rmdir
+. 從 dir(pi) 移除 de(Desktop)
*. 執行 sb 自帶 ext4_evict_inode
+. 歸還 ext4 inode 的 data block
+. 歸還 ext4 inode 本身
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_unlink
iopi
d “Desktop”
s sop ext4_evict_inode
ext4_rmdir
abcde
o
x
未歸還 block/inode 造成 storage leak
38. fop
Journal
e.g. /home/pi/Desktop
*. 執行 dir(pi) 自帶 unlink 或 rmdir
+. 從 dir(pi) 移除 de(Desktop)
*. 執行 sb 自帶 ext4_evict_inode
+. 歸還 ext4 inode 的 data block
+. 歸還 ext4 inode 本身
memory
ext4@storage
s i
pi
dirent dirent
dirent
dirent dirent
pi
Desktop
Desktop
d “pi”
fop
iopi ext4_unlink
iopi
d “Desktop”
s sop ext4_evict_inode
ext4_rmdir
abcde
x
o
ext4 inode 被當 free, 配給新 file
39. Journal
memory
ext4@storage
1
2
journal
*. 把 1st meta 寫入 journal
*. 把 2nd meta 寫入 journal
*. 把 3rd meta 寫入 journal
*. 把 1st meta 寫入 target
*. 把 2nd meta 寫入 target
*. 把 3rd meta 寫入 target
都未寫入 , 沒 consistent 問題
crash
40. Journal
memory
ext4@storage
1
2
journal
*. 把 1st meta 寫入 journal
*. 把 2nd meta 寫入 journal
*. 把 3rd meta 寫入 journal
*. 把 1st meta 寫入 target
*. 把 2nd meta 寫入 target
*. 把 3rd meta 寫入 target
寫入部份 , 有 consistent 問題
*. 1st meta
--> 捨棄 , 沒 consistent 問題
crash
crash
41. Journal
memory
ext4@storage
1
2
journal
*. 把 1st meta 寫入 journal
*. 把 2nd meta 寫入 journal
*. 把 3rd meta 寫入 journal
*. 把 1st meta 寫入 target
*. 把 2nd meta 寫入 target
*. 把 3rd meta 寫入 target
全部寫入 , 沒 consistent 問題
*. 1st meta
*. 2nd meta
*. 3rd meta
--> 寫入 target, 也稱為 replay
crash
crash
crash
42. Journal
memory
ext4@storage
1
2
journal
*. 把 1st meta 寫入 journal
*. 把 2nd meta 寫入 journal
*. 把 3rd meta 寫入 journal
*. 把 1st meta 寫入 target
*. 把 2nd meta 寫入 target
*. 把 3rd meta 寫入 target
全部寫入 , revoke
*. 1st meta
*. 2nd meta
*. 3rd meta
--> revoke( 之後不會 replay)
crash