On Fri, Aug 19, 2011 at 06:47:51AM +0000, YAMAMOTO Takashi wrote: > what does FUSE protocol do to prevent unsafe reordering? > i guess we can learn from it.
I am not sure it does anything about it. But unfortunately that bug is not about reordering. Here is my complete anlysis of the problem: 1. file is created. Process writes to it, but thanks to page cache, no data gets pushed to the filesystem yet. 2. Our process uses stat(2), which sends a GETATTR. 3. puffs_vnode_fsync strikes. It calls flushvncache/dosetattr, which causes a SETATTR to be sent with the file size for the first time. kernal idea of the file size was set. 4. stat's GETATTR resturns before fscyn's SETATTR completes. It reports the size being zero. puffs_vnop_getattr() calls uvm_vnp_setsize/vn_put. The filesystem reported a smaller size than kernel value, the kernel therefore assume the file was truncated. vnode pages are discarded. 5. SETATTR completes for puffs_vnode_fsync. It then attemps a PUTPAGES which will write nothing, since data was discarded. 6. Next write find a clean vnode with no page in memory. It will cause a page fault, and modified page will be reloaded from filesystem using GETPAGE. The filesystems hands us what it has for the data that was never previously written: a chunk of zeroes. -- Emmanuel Dreyfus [email protected]
