]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
dir-hold-afs-bufferlock-across-increment-of-buffer-lockers-to-prevent-newslot-from...
authorDerrick Brashear <shadow@dementia.org>
Tue, 14 May 2002 21:21:09 +0000 (21:21 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 14 May 2002 21:21:09 +0000 (21:21 +0000)
liberal debugging code and hammering produced a failure where newslot was
actually walking on another call to newslot because the bufferlock was
being dropped before newslot incremented lockers on the buffer it
was allocating, allowing someone else to come along and also think they
could allocate it.

by holding the bufferlock just a little longer we avoid this

src/dir/buffer.c

index 376ba81f5dc4ac35bace31cbc0c08489402e5b70..018ddca06fc14077622056c9849d93e708f623fb 100644 (file)
@@ -132,8 +132,8 @@ char *DRead(fid,page)
     if ( tb = phTable[pHash(fid)] ) {  /* ASSMT HERE */
        if (bufmatch(tb)) {
            ObtainWriteLock(&tb->lock);
-           ReleaseWriteLock(&afs_bufferLock);
            tb->lockers++;
+           ReleaseWriteLock(&afs_bufferLock);
            tb->accesstime = ++timecounter;
            ReleaseWriteLock(&tb->lock);
            return tb->data;
@@ -144,8 +144,8 @@ char *DRead(fid,page)
            if (bufmatch(tb2)) {
              buf_Front(bufhead,tb,tb2);
              ObtainWriteLock(&tb2->lock);
-             ReleaseWriteLock(&afs_bufferLock);
              tb2->lockers++;
+             ReleaseWriteLock(&afs_bufferLock);
              tb2->accesstime = ++timecounter;
              ReleaseWriteLock(&tb2->lock);
              return tb2->data;
@@ -154,8 +154,8 @@ char *DRead(fid,page)
              if (bufmatch(tb)) {
                buf_Front(bufhead,tb2,tb);
                ObtainWriteLock(&tb->lock);
-               ReleaseWriteLock(&afs_bufferLock);
                tb->lockers++;
+               ReleaseWriteLock(&afs_bufferLock);
                tb->accesstime = ++timecounter;
                ReleaseWriteLock(&tb->lock);
                return tb->data;
@@ -175,8 +175,8 @@ char *DRead(fid,page)
     tb = newslot(fid, page, (tb ? tb : tb2));
     ios++;
     ObtainWriteLock(&tb->lock);
-    ReleaseWriteLock(&afs_bufferLock);
     tb->lockers++;
+    ReleaseWriteLock(&afs_bufferLock);
     if (ReallyRead(tb->fid,tb->page,tb->data)) {
        tb->lockers--;
         FidZap(tb->fid);       /* disaster */
@@ -399,8 +399,8 @@ char *DNew (fid,page)
        return 0;
     }
     ObtainWriteLock(&tb->lock);
-    ReleaseWriteLock(&afs_bufferLock);
     tb->lockers++;
+    ReleaseWriteLock(&afs_bufferLock);
     ReleaseWriteLock(&tb->lock);
     return tb->data;
 }