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

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

?? cache.c

?? be文件系統實現的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
static voidrelease_iovec_array(struct iovec *iov){    int i;    LOCK(iovec_lock);    for(i=0; i < MAX_IOVECS; i++) {        if (iov == iovec_pool[i])            break;    }    if (i < MAX_IOVECS)        iovec_used[i] = 0;    else                     /* uh-oh */        printf("cache: released an iovec I don't own (iov 0x%x)\n", iov);        UNLOCK(iovec_lock);}static voidreal_dump_cache_list(cache_ent_list *cel){    cache_ent *ce;        kprintf("starting from LRU end:\n");    for(ce=cel->lru; ce; ce=ce->next) {        kprintf("ce 0x%.8lx dev %2d bnum %6ld lock %d flag %d arg 0x%.8lx "               "clone 0x%.8lx\n", (ulong)ce, ce->dev, ce->block_num,ce->lock,               ce->flags, (ulong)ce->arg, (ulong)ce->clone);    }    kprintf("MRU end\n");}static voiddump_cache_list(void){    kprintf("NORMAL BLOCKS\n");    real_dump_cache_list(&bc.normal);    kprintf("LOCKED BLOCKS\n");    real_dump_cache_list(&bc.locked);    kprintf("cur blocks %d, max blocks %d ht @ 0x%lx\n", bc.cur_blocks,           bc.max_blocks, (ulong)&bc.ht);}static voidcheck_bcache(char *str){    int count = 0;    cache_ent *ce, *prev = NULL;    LOCK(bc.lock);    for(ce=bc.normal.lru; ce; prev=ce, ce=ce->next) {        count++;    }    for(ce=bc.locked.lru; ce; prev=ce, ce=ce->next) {        count++;    }    if (count != bc.cur_blocks) {        if (count < bc.cur_blocks - 16)            panic("%s: count == %d, cur_blocks %d, prev 0x%x\n",                    str, count, bc.cur_blocks, prev);        else            printf("%s: count == %d, cur_blocks %d, prev 0x%x\n",                    str, count, bc.cur_blocks, prev);    }    UNLOCK(bc.lock);}static voiddump_lists(void){    cache_ent *nce;        printf("LOCKED 0x%x  (tail 0x%x, head 0x%x)\n", &bc.locked,           bc.locked.lru, bc.locked.mru);    for(nce=bc.locked.lru; nce; nce=nce->next)        printf("nce @ 0x%x dev %d bnum %ld flags %d lock %d clone 0x%x func 0x%x\n",               nce, nce->dev, nce->block_num, nce->flags, nce->lock, nce->clone,               nce->func);    printf("NORMAL 0x%x  (tail 0x%x, head 0x%x)\n", &bc.normal,           bc.normal.lru, bc.normal.mru);    for(nce=bc.normal.lru; nce; nce=nce->next)        printf("nce @ 0x%x dev %d bnum %ld flags %d lock %d clone 0x%x func 0x%x\n",               nce, nce->dev, nce->block_num, nce->flags, nce->lock, nce->clone,               nce->func);}static voidcheck_lists(void){    cache_ent *ce, *prev, *oce;    cache_ent_list *cel;        cel = &bc.normal;    for(ce=cel->lru,prev=NULL; ce; prev=ce, ce=ce->next) {        for(oce=bc.locked.lru; oce; oce=oce->next) {            if (oce == ce) {                dump_lists();                panic("1:ce @ 0x%x is in two lists(cel 0x%x &LOCKED)\n",ce,cel);            }        }    }    if (prev && prev != cel->mru) {        dump_lists();        panic("*** last element in list != cel mru (ce 0x%x, cel 0x%x)\n",              prev, cel);    }    cel = &bc.locked;    for(ce=cel->lru,prev=NULL; ce; prev=ce, ce=ce->next) {        for(oce=bc.normal.lru; oce; oce=oce->next) {            if (oce == ce) {                dump_lists();                panic("3:ce @ 0x%x is in two lists(cel 0x%x & DIRTY)\n",ce,cel);            }        }    }    if (prev && prev != cel->mru) {        dump_lists();        panic("*** last element in list != cel mru (ce 0x%x, cel 0x%x)\n",              prev, cel);    }}#ifdef DEBUGstatic intdo_dump(int argc, char **argv){    dump_cache_list();    return 1;}static intdo_find_block(int argc, char **argv){    int        i;    fs_off_t  bnum;    cache_ent *ce;    if (argc < 2) {        kprintf("%s: needs a block # argument\n", argv[0]);        return 1;    }    for(i=1; i < argc; i++) {        bnum = strtoul(argv[i], NULL, 0);        for(ce=bc.normal.lru; ce; ce=ce->next) {            if (ce->block_num == bnum) {                kprintf("found clean bnum %ld @ 0x%lx (data @ 0x%lx)\n",                        bnum, ce, ce->data);            }        }        for(ce=bc.locked.lru; ce; ce=ce->next) {            if (ce->block_num == bnum) {                kprintf("found locked bnum %ld @ 0x%lx (data @ 0x%lx)\n",                        bnum, ce, ce->data);            }        }    }    return 0;}static intdo_find_data(int argc, char **argv){    int        i;    void      *data;    cache_ent *ce;    if (argc < 2) {        kprintf("%s: needs a block # argument\n", argv[0]);        return 1;    }    for(i=1; i < argc; i++) {        data = (void *)strtoul(argv[i], NULL, 0);        for(ce=bc.normal.lru; ce; ce=ce->next) {            if (ce->data == data) {                kprintf("found normal data ptr for bnum %ld @ ce 0x%lx\n",                        ce->block_num, ce);            }        }        for(ce=bc.locked.lru; ce; ce=ce->next) {            if (ce->data == data) {                kprintf("found locked data ptr for bnum %ld @ ce 0x%lx\n",                        ce->block_num, ce);            }        }    }    return 0;}#endif /* DEBUG *//*  this function detaches the cache_ent from the list.*/  static voiddelete_from_list(cache_ent_list *cel, cache_ent *ce){    if (ce->next)        ce->next->prev = ce->prev;    if (ce->prev)        ce->prev->next = ce->next;    if (cel->lru == ce)        cel->lru = ce->next;    if (cel->mru == ce)        cel->mru = ce->prev;    ce->next = NULL;    ce->prev = NULL;}/*  this function adds the cache_ent ce to the head of the  list (i.e. the MRU end).  the cache_ent should *not*  be in any lists.*/  static voidadd_to_head(cache_ent_list *cel, cache_ent *ce){if (ce->next != NULL || ce->prev != NULL) {    panic("*** ath: ce has non-null next/prev ptr (ce 0x%x nxt 0x%x, prv 0x%x)\n",           ce, ce->next, ce->prev);}       ce->next = NULL;    ce->prev = cel->mru;    if (cel->mru)        cel->mru->next = ce;    cel->mru = ce;    if (cel->lru == NULL)        cel->lru = ce;}/*  this function adds the cache_ent ce to the tail of the  list (i.e. the MRU end).  the cache_ent should *not*  be in any lists.*/  static voidadd_to_tail(cache_ent_list *cel, cache_ent *ce){if (ce->next != NULL || ce->prev != NULL) {    panic("*** att: ce has non-null next/prev ptr (ce 0x%x nxt 0x%x, prv 0x%x)\n",           ce, ce->next, ce->prev);}       ce->next = cel->lru;    ce->prev = NULL;    if (cel->lru)        cel->lru->prev = ce;    cel->lru = ce;    if (cel->mru == NULL)        cel->mru = ce;}static intcache_ent_cmp(const void *a, const void *b){    fs_off_t  diff;    cache_ent *p1 = *(cache_ent **)a, *p2 = *(cache_ent **)b;    if (p1 == NULL || p2 == NULL)        panic("cache_ent pointers are null?!? (a 0x%lx, b 0x%lx\n)\n", a, b);    if (p1->dev == p2->dev) {        diff = p1->block_num - p2->block_num;        return (int)diff;    } else {        return p1->dev - p2->dev;    }}static voidcache_flusher(void *arg, int phase){    int    i, num_ents, err;    bigtime_t now = system_time();    static cache_ent *ce = NULL;    static cache_ent *ents[NUM_FLUSH_BLOCKS];    /*       if someone else was in the cache recently then just bail out so       we don't lock them out unnecessarily    */    if ((now - last_cache_access) < 1000000)        return;    LOCK(bc.lock);    ce = bc.normal.lru;        for(num_ents=0; ce && num_ents < NUM_FLUSH_BLOCKS; ce=ce->next) {        if (ce->flags & CE_BUSY)            continue;        if ((ce->flags & CE_DIRTY) == 0 && ce->clone == NULL)            continue;        ents[num_ents] = ce;        ents[num_ents]->flags |= CE_BUSY;        num_ents++;    }    /* if we've got some room left over, look for cloned locked blocks */    if (num_ents < NUM_FLUSH_BLOCKS) {        ce = bc.locked.lru;        for(; num_ents < NUM_FLUSH_BLOCKS;) {            for(;                ce && ((ce->flags & CE_BUSY) || ce->clone == NULL);                ce=ce->next)                /* skip ents that meet the above criteria */;            if (ce == NULL)                break;            ents[num_ents] = ce;            ents[num_ents]->flags |= CE_BUSY;            ce = ce->next;            num_ents++;        }    }    UNLOCK(bc.lock);    if (num_ents == 0)        return;    qsort(ents, num_ents, sizeof(cache_ent **), cache_ent_cmp);    if ((err = flush_ents(ents, num_ents)) != 0) {        printf("flush ents failed (ents @ 0x%lx, num_ents %d!\n",               (ulong)ents, num_ents);    }    for(i=0; i < num_ents; i++) {       /* clear the busy bit on each of ent */        ents[i]->flags &= ~CE_BUSY;    }}static intflush_cache_ent(cache_ent *ce){    int   ret = 0;    void *data;        /* if true, then there's nothing to flush */    if ((ce->flags & CE_DIRTY) == 0 && ce->clone == NULL)        return 0;    /* same thing here */    if (ce->clone == NULL && ce->lock != 0)        return 0; restart:    if (ce->clone)        data = ce->clone;    else        data = ce->data;                /* printf("flush: %7d\n", ce->block_num); */    ret = write_phys_blocks(ce->dev, ce->block_num, data, 1, ce->bsize);    if (ce->func) {        ce->func(ce->logged_bnum, 1, ce->arg);        ce->func = NULL;    }    if (ce->clone) {        free(ce->clone);        ce->clone = NULL;        if (ce->lock == 0 && (ce->flags & CE_DIRTY))            goto restart;     /* also write the real data ptr */    } else {        ce->flags &= ~CE_DIRTY;    }    return ret;}static intflush_ents(cache_ent **ents, int n_ents){    int    i, j, k, ret = 0, bsize, iocnt, do_again = 0;    fs_off_t  start_bnum;    struct iovec *iov;        iov = get_iovec_array();    if (iov == NULL)        return ENOMEM;restart:    for(i=0; i < n_ents; i++) {        /* if true, then there's nothing to flush */        if ((ents[i]->flags & CE_DIRTY) == 0 && ents[i]->clone == NULL)            continue;        /* if true we can't touch the dirty data yet because it's locked */        if (ents[i]->clone == NULL && ents[i]->lock != 0)            continue;                bsize      = ents[i]->bsize;        start_bnum = ents[i]->block_num;        for(j=i+1; j < n_ents && (j - i) < NUM_FLUSH_BLOCKS; j++) {            if (ents[j]->dev != ents[i]->dev ||                ents[j]->block_num != start_bnum + (j - i))                break;            if (ents[j]->clone == NULL && ents[j]->lock != 0)                break;        }                if (j == i+1) {           /* only one block, just flush it directly */            if ((ret = flush_cache_ent(ents[i])) != 0)                break;            continue;        }        for(k=i,iocnt=0; k < j; k++,iocnt++) {            if (ents[k]->clone)                iov[iocnt].iov_base = ents[k]->clone;            else                iov[iocnt].iov_base = ents[k]->data;            iov[iocnt].iov_len = bsize;        }        /* printf("writev @ %ld for %d blocks", start_bnum, iocnt); */        ret = writev_pos(ents[i]->dev, start_bnum * (fs_off_t)bsize,                          &iov[0], iocnt);        if (ret != iocnt*bsize) {            int idx;            printf("flush_ents: writev failed: iocnt %d start bnum %ld "                   "bsize %d, ret %d\n", iocnt, start_bnum, bsize, ret);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合九色综合97婷婷| 国产一区二区三区视频在线播放| 日韩一级片网址| 欧美日韩国产一级片| 欧美日韩一区二区三区在线看| 91在线看国产| 91精品国产一区二区人妖| 欧美一区二区三区四区视频| 中文字幕一区二区三区四区| 亚洲欧美日韩国产手机在线 | 日韩西西人体444www| 中文字幕va一区二区三区| 国产精品免费视频一区| 一区二区三区在线高清| 日韩和的一区二区| 偷窥少妇高潮呻吟av久久免费| 免费av网站大全久久| 国产激情一区二区三区四区| 99久精品国产| 欧美国产日本视频| 精品在线你懂的| 99久久精品免费看| 国产欧美一区二区在线| 亚洲综合色区另类av| 奇米一区二区三区| 欧美三级韩国三级日本一级| 亚洲色图在线视频| 精品影视av免费| 7777精品伊人久久久大香线蕉| 国产亚洲美州欧州综合国| 亚洲综合激情另类小说区| proumb性欧美在线观看| 欧美一区二区三区四区五区| 午夜伦理一区二区| 欧美日韩国产美| 首页综合国产亚洲丝袜| 欧美精品乱码久久久久久按摩| 国产日韩欧美一区二区三区综合| 久久福利资源站| 色偷偷久久人人79超碰人人澡| 欧美mv和日韩mv的网站| 亚洲与欧洲av电影| 欧美日韩中文一区| 日本中文在线一区| 日韩精品中文字幕一区 | 成人国产在线观看| 日韩欧美久久久| 韩国精品免费视频| 制服丝袜一区二区三区| 免费高清成人在线| 国产视频一区在线播放| 99re这里只有精品6| 一区二区欧美在线观看| 91麻豆精品91久久久久久清纯 | 亚洲精品亚洲人成人网在线播放| 精品亚洲porn| 国产日韩精品一区| 91福利视频网站| 中文字幕亚洲一区二区va在线| 91色婷婷久久久久合中文| 中文字幕高清不卡| 91久久奴性调教| 麻豆精品一区二区综合av| 欧美日韩一区二区在线观看视频| 免费看黄色91| 国产精品二三区| 97精品国产97久久久久久久久久久久| 夜夜夜精品看看| 日韩你懂的在线播放| www.爱久久.com| 青青青爽久久午夜综合久久午夜| 国产日产欧美一区二区视频| 91国产成人在线| 国产精品888| 中文字幕成人网| 欧美日韩国产综合久久| 国产乱人伦偷精品视频免下载| 亚洲精品v日韩精品| 久久综合狠狠综合久久综合88 | 欧美性视频一区二区三区| 精品国产91乱码一区二区三区 | 亚洲免费av网站| 欧美一区国产二区| 97精品电影院| 狠狠久久亚洲欧美| 午夜精品aaa| 国产精品美女久久久久久久网站| 欧美一区二区三区性视频| www.色精品| 国产精品91一区二区| 三级影片在线观看欧美日韩一区二区| 中文字幕在线不卡视频| 国产日产欧产精品推荐色| 欧美精品一二三| 91精品1区2区| www.亚洲色图| 国产精品亚洲第一| 精品系列免费在线观看| 日本在线不卡一区| 亚洲图片有声小说| 欧美一区二区精美| 91久久精品一区二区二区| 成人激情小说网站| 国产高清无密码一区二区三区| 日本欧美加勒比视频| 亚洲成av人片在线观看| 久久久高清一区二区三区| 美国av一区二区| 午夜精品福利久久久| 亚洲国产成人高清精品| 一区二区在线观看不卡| 亚洲免费毛片网站| 一区二区三区欧美| 亚洲视频免费在线观看| 亚洲色图视频网| 亚洲精品国产无套在线观| 亚洲日穴在线视频| 一区二区高清免费观看影视大全| 亚洲激情一二三区| 亚洲国产综合色| 午夜影视日本亚洲欧洲精品| 亚洲成av人影院| 午夜在线成人av| 美女看a上一区| 国内外精品视频| 高清久久久久久| 免费视频最近日韩| 美美哒免费高清在线观看视频一区二区| 五月婷婷综合网| 精品一区二区三区在线播放视频| 精品中文字幕一区二区小辣椒| 国产一区二区三区免费在线观看| 国产成人一级电影| 色婷婷综合激情| 欧美精品九九99久久| 日韩欧美三级在线| 国产日韩欧美高清在线| 亚洲精品视频一区二区| 日韩专区在线视频| 国产一区二区三区在线观看精品 | 99re热视频这里只精品| 色国产精品一区在线观看| 777奇米成人网| 久久这里都是精品| 日韩码欧中文字| 麻豆精品国产91久久久久久| 国产成人精品三级麻豆| 欧美性大战久久| 久久综合精品国产一区二区三区| 中文字幕在线观看不卡视频| 亚洲国产精品久久久久秋霞影院| 狠狠狠色丁香婷婷综合久久五月| 成人免费视频视频| 懂色一区二区三区免费观看| 91成人网在线| 久久久综合精品| 亚洲二区视频在线| 国产成人综合视频| 欧美日韩国产中文| 国产精品免费丝袜| 美日韩黄色大片| 91国偷自产一区二区三区观看| 欧美成人精品福利| 亚洲一区二区三区视频在线| 国产在线精品免费av| 欧美三级韩国三级日本一级| 国产欧美一区二区三区在线看蜜臀 | 国产精品传媒入口麻豆| 婷婷成人激情在线网| 99re6这里只有精品视频在线观看| 日韩一区二区在线免费观看| 亚洲另类在线一区| 粉嫩av一区二区三区粉嫩| 欧美一级片在线看| 亚洲精品成人天堂一二三| 国产大陆亚洲精品国产| 69久久99精品久久久久婷婷| 自拍偷拍国产精品| 丁香婷婷综合激情五月色| 日韩欧美国产高清| 偷窥少妇高潮呻吟av久久免费| 91在线视频播放| 国产欧美精品区一区二区三区| 男人的天堂亚洲一区| 欧美区视频在线观看| 亚洲欧美另类久久久精品2019| 粉嫩aⅴ一区二区三区四区 | 亚洲免费在线看| 成人性生交大片免费看在线播放| 日韩精品中午字幕| 日韩电影在线免费观看| 欧美日韩国产123区| 一级精品视频在线观看宜春院 | 国产乱码精品一品二品| 日韩欧美色综合网站| 奇米影视7777精品一区二区| 9191国产精品| 婷婷一区二区三区| 欧美一区二区精品| 九九视频精品免费|