我只能找到文件的解决方案,而不能找到目录的解决方案,例如lsof
.chflags
没有阅读选项,所以我不知道该怎么做。
答案1
用于目录操作的锁定方案基于两种锁 - 每个 inode (->i_mutex) 和每个文件系统 (->s_vfs_rename_mutex)。
当在多个非目录对象上使用 i_mutex 时,我们总是通过地址递增的顺序获取锁。下面我们将其称为“inode 指针”顺序。
出于我们的目的,所有操作分为 5 类:
1) 读访问。锁定规则:调用者锁定我们正在访问的目录。
2)对象创建。锁定规则:同上。
3)物体去除。锁定规则:调用者锁定父级,找到受害者,锁定受害者并调用该方法。
4)重命名()即不是跨目录。锁定规则:调用者锁定父级并查找源和目标。如果目标已经存在,则锁定它。如果源是非目录,则锁定它。如果这意味着我们需要锁定两者,请按 inode 指针顺序锁定它们。
5)链接创建。锁定规则: * 锁定父级 * 检查源不是目录 * 锁定源 * 调用该方法。
6) 跨目录重命名。整个群中最棘手的。锁定规则: * 锁定文件系统 * 以“祖先优先”的顺序锁定父级。 * 查找源和目标。 * 如果旧父级等于或者是目标的后代,则使用 -ENOTEMPTY 失败 * 如果新父级等于或者是源的后代,则使用 -ELOOP 失败 * 如果目标存在,则锁定它。如果源是非目录,则锁定它。如果这意味着我们需要锁定源和目标,请按 inode 指针顺序执行此操作。 * 调用该方法。
您可以编写一个脚本,通过使用上述 6 个 dir 操作中的一些信息来检查目录锁定。