9.5. Glock 拥有者(holder)
下表显示了不同 glock 拥有者标记的含义。
标记 | 名称 | 含义 |
---|---|---|
a | Async | 不要等待 glock 结果(以后轮询结果) |
A | Any | 接受任意兼容锁定模式 |
c | No cache | 取消锁定时,立即降级 DLM 锁定 |
e | No expire | 忽略随后的锁定取消请求 |
E | Exact | 必须有准确的锁定模式 |
F | First | 设定赋予这个锁定的第一个拥有者 |
H | Holder | 表示赋予请求的锁定 |
p | Priority | 在队列头启用 ENQUEUE 拥有者 |
t | Try | "try" 锁定 |
T | Try 1CB | 发送回调的 "try" 锁定 |
W | Wait | 等待请求完成的设置 |
如前面提到的,最重要的拥有者标志是 H(拥有者)和 W(等待),因为它们分别被设置在赋予的锁定请求和锁定请求中。在队列中的拥有者的顺序非常重要。如果有被允许的所有者,则他们将总位于队列的前头,后接其他进入队列的所有者。
如果没有被允许的所有者,列表中的第一个拥有者就是触发下一个状态更改的拥有者。由于总是认为降级请求比文件系统的请求优先级高,因此可能并不总直接导致对请求的状态的更改。
glock 子系统支持两种类型的 "try" 锁定。这两类都比较有用,因为它们允许把锁定移出正常的顺序(使用适当的 back-off 和 retry),且它们可以被用来帮助避免资源被其他节点使用。正常的 t(try) 锁定如其名字所示,它是一个 "try"锁定,不会做任何特殊操作。相反,T(try 1CB
)锁定和 t 锁基本一样,唯一的不同是 DLM 会向当前不兼容的锁定拥有者发送一个回调。T(try 1CB
)锁定的一个用法是带有 iopen
锁定,它用于在内节点的 i_nlink
计数为零时,在节点间进行判断,并确定哪些节点将负责取消内节点的事务。iopen
glock 通常处于共享状态,但如果 i_nlink
计数为零,并调用了 →evict_inode
(),它将请求一个带有 T(try 1CB
)设置的专用锁定。如果允许了锁定,它将继续取消内节点的配置。如果没有允许的锁定,则会导致阻止锁定的节点使用 D(demote)标记标记它们的 glock,该标记会在 →drop_inode
() 时检查以确保取消分配不会被忘记。
这意味着,具有零个链接计数但仍打开的内节点,将在最终 close
() 发生时被节点取消分配。另外,当内节点的链接计数降为 0 时,内节点被标记为处于具有零链路计数的特殊状态,但仍在资源组位映射中使用。这和 ext3 文件系统的孤儿列表类似,它可让位图的任意后续读者知道有可能会回收的空间,并尝试重新声明它。