int DFlushEntry(afs_int32 *fid) { /* Flush pages modified by one entry. */ struct buffer *tb; int code; ObtainReadLock(&afs_bufferLock); for (tb = phTable[pHash(fid)]; tb; tb = tb->hashNext) if (FidEq(tb->fid, fid) && tb->dirty) { ObtainWriteLock(&tb->lock); if (tb->dirty) { code = ReallyWrite(tb->fid, tb->page, tb->data); if (code) { ReleaseWriteLock(&tb->lock); ReleaseReadLock(&afs_bufferLock); return code; } tb->dirty = 0; } ReleaseWriteLock(&tb->lock); } ReleaseReadLock(&afs_bufferLock); return 0; }
void DZap(afs_int32 *fid) { /* Destroy all buffers pertaining to a particular fid. */ struct buffer *tb; ObtainReadLock(&afs_bufferLock); for (tb = phTable[pHash(fid)]; tb; tb = tb->hashNext) if (FidEq(tb->fid, fid)) { ObtainWriteLock(&tb->lock); FidZap(tb->fid); tb->dirty = 0; ReleaseWriteLock(&tb->lock); } ReleaseReadLock(&afs_bufferLock); }
void DZap(dir_file_t dir) { /* Destroy all buffers pertaining to a particular fid. */ struct buffer *tb; ObtainReadLock(&afs_bufferLock); for (tb = phTable[pHash(dir)]; tb; tb = tb->hashNext) if (FidEq(bufferDir(tb), dir)) { ObtainWriteLock(&tb->lock); FidZap(bufferDir(tb)); tb->dirty = 0; ReleaseWriteLock(&tb->lock); } ReleaseReadLock(&afs_bufferLock); }