Page MenuHomeFreeBSD

fusefs: correctly handle an inode that changes file types
ClosedPublic

Authored by asomers on Dec 6 2021, 5:53 AM.
Tags
None
Referenced Files
F106398195: D33283.id99635.diff
Mon, Dec 30, 1:44 AM
Unknown Object (File)
Oct 20 2024, 5:22 AM
Unknown Object (File)
Sep 23 2024, 11:26 AM
Unknown Object (File)
Sep 11 2024, 9:40 AM
Unknown Object (File)
Sep 10 2024, 9:39 AM
Unknown Object (File)
Sep 5 2024, 8:06 AM
Unknown Object (File)
Aug 29 2024, 12:46 PM
Unknown Object (File)
Aug 24 2024, 11:52 AM

Details

Summary

Correctly handle the situation where a FUSE server unlinks a file, then
creates a new file of a different type but with the same inode number.
Previously fuse_vnop_lookup in this situation would return EAGAIN. But
since it didn't call vgone(), the vnode couldn't be reused right away.
Fix this by immediately calling vgone() and reallocating a new vnode.

This problem can occur in three code paths, during VOP_LOOKUP,
VOP_SETATTR, or following FUSE_GETATTR, which usually happens during
VOP_GETATTR but can occur during other vops, too. Note that the correct
response actually doesn't depend on whether the entry cache has expired.
In fact, during VOP_LOOKUP, we can't even tell. Either it has expired
already, or else the vnode got reclaimed by vnlru.

Also, correct the error code during the VOP_SETATTR path.

PR: 258022
Reported by: chogata@moosefs.pro
MFC after: 2 weeks

Diff Detail

Repository
rS FreeBSD src repository - subversion
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 43167
Build 40055: arc lint + arc unit