Enable afs_DoPartialWrite() and afs_PrefetchChunk() in afs_UFSRead
authorChas Williams <chas@cmf.nrl.navy.mil>
Tue, 30 Jul 2002 20:34:32 +0000 (20:34 +0000)
committerNickolai Zeldovich <kolya@mit.edu>
Tue, 30 Jul 2002 20:34:32 +0000 (20:34 +0000)
and afs_UFSWrite for Linux; fixes deadlock condition for small
cache sizes.

src/afs/VNOPS/afs_vnop_read.c
src/afs/VNOPS/afs_vnop_write.c

index bbbe2f3..55d4160 100644 (file)
@@ -330,7 +330,7 @@ tagain:
      */
     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 @@ afs_UFSReadFast(avc, auio, acred, albn, abpp, noLock)
 
            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 @@ tagain:
      */
     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))
index 53a0d40..b19b244 100644 (file)
@@ -297,7 +297,9 @@ afs_MemWrite(avc, auio, aio, acred, noLock)
            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 @@ afs_MemWrite(avc, auio, aio, acred, noLock)
            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 @@ afs_UFSWrite(avc, auio, aio, acred, noLock)
        }
 #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 @@ afs_UFSWrite(avc, auio, aio, acred, noLock)
            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);