亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cache.c

?? be文件系統實現的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
    real_remove_cached_blocks(dev, allow_writes, &bc.normal);    real_remove_cached_blocks(dev, allow_writes, &bc.locked);    max_device_blocks[dev] = 0;    UNLOCK(bc.lock);    return 0;}intflush_blocks(int dev, fs_off_t bnum, int nblocks){    int        cur, i;    cache_ent *ce;    cache_ent *ents[NUM_FLUSH_BLOCKS];    if (nblocks == 0)   /* might as well check for this */        return 0;    LOCK(bc.lock);        cur = 0;    for(; nblocks > 0; nblocks--, bnum++) {        ce = block_lookup(dev, bnum);        if (ce == NULL)            continue;                    if (bnum != ce->block_num || dev != ce->dev) {            UNLOCK(bc.lock);            panic("error2: looked up dev %d block %ld but found %d %ld\n",                  dev, bnum, ce->dev, ce->block_num);            return EBADF;        }        if ((ce->flags & CE_DIRTY) == 0 && ce->clone == NULL)            continue;        ce->flags |= CE_BUSY;        ents[cur++] = ce;        if (cur >= NUM_FLUSH_BLOCKS) {            UNLOCK(bc.lock);            qsort(ents, cur, sizeof(cache_ent **), cache_ent_cmp);            flush_ents(ents, cur);            LOCK(bc.lock);            for(i=0; i < cur; i++) {                ents[i]->flags &= ~CE_BUSY;            }            cur = 0;        }    }    UNLOCK(bc.lock);    if (cur == 0)     /* nothing more to do */        return 0;    /* flush out the last few buggers */    qsort(ents, cur, sizeof(cache_ent **), cache_ent_cmp);    flush_ents(ents, cur);    for(i=0; i < cur; i++) {        ents[i]->flags &= ~CE_BUSY;    }    return 0;}intmark_blocks_dirty(int dev, fs_off_t bnum, int nblocks){    int        ret = 0;    cache_ent *ce;    LOCK(bc.lock);        while(nblocks > 0) {        ce = block_lookup(dev, bnum);        if (ce) {            ce->flags |= CE_DIRTY;            bnum      += 1;                     nblocks   -= 1;        } else {     /* hmmm, that's odd, didn't find it */            printf("** mark_blocks_diry couldn't find block %ld (len %d)\n",                   bnum, nblocks);            ret = ENOENT;            break;        }    }        UNLOCK(bc.lock);    return ret;}intrelease_block(int dev, fs_off_t bnum){    cache_ent *ce;    /* printf("rlsb: %ld\n", bnum); */    LOCK(bc.lock);        ce = block_lookup(dev, bnum);    if (ce) {        if (bnum != ce->block_num || dev != ce->dev) {            panic("*** error3: looked up dev %d block %ld but found %d %ld\n",                    dev, bnum, ce->dev, ce->block_num);            UNLOCK(bc.lock);            return EBADF;        }        ce->lock--;        if (ce->lock < 0) {            printf("rlsb: whoa nellie! ce %ld has lock == %d\n",                   ce->block_num, ce->lock);        }                    if (ce->lock == 0) {            delete_from_list(&bc.locked, ce);            add_to_head(&bc.normal, ce);        }    } else {     /* hmmm, that's odd, didn't find it */        panic("** release_block asked to find %ld but it's not here\n",               bnum);    }        UNLOCK(bc.lock);    return 0;}static cache_ent *new_cache_ent(int bsize){    cache_ent *ce;    ce = (cache_ent *)calloc(1, sizeof(cache_ent));    if (ce == NULL) {        panic("*** error: cache can't allocate memory!\n");        return NULL;    }                    ce->data = malloc(bsize);    if (ce->data == NULL) {        free(ce);        panic("** error cache can't allocate data memory\n");        UNLOCK(bc.lock);        return NULL;    }                    ce->dev       = -1;    ce->block_num = -1;    return ce;}static voidget_ents(cache_ent **ents, int num_needed, int max, int *num_gotten, int bsize){    int        cur, retry_counter = 0, max_retry = num_needed * 256;    cache_ent *ce;        if (num_needed > max)        panic("get_ents: num_needed %d but max %d (doh!)\n", num_needed, max);    /* if the cache isn't full yet, just allocate the blocks */    for(cur=0; bc.cur_blocks < bc.max_blocks && cur < num_needed; cur++) {        ents[cur] = new_cache_ent(bsize);        if (ents[cur] == NULL)            break;        bc.cur_blocks++;    }    /* pluck off blocks from the LRU end of the normal list, keep trying too */    while(cur < num_needed && retry_counter < max_retry) {        for(ce=bc.normal.lru; ce && cur < num_needed; ce=ce->next) {            if (ce->lock)                panic("get_ents: normal list has locked blocks (ce 0x%x)\n",ce);            if (ce->flags & CE_BUSY)   /* don't touch busy blocks */                continue;            ce->flags   |= CE_BUSY;            ents[cur++]  = ce;        }        if (cur < num_needed) {            UNLOCK(bc.lock);            snooze(10000);            LOCK(bc.lock);            retry_counter++;        }    }        if (cur < num_needed && retry_counter >= max_retry) {  /* oh shit! */        dump_cache_list();        UNLOCK(bc.lock);        panic("get_ents: waited too long; can't get enough ce's (c %d n %d)\n",              cur, num_needed);    }    /*      If the last block is a dirty one, try to get more of 'em so      that we can flush a bunch of blocks at once.    */    if (cur && cur < max &&        ((ents[cur-1]->flags & CE_DIRTY) || ents[cur-1]->clone)) {        for(ce=ents[cur-1]->next; ce && cur < max; ce=ce->next) {            if (ce->flags & CE_BUSY)   /* don't touch busy blocks */                continue;            if (ce->lock)                panic("get_ents:2 dirty list has locked blocks (ce 0x%x)\n",ce);                            ce->flags   |= CE_BUSY;            ents[cur++]  = ce;        }    }    *num_gotten = cur;}static intread_into_ents(int dev, fs_off_t bnum, cache_ent **ents, int num, int bsize){    int    i, ret;    struct iovec *iov;    iov = get_iovec_array();    for(i=0; i < num; i++) {        iov[i].iov_base = ents[i]->data;        iov[i].iov_len  = bsize;    }    /* printf("readv @ %ld for %d blocks\n", bnum, num); */    ret = readv_pos(dev, bnum*bsize, iov, num);    release_iovec_array(iov);    if (ret != num*bsize) {        printf("read_into_ents: asked to read %d bytes but got %d\n",               num*bsize, ret);        printf("*** iov @ 0x%x (num %d)\n", iov, num);        return EINVAL;    } else        return 0;}#define CACHE_READ          0x0001#define CACHE_WRITE         0x0002#define CACHE_NOOP          0x0004     /* for getting empty blocks */#define CACHE_LOCKED        0x0008#define CACHE_READ_AHEAD_OK 0x0010     /* it's ok to do read-ahead */static char *op_to_str(int op){    static char buff[128];    if (op & CACHE_READ)        strcpy(buff, "RD");    else if (op & CACHE_WRITE)        strcpy(buff, "WR");     else if (op & CACHE_NOOP)        strcpy(buff, "NOP");    if (op & CACHE_LOCKED)        strcat(buff, " LOCKED");    if (op & CACHE_READ_AHEAD_OK)        strcat(buff, " (AHEAD)");    return buff;}static intcache_block_io(int dev, fs_off_t bnum, void *data, fs_off_t num_blocks, int bsize,               int op, void **dataptr){    size_t          err = 0;    cache_ent      *ce;    cache_ent_list *cel;        if (chatty_io > 1)        printf("cbio: bnum %ld nblock %ld bsize %d op %s\n", bnum, num_blocks,               bsize, op_to_str(op));    /* some sanity checks first */    if (bsize == 0)        panic("cache_io: block size == 0 for bnum %ld?!?\n", bnum);    if (num_blocks == 0)        panic("cache_io: bnum %ld has num_blocks == 0!\n", bnum);        if (data == NULL && dataptr == NULL) {        printf("major butthead move: null data and dataptr! bnum %ld:%ld\n",                bnum, num_blocks);        return ENOMEM;    }            if (data == NULL) {        if (num_blocks != 1)    /* get_block() should never do that */            panic("cache_io: num_blocks %ld but should be 1\n",                  num_blocks);        if (op & CACHE_WRITE)            panic("cache_io: get_block() asked to write?!?\n");    }    if (bnum + num_blocks > max_device_blocks[dev]) {        printf("dev %d: access to blocks %ld:%ld but max_dev_blocks is %ld\n",               dev, bnum, num_blocks, max_device_blocks[dev]);*(int *)0x3100 = 0xc0debabe;        return EINVAL;    }    last_cache_access = system_time();    /* if the i/o is greater than 64k, do it directly */    if (num_blocks * bsize >= 64 * 1024) {        char  *ptr;        fs_off_t  tmp;        if (data == NULL || (op & CACHE_LOCKED)) {            panic("*** asked to do a large locked io that's too hard!\n");        }        if (op & CACHE_READ) {            if (read_phys_blocks(dev, bnum, data, num_blocks, bsize) != 0) {                printf("cache read:read_phys_blocks failed (%s on blocks %ld:%ld)!\n",                        strerror(errno), bnum, num_blocks);                return EINVAL;            }            LOCK(bc.lock);            /* if any of the blocks are in the cache, grab them instead */            ptr = data;            for(tmp=bnum; tmp < bnum+num_blocks; tmp++, ptr+=bsize) {                ce = block_lookup(dev, tmp);                /*                    if we find a block in the cache we have to copy its                    data just in case it is more recent than what we just                    read from disk (which could happen if someone wrote                     these blocks after we did the read but before we locked                    the cache and entered this loop).                */                if (ce) {                    if (tmp != ce->block_num || dev != ce->dev) {                        UNLOCK(bc.lock);                        panic("*** error4: looked up dev %d block %ld but "                                "found %d %ld\n", dev, tmp, ce->dev,                                ce->block_num);                    }                                        memcpy(ptr, ce->data, bsize);                }            }            UNLOCK(bc.lock);        } else if (op & CACHE_WRITE) {            LOCK(bc.lock);            /* if any of the blocks are in the cache, update them too */            ptr = data;            for(tmp=bnum; tmp < bnum+num_blocks; tmp++, ptr+=bsize) {                ce = block_lookup(dev, tmp);                if (ce) {                    if (tmp != ce->block_num || dev != ce->dev) {                        UNLOCK(bc.lock);                        panic("*** error5: looked up dev %d block %ld but "                                "found %d %ld\n", dev, tmp, ce->dev,                                ce->block_num);                        return EBADF;                    }                    /* XXXdbg -- this isn't strictly necessary */                    if (ce->clone) {                        printf("over-writing cloned data (ce 0x%x bnum %ld)...\n", ce,tmp);                        flush_cache_ent(ce);                    }                    /* copy the data into the cache */                    memcpy(ce->data, ptr, bsize);                }            }                        UNLOCK(bc.lock);            if (write_phys_blocks(dev, bnum, data, num_blocks, bsize) != 0) {                printf("cache write: write_phys_blocks failed (%s on blocks "                       "%ld:%ld)!\n", strerror(errno), bnum, num_blocks);                return EINVAL;            }        } else {            printf("bad cache op %d (bnum %ld nblocks %ld)\n", op, bnum,                   num_blocks);            return EINVAL;        }        return 0;    }    LOCK(bc.lock);    while(num_blocks) {            ce = block_lookup(dev, bnum);        if (ce) {            if (bnum != ce->block_num || dev != ce->dev) {                UNLOCK(bc.lock);                panic("*** error6: looked up dev %d block %ld but found "                        "%d %ld\n", dev, bnum, ce->dev, ce->block_num);                return EBADF;            }            if (bsize != ce->bsize) {                panic("*** requested bsize %d but ce->bsize %d ce @ 0x%x\n",                        bsize, ce->bsize, ce);            }            /* delete this ent from the list it is in because it may change */            if (ce->lock)                cel = &bc.locked;            else                cel = &bc.normal;                            delete_from_list(cel, ce);            if (op & CACHE_READ) {                if (data && data != ce->data) {                    memcpy(data, ce->data, bsize);                } else if (dataptr) {                     *dataptr = ce->data;                } else {                    printf("cbio:data 0x%x dptr 0x%x ce @ 0x%x ce->data 0x%x\n",                           data, dataptr, ce, ce->data);                }            } else if (op & CACHE_WRITE) {                if (data && data != ce->data)                    memcpy(ce->data, data, bsize);                ce->flags |= CE_DIRTY;            } else if (op & CACHE_NOOP) {                memset(ce->data, 0, bsize);                if (data)                    memset(data, 0, bsize);                                if (dataptr)                    *dataptr = ce->data;                ce->flags |= CE_DIRTY;            } else {                panic("cached_block_io: bogus op %d\n", op);            }            if (op & CACHE_LOCKED)                ce->lock++;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃视频第一区免费观看| 一区二区三区四区视频精品免费 | 亚洲一区二区不卡免费| 91一区一区三区| 一区二区三区四区视频精品免费| 91国偷自产一区二区三区观看| 亚洲一区二区在线免费看| 欧美猛男男办公室激情| 日韩av一二三| 久久精品日韩一区二区三区| 丁香五精品蜜臀久久久久99网站 | 不卡的看片网站| 亚洲激情五月婷婷| 69堂国产成人免费视频| 狠狠色丁香婷婷综合| 国产精品另类一区| 欧美三级日韩三级国产三级| 奇米色777欧美一区二区| 性久久久久久久| 欧美一区二区私人影院日本| 国产精品一区二区三区99| 国产精品国产三级国产普通话三级 | 91精品国产一区二区三区| 久久99国内精品| 综合色中文字幕| 这里只有精品免费| www.亚洲在线| 蜜芽一区二区三区| 日韩一区在线播放| 日韩精品在线网站| 91原创在线视频| 久久国产精品99精品国产 | 亚洲视频综合在线| 欧美一级理论片| 99国产精品视频免费观看| 青娱乐精品视频| 亚洲精选在线视频| 久久麻豆一区二区| 欧美特级限制片免费在线观看| 韩国v欧美v日本v亚洲v| 亚洲成人av电影| 国产精品国产三级国产有无不卡| 3d动漫精品啪啪| 在线观看亚洲一区| 国产乱人伦偷精品视频不卡| 亚洲高清在线视频| 国产精品美女久久久久aⅴ| 日韩美女一区二区三区四区| 色成年激情久久综合| 国产九色精品成人porny| 午夜视频在线观看一区二区| 中文字幕一区二区视频| 久久嫩草精品久久久精品一| 91.麻豆视频| 色网综合在线观看| 成人综合婷婷国产精品久久蜜臀 | 94色蜜桃网一区二区三区| 蜜桃视频一区二区三区| 亚洲成人先锋电影| 亚洲自拍偷拍麻豆| 亚洲色图欧洲色图| 亚洲三级在线观看| 国产欧美日韩亚州综合 | 蜜桃免费网站一区二区三区| 亚洲综合在线五月| 亚洲视频网在线直播| 中文子幕无线码一区tr| 久久久久久免费毛片精品| 欧美一区二区精美| 3d动漫精品啪啪| 欧美一区二区网站| 日韩亚洲欧美在线| 欧美一级日韩不卡播放免费| 7777精品久久久大香线蕉| 欧美三级电影精品| 欧美日韩一区二区在线观看| 欧美日韩中文国产| 欧美日本高清视频在线观看| 欧美偷拍一区二区| 欧美日韩国产a| 欧美二区三区91| 在线电影国产精品| 日韩免费观看高清完整版| 日韩精品一区二区三区在线| 日韩亚洲欧美在线观看| 精品av综合导航| 欧美激情一区二区三区蜜桃视频| 国产免费观看久久| 亚洲少妇中出一区| 亚洲资源在线观看| 日本在线观看不卡视频| 另类小说综合欧美亚洲| 国产精品影视天天线| 成人福利在线看| 色诱视频网站一区| 欧美高清精品3d| 久久亚洲一区二区三区四区| 中文字幕+乱码+中文字幕一区| 亚洲品质自拍视频| 日韩成人一区二区| 国产精品自拍毛片| 色中色一区二区| 欧美一区二区三区爱爱| 久久久久国产精品免费免费搜索| 国产精品久久久久久久裸模| 波波电影院一区二区三区| 91麻豆国产香蕉久久精品| 91精品国产综合久久国产大片| 日韩三级.com| 国产精品视频在线看| 亚洲国产精品久久久男人的天堂| 免费欧美在线视频| 成人97人人超碰人人99| 欧美日韩成人综合天天影院 | 欧美中文字幕一区二区三区| 欧美一区二区黄色| 中文字幕高清不卡| 午夜精品久久久久久不卡8050| 国产在线国偷精品产拍免费yy| caoporen国产精品视频| 91精品福利在线一区二区三区| 日本一区二区三区高清不卡| 亚洲成av人片在线观看无码| 国产精品99久久久久久久女警 | 欧美视频第二页| 2023国产精品自拍| 亚洲午夜影视影院在线观看| 国模娜娜一区二区三区| 欧美丝袜第三区| 国产欧美日韩在线观看| 日韩精品一二三四| 91麻豆免费观看| 国产色91在线| 蜜桃视频一区二区三区| 色视频成人在线观看免| 久久你懂得1024| 奇米综合一区二区三区精品视频| 色欧美日韩亚洲| 国产欧美精品区一区二区三区| 日本v片在线高清不卡在线观看| 99re这里只有精品首页| 精品国产1区二区| 视频在线观看一区二区三区| 91一区二区在线观看| 国产无一区二区| 国产在线精品一区在线观看麻豆| 欧美日韩高清一区二区| 亚洲精品国产一区二区精华液 | 色综合久久久久综合体| 国产亚洲精品超碰| 理论电影国产精品| 欧美精三区欧美精三区| 亚洲与欧洲av电影| 欧美在线观看视频一区二区三区 | 一区二区不卡在线播放| 成人短视频下载| 国产欧美日本一区二区三区| 九九视频精品免费| 欧美久久久久久久久久| 亚洲自拍偷拍图区| 欧美专区在线观看一区| 亚洲另类在线一区| 91麻豆国产自产在线观看| 综合久久国产九一剧情麻豆| fc2成人免费人成在线观看播放| 国产欧美视频在线观看| 成人不卡免费av| 亚洲欧美一区二区在线观看| 91在线精品秘密一区二区| 亚洲欧美偷拍另类a∨色屁股| 99久久99久久精品国产片果冻| 国产精品视频看| 91小视频在线免费看| 亚洲免费在线看| 欧美亚洲日本一区| 午夜欧美在线一二页| 欧美一级二级在线观看| 久久激五月天综合精品| 久久久国产午夜精品| 粉嫩13p一区二区三区| 日韩久久一区二区| 欧美在线制服丝袜| 三级亚洲高清视频| 精品国产乱子伦一区| 成人小视频在线观看| 亚洲精选免费视频| 777a∨成人精品桃花网| 九九九精品视频| 亚洲国产精品成人久久综合一区| 99re亚洲国产精品| 亚洲成在线观看| 精品国产伦一区二区三区观看方式| 国产精品2024| 亚洲一区二区精品视频| 555www色欧美视频| 国产电影一区二区三区| 一区二区三区欧美日韩| 91精品福利在线一区二区三区| 韩国av一区二区三区| 中文字幕日韩欧美一区二区三区|