From 4abb7b6d50131f76e2be39626c6b9b4c168491b8 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Sat, 8 Jun 2002 01:16:59 +0000 Subject: [PATCH] STABLE12-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 (cherry picked from commit 0eb68f307aac84472a13523a0ce8b7a865f01ac7) --- src/dir/buffer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dir/buffer.c b/src/dir/buffer.c index c7cca713f..bc5d6d0ca 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 */ @@ -396,8 +396,8 @@ char *DNew (fid,page) ObtainWriteLock(&afs_bufferLock); tb = newslot(fid,page,0); ObtainWriteLock(&tb->lock); - ReleaseWriteLock(&afs_bufferLock); tb->lockers++; + ReleaseWriteLock(&afs_bufferLock); ReleaseWriteLock(&tb->lock); return tb->data; } -- 2.39.5