13d593a5b0
VOPs like VOP_SETATTR can change a file's size, with the vnode exclusively locked. But VOPs like VOP_LOOKUP look up the file size from the server without the vnode locked. So a race is possible. For example: 1) One thread calls VOP_SETATTR to truncate a file. It locks the vnode and sends FUSE_SETATTR to the server. 2) A second thread calls VOP_LOOKUP and fetches the file's attributes from the server. Then it blocks trying to acquire the vnode lock. 3) FUSE_SETATTR returns and the first thread releases the vnode lock. 4) The second thread acquires the vnode lock and caches the file's attributes, which are now out-of-date. Fix this race by recording a timestamp in the vnode of the last time that its filesize was modified. Check that timestamp during VOP_LOOKUP and VFS_VGET. If it's newer than the time at which FUSE_LOOKUP was issued to the server, ignore the attributes returned by FUSE_LOOKUP. PR: 259071 Reported by: Agata <chogata@moosefs.pro> Reviewed by: pfg MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D33158 |
||
---|---|---|
.. | ||
fuse_device.c | ||
fuse_file.c | ||
fuse_file.h | ||
fuse_internal.c | ||
fuse_internal.h | ||
fuse_io.c | ||
fuse_io.h | ||
fuse_ipc.c | ||
fuse_ipc.h | ||
fuse_kernel.h | ||
fuse_main.c | ||
fuse_node.c | ||
fuse_node.h | ||
fuse_vfsops.c | ||
fuse_vnops.c | ||
fuse.h |