From: Derrick Brashear Date: Tue, 14 May 2002 21:21:09 +0000 (+0000) Subject: dir-hold-afs-bufferlock-across-increment-of-buffer-lockers-to-prevent-newslot-from... X-Git-Tag: openafs-devel_1_3_3~130 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=0eb68f307aac84472a13523a0ce8b7a865f01ac7;p=packages%2Fo%2Fopenafs.git dir-hold-afs-bufferlock-across-increment-of-buffer-lockers-to-prevent-newslot-from-walking-on-stuff-20020514 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 --- diff --git a/src/dir/buffer.c b/src/dir/buffer.c index 376ba81f5..018ddca06 100644 --- a/src/dir/buffer.c +++ b/src/dir/buffer.c @@ -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; }