On Wed, Apr 15, 2009 at 5:44 AM, Felix Frank <[email protected]> wrote: > On a hunch, I applied this to 1.4.8: > > --- src/afs/LINUX/osi_vm.c.orig 2009-04-15 11:37:49.000000000 +0200 > +++ src/afs/LINUX/osi_vm.c 2009-04-15 11:38:56.000000000 +0200 > @@ -102,11 +102,6 @@ osi_VM_StoreAllSegments(struct vcache *a > { > struct inode *ip = AFSTOV(avc); > > - if (!avc->states & CPageWrite) > - avc->states |= CPageWrite; > - else - return; /* someone already writing */ > - > #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,5) > /* filemap_fdatasync() only exported in 2.4.5 and above */ > ReleaseWriteLock(&avc->lock); > @@ -120,7 +115,6 @@ osi_VM_StoreAllSegments(struct vcache *a > AFS_GLOCK(); > ObtainWriteLock(&avc->lock, 121); > #endif > - avc->states &= ~CPageWrite; > } > > /* Purge VM for a file when its callback is revoked. > > > This apparently solved the problem for 1.4.8 w/ disk cache. Will try 1.4.10 > as well. BCC'ing openafs-bugs now.
The problem without that is a deadlock as described in RT 120491, which means either this or that needs to be solved in another way. Looking through my local pile of things to deal with, I see Chaskiel commented thus: "What's there seems like it will prevent recursion, but in a silly way. The whole point of calling filemap_fdatawrite is for the kernel to call writepage() on all the dirty pages. But since osi_VM_StoreAllSegments always sets CPageWrite and CPageWrite means writepage always returns WRITEPAGE_ACTIVATE, there's no point. Wouldn't it be better for a DoPartialWrite-driven StoreAllSegments to not call osi_VM_StoreAllSegments (and restore the latter to usefulness)?" If you wish to/can look, please do, otherwise I will as soon as I can. Derrick _______________________________________________ OpenAFS-devel mailing list [email protected] https://lists.openafs.org/mailman/listinfo/openafs-devel
