/* look buffer up from buffer cache; dev is buffer-device ID, not system */ struct bufblk * buffindblk(long dev, off_t num, long rel) { #if (BUFNEWHASH) int64_t val = bufmkhashkey(dev, num); int64_t key = hashq128(&val, sizeof(int64_t), BUFNHASHBIT); struct bufblk *blk; struct bufchain *chain = &bufhash[key]; #else int64_t key = hashq128(&num, sizeof(int64_t), BUFNHASHBIT); long dkey = dev & BUFDEVMASK; struct bufblk *blk = NULL; #endif #if (BUFNEWHASH) mtxlk(&chain->lk); blk = chain->list; while ((blk) && blk->num != num) { blk = blk->tabnext; } if ((blk) && (rel)) { /* remove block from buffer hash chain */ if (blk->tabprev) { blk->tabprev->tabnext = blk->tabnext; } else { chain->list = blk->tabnext; } if (blk->tabnext) { blk->tabnext->tabprev = blk->tabprev; } } return blk; #else mtxlk(&buflktab[dkey]); blk = bufhash[dkey][key]; while ((blk) && blk->num != num) { blk = blk->tabnext; } if ((blk) && (rel)) { /* remove block from buffer hash chain */ if (blk->tabprev) { blk->tabprev->tabnext = blk->tabnext; } else { bufhash[dkey][key] = blk->tabnext; } if (blk->tabnext) { blk->tabnext->tabprev = blk->tabprev; } } mtxunlk(&buflktab[dkey]); return blk; #endif }
/* look buffer up from buffer cache; dev is buffer-device ID, not system */ struct bufblk * buffindblk(long dev, off_t num, long rel) { #if (BUFNEWHASH) bufval_t val = bufmkhashkey(dev, num); bufval_t key = bufhash(val); struct bufblk *blk; struct bufchain *chain = &bufhash[key]; #else bufval_t key = bufhash(num); long dkey = dev & BUFDEVMASK; struct bufblk *blk = NULL; #endif #if (BUFNEWHASH) fmtxlk(&chain->lk); blk = chain->list; while ((blk) && blk->num != num) { blk = blk->tabnext; } if ((blk) && (rel)) { /* remove block from buffer hash chain */ if (blk->tabprev) { blk->tabprev->tabnext = blk->tabnext; } else { chain->list = blk->tabnext; } if (blk->tabnext) { blk->tabnext->tabprev = blk->tabprev; } } return blk; #else fmtxlk(&buflktab[dkey]); blk = bufhash[dkey][key]; while ((blk) && blk->num != num) { blk = blk->tabnext; } if ((blk) && (rel)) { /* remove block from buffer hash chain */ if (blk->tabprev) { blk->tabprev->tabnext = blk->tabnext; } else { bufhash[dkey][key] = blk->tabnext; } if (blk->tabnext) { blk->tabnext->tabprev = blk->tabprev; } } fmtxunlk(&buflktab[dkey]); return blk; #endif }
void bufaddblk(struct bufblk *blk) { #if (BUFNEWHASH) int64_t val = bufmkhashkey(blk->dev, blk->num); int64_t key = hashq128(&val, sizeof(int64_t), BUFNHASHBIT); struct bufblk *buf; struct bufchain *chain = &bufhash[key]; #else int64_t key = hashq128(&blk->num, sizeof(int64_t), BUFNHASHBIT); long dkey = blk->dev & BUFDEVMASK; struct bufblk *buf; #endif #if (BUFNEWHASH) mtxlk(&chain->lk); buf = chain->list; buf->tabprev = NULL; if (buf) { buf->tabprev = blk; } blk->tabnext = buf; chain->list = buf; mtxunlk(&chain->lk); #else mtxlk(&buflktab[dkey]); buf = bufhash[dkey][key]; if (buf) { buf->tabprev = blk; } bufhash[dkey][key] = blk; mtxunlk(&buflktab[dkey]); #endif return; }
void bufaddblk(struct bufblk *blk) { #if (BUFNEWHASH) bufval_t val = bufmkhashkey(blk->dev, blk->num); bufval_t key = bufhash(val); struct bufblk *buf; struct bufchain *chain = &bufhash[key]; #else buval_t key = bufhash(blk->num); long dkey = blk->dev & BUFDEVMASK; struct bufblk *buf; #endif #if (BUFNEWHASH) fmtxlk(&chain->lk); buf = chain->list; buf->tabprev = NULL; if (buf) { buf->tabprev = blk; } blk->tabnext = buf; chain->list = buf; fmtxunlk(&chain->lk); #else fmtxlk(&buflktab[dkey]); buf = bufhash[dkey][key]; if (buf) { buf->tabprev = blk; } bufhash[dkey][key] = blk; fmtxunlk(&buflktab[dkey]); #endif return; }