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
锁,其用于在 inode 的 i_nlink
计数为零时确定哪个节点负责释放 inode 。iopen
glock 通常处于共享状态,但当 i_nlink
计数变为零且 →evict_inode
()被调用时,它将请求一个设置了 T (try 1CB
) 的独占锁。如果允许了锁定,它将继续取消内节点的配置。如果锁没有授权,则会导致阻止锁授权的节点使用 D(降级)标记标记其 glock,该标记会在 →drop_inode
()时检查,以确保释放不会被忘记。
这意味着,具有零链接数但仍然处于打开状态的 inode 将由在其上发生最终 close
() 的节点释放。另外,当内节点的链接计数降为 0 时,内节点被标记为处于具有零链路计数的特殊状态,但仍在资源组位映射中使用。此功能和 ext3 文件系统的孤儿列表类似,它允许位图的任何后续读取器知道有潜在的可能回收的空间,并尝试回收它。