On 11/25/24 01:40, Al Viro wrote:
On Sun, Nov 24, 2024 at 07:47:01PM +0000, Al Viro wrote:
On Sun, Nov 24, 2024 at 11:41:01AM -0800, syzbot wrote:
Hello,
syzbot has tested the proposed patch but the reproducer is still triggering an issue:
WARNING in minix_unlink
Predictably, since the warning has nothing to do with marking an unchanged
buffer dirty...
What happens there is that on a badly corrupt image we have an on-disk
inode with link count below the actual number of links. And after
unlinks remove enough of those to drive the link count to 0, inode
is freed. After that point, all remaining links are pointing to a freed
on-disk inode, which is discovered when they need to decrement of link
count that is already 0. Which does deserve a warning, probably without
a stack trace.
There's nothing the kernel can do about that, short of scanning the entire
filesystem at mount time and verifying that link counts are accurate...
Theoretically we could check if there's an associated dentry at the time of
decrement-to-0 and refuse to do that decrement in such case, marking the
in-core inode so that no extra dentries would be associated with it
from that point on. Not sure if that'd make for a good mitigation strategy,
though - and it wouldn't help in case of extra links we hadn't seen by
that point; they would become dangling pointers and reuse of on-disk inode
would still be possible...
Thank you for the detailed explanation. I understand that the warning
stems from corrupted filesystem metadata rather than the proposed patch.
Thank you again for your guidance!