From: Miklos S. <mi...@sz...> - 2004-09-09 09:47:02
|
> What exactly is a FORGET? It sounds like something that happens after an > inode is no longer being referenced, but who decides when it's time to > do it? Is it the the FUSE kernel module which initiates the call? Yes. FORGET is sent when the clear_inode() method is called. This method is called when the kernel throws away an inode from the cache. > I can see that the FUSE inodes are generated in the library API, are > these then passed back to the kernel module? Yes. The inode number is passed back to the kernel. A double FORGET is actually normal. What can happen it that the kernel sends a FORGET to userspace, and shortly after it sends a LOOKUP for the same node. If the library hasn't yet executed the FORGET, then it will return the same inode number, but the node gets a different version. In the kernel the inode is recreated with the same number and with the new version. When the previous FORGET actually executes, it sees that the version of the node has changed, and so does not delete the node. After this a second FORGET can come with the new version number which actually deletes the node. What I haven't thought about is that the two FORGETs can be so close that they can execute in the wrong order. And this is what caused the aborts. > I've noticed that on a few rare occasions all my FUSE systems on a > particular machine will hang or die at the same time, now this seems a > bit of a coincidence, or could it be that theres a bit of cross-talk > between the different fuse mounts in the kernel module - could this > explain a double FORGET? There should not be any cross-talk between filesystesm, that would be a very grave bug. What can happen is that some event triggers a storm of FORGETS (e.g a large memory allocation), and this causes the same problem in all filesystems. Let's see if you see any more aborts after this fix. Miklos |