Menu Close

8.5. Glock 拥有者(holder)

下表显示了不同 glock 拥有者标记的含义。

表 8.5. Glock Holder Flags

标记名称含义

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 文件系统的孤立列表类似,它可让位图的任意后续读者知道有可能会回收的空间,并尝试重新声明它。