[OpenAFS-devel] reproducible problem during cache flush
Nickolai Zeldovich
kolya@MIT.EDU
Tue, 30 Jul 2002 14:55:04 -0400
> Applying this (with hand fixes to get it to apply on the trunk + protos
> branches, which have some locking+dcache changes in that vicinity) does
> NOT appear to fix the problem for me.
Ah, I think I see at least one problem: we were failing to release
our own write-locked dcache entry before calling afs_DoPartialWrite.
Since dcache locking isn't on the 1.2.x branch, Chas didn't run into
the same problem. Here's a cummulative diff against the trunk that
fixes at least that bug; see if you find any more? :-)
-- kolya
--- src/afs/VNOPS/afs_vnop_read.c 2002/07/13 03:28:28 1.14
+++ src/afs/VNOPS/afs_vnop_read.c 2002/07/30 18:51:43
@@ -330,7 +330,7 @@
*/
if (tdc) {
ReleaseReadLock(&tdc->lock);
-#ifndef AFS_VM_RDWR_ENV
+#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV)
/* try to queue prefetch, if needed */
if (!noLock) {
afs_PrefetchChunk(avc, tdc, acred, &treq);
@@ -559,7 +559,7 @@
if (!noLock) {
ReleaseReadLock(&avc->lock);
-#ifndef AFS_VM_RDWR_ENV
+#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV)
if (!(code = afs_InitReq(&treq, acred))) {
if (!(tdc->mflags & DFNextStarted))
afs_PrefetchChunk(avc, tdc, acred, &treq);
@@ -982,7 +982,7 @@
*/
if (tdc) {
ReleaseReadLock(&tdc->lock);
-#ifndef AFS_VM_RDWR_ENV
+#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV)
/* try to queue prefetch, if needed */
if (!noLock) {
if (!(tdc->mflags & DFNextStarted))
--- src/afs/VNOPS/afs_vnop_write.c 2002/04/02 17:35:03 1.20
+++ src/afs/VNOPS/afs_vnop_write.c 2002/07/30 18:51:43
@@ -297,7 +297,9 @@
avc->m.Length = filePos;
}
#endif
-#ifndef AFS_VM_RDWR_ENV
+ ReleaseWriteLock(&tdc->lock);
+ afs_PutDCache(tdc);
+#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV)
/*
* If write is implemented via VM, afs_DoPartialWrite() is called from
* the high-level write op.
@@ -306,14 +308,10 @@
code = afs_DoPartialWrite(avc, &treq);
if (code) {
error = code;
- ReleaseWriteLock(&tdc->lock);
- afs_PutDCache(tdc);
break;
}
}
#endif
- ReleaseWriteLock(&tdc->lock);
- afs_PutDCache(tdc);
}
#ifndef AFS_VM_RDWR_ENV
afs_FakeClose(avc, acred);
@@ -618,7 +616,9 @@
}
#endif
osi_UFSClose(tfile);
-#ifndef AFS_VM_RDWR_ENV
+ ReleaseWriteLock(&tdc->lock);
+ afs_PutDCache(tdc);
+#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV)
/*
* If write is implemented via VM, afs_DoPartialWrite() is called from
* the high-level write op.
@@ -627,14 +627,10 @@
code = afs_DoPartialWrite(avc, &treq);
if (code) {
error = code;
- ReleaseWriteLock(&tdc->lock);
- afs_PutDCache(tdc);
break;
}
}
#endif
- ReleaseWriteLock(&tdc->lock);
- afs_PutDCache(tdc);
}
#ifndef AFS_VM_RDWR_ENV
afs_FakeClose(avc, acred);