> 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);
_______________________________________________
OpenAFS-devel mailing list
[EMAIL PROTECTED]
https://lists.openafs.org/mailman/listinfo/openafs-devel

Reply via email to