release-buffer-cache-lock-before-opening-file-20011009
authorNickolai Zeldovich <kolya@mit.edu>
Wed, 10 Oct 2001 00:58:44 +0000 (00:58 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 10 Oct 2001 00:58:44 +0000 (00:58 +0000)
  make the buffer cache release
  the buffer hash lock before trying to open the corresponding file.
  Since we're already holding a buffer cache entry, we can lock it
  instead and let other threads obtain the big hash lock.

src/afs/afs_buffer.c

index 8f019ba..3fc6e4f 100644 (file)
@@ -232,17 +232,18 @@ char *DRead(fid,page)
       MReleaseWriteLock(&afs_bufferLock);
       return 0;
     }
+    MObtainWriteLock(&tb->lock,260);
+    MReleaseWriteLock(&afs_bufferLock);
+    tb->lockers++;
     tfile = afs_CFileOpen(fid[0]);
     sizep = (afs_int32 *)tfile;
     if (page * AFS_BUFFER_PAGESIZE >= *sizep) {
        dirp_Zap(tb->fid);
+       tb->lockers--;
+       MReleaseWriteLock(&tb->lock);
        afs_CFileClose(tfile);
-       MReleaseWriteLock(&afs_bufferLock);
        return 0;
     }
-    MObtainWriteLock(&tb->lock,260);
-    MReleaseWriteLock(&afs_bufferLock);
-    tb->lockers++;
     code = afs_CFileRead(tfile, tb->page * AFS_BUFFER_PAGESIZE,
                         tb->data, AFS_BUFFER_PAGESIZE);
     afs_CFileClose(tfile);