[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);