关键漏洞信息 问题描述: - 当 失败时(因为它已满), 需要通过 提交 I/O 请求,并分配一个新的 I/O 请求,使用一个空的 。然后它会重试 调用。 - 然而,在这一点上, 已经被调用,这会增加 ;重试将再次调用 ,但永远不会有一个匹配的 调用。这会导致 folio 永远锁定,所有等待者将卡在 中。 触发条件: - 该 bug 是由 commit ce63cb62d794 引入的,但在实际中不可达,因为 中有空间容纳 256 个 folios。直到 commit 9f74ae8c9ac9 将数组容量减少到 16 个 folios 后,才变得容易触发。 - 可以通过手动调用 readahead 从用户空间触发此 bug,例如: 修复措施: - 应该在 成功后才调用 。这是安全的:异步完成调用 不会解锁 folio,因为 仍然持有引用,直到最后释放。 相关提交: - Fixes: ce63cb62d794 ("erofs: support unencoded inodes for fileio") - Fixes: 9f74ae8c9ac9 ("erofs: shorten bvecs[] for file-backed mounts") 签名和审查: - Signed-off-by: Max Kellermann - Reviewed-by: Gao Xiang - Tested-by: Hongbo Li - Signed-off-by: Greg Kroah-Hartman