YAMAMOTO Takashi <[email protected]> wrote: > do you have a particular idea what semantics might be broken?
Not sure, I am still searching. Here is a current posible behaviour: thread1 puffs_vnop_setattr > dosetattr size1 > SETATTR size1 sent thread2 puffs_vnop_write > uvm_vnp_setsize increase to size2 thread2 puffs_vnop_fsync > dosetattr size2 > SETATTR size2 sent thread1 SETATTR completes, uvm_vnp_setsize size1, file gets truncated thread2 SETATTR completes, uvm_vnp_setsize size2, but data was lost Now we prevent uvm_vnp_setsize() calls while a SETATTR is in prorgress. We get this: thread1 puffs_vnop_setattr > dosetattr size1 > SETATTR size1 sent thread2 puffs_vnop_write, uvm_vnp_setwritesize size2 thread2 puffs_vnop_fsync > dosetattr size2 > SETATTR size2 sent thread1 SETATTR completes, uvm_vnp_setsize size1 thread2 SETATTR completes, uvm_vnp_setsize size2 thread2 VOP_PUTPAGES called (with mutex held) thread2 VOP_PUTPAGES returns (releases mutex) thread2 puffs_vnop_fsync returns That seems to works. -- Emmanuel Dreyfus http://hcpnet.free.fr/pubz [email protected]
