CVE-2026-31598Linux内核的OCFS2集群文件系统存在一个死锁漏洞(CVE-2026-31598)。该漏洞源于`ocfs2_unlink`与`ocfs2_dio_end_io_write`在处理orphan目录inode锁与`ip_alloc_sem`信号量时存在顺序相反的ABBA锁依赖。当系统并发执行文件删除与直接IO写入操作时,会导致内核陷入死锁状态,进而引发系统挂起或拒绝服务,严重影响系统可用性。
该漏洞属于典型的内核锁顺序违规导致的死锁问题。在`ocfs2_unlink`调用链中,内核首先通过`inode_lock(orphan_dir_inode)`获取孤儿目录的inode锁(锁A),随后在目录扩展操作中通过`down_write(&oi->ip_alloc_sem)`获取分配信号量(锁B)。然而,在`ocfs2_dio_end_io_write`调用链中,内核先获取`ip_alloc_sem`(锁B),随后在`ocfs2_del_inode_from_orphan`中尝试获取`inode_lock(orphan_dir_inode)`(锁A)。如果CPU0执行删除操作持有锁A等待锁B,同时CPU1执行DIO写入持有锁B等待锁A,系统将发生死锁。修复方法是将`ocfs2_del_inode_from_orphan`移出`ip_alloc_sem`的保护范围,消除对锁B的依赖,从而打破ABBA环路。