Example #1
0
/* 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
}
Example #2
0
/* 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
}
Example #3
0
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;
}
Example #4
0
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;
}