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

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

?? kernel.c

?? be文件系統實現的源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
    vn->ns->vnodes.head = vn;    return 0;}static voidmove_vnode(vnode *vn, int list){    if (vn->list.prev)        vn->list.prev->list.next = vn->list.next;    else        lists[vn->inlist].head = vn->list.next;    if (vn->list.next)        vn->list.next->list.prev = vn->list.prev;    else        lists[vn->inlist].tail = vn->list.prev;    lists[vn->inlist].num--;    vn->inlist = list;    vn->list.next = NULL;    vn->list.prev = lists[list].tail;    if (vn->list.prev)        vn->list.prev->list.next = vn;    else        lists[list].head = vn;    lists[list].tail = vn;    lists[list].num++;}static vnode *steal_vnode(int list){    vnode       *vn;    vn = lists[list].head;    if (!vn)        return NULL;    move_vnode(vn, LOCKED_LIST);    return vn;}static voidflush_vnode(vnode *vn, char r){    int     err;    vn->busy = TRUE;    UNLOCK(vnlock);    err = (*vn->ns->fs->ops.release_vnode)(vn->ns->data, vn->data, r);    if (err)        PANIC("ERROR WRITING VNODE!!!\n");    LOCK(vnlock);    vn->busy = FALSE;    clear_vnode(vn);}static vnode *lookup_vnode(nspace_id nsid, vnode_id vnid){    vnode       fakevn;    nspace      fakens;    fakens.nsid = nsid;    fakevn.ns = &fakens;    fakevn.vnid = vnid;    return SearchSL(skiplist, &fakevn);}static intload_vnode(nspace_id nsid, vnode_id vnid, char r, vnode **vnp){    int             err;    vnode           *vn;    LOCK(vnlock);    while (TRUE) {        vn = lookup_vnode(nsid, vnid);        if (vn)            if (vn->busy) {                UNLOCK(vnlock);                snooze(SLEEP_TIME);                LOCK(vnlock);                continue;            } else                break;        vn = steal_vnode(FREE_LIST);        if (!vn) {            vn = steal_vnode(USED_LIST);            if (!vn)                PANIC("OUT OF VNODE!!!\n");        } else            break;        flush_vnode(vn, r);        move_vnode(vn, FREE_LIST);    }    if (vn->ns == NULL) {        vn->ns = nsidtons(nsid);        if (!vn->ns) {            err = ENOENT;            goto error1;        }        vn->vnid = vnid;        vn->busy = TRUE;        err = sort_vnode(vn);        if (err)            goto error2;        move_vnode(vn, LOCKED_LIST);        UNLOCK(vnlock);        err = (*vn->ns->fs->ops.read_vnode)(vn->ns->data, vnid, r, &vn->data);        LOCK(vnlock);        vn->busy = FALSE;        if (err)            goto error2;        vn->rcnt = 1;    } else {        vn->rcnt++;        if (vn->rcnt == 1)            move_vnode(vn, LOCKED_LIST);    }    *vnp = vn;    UNLOCK(vnlock);    return 0;error2:    clear_vnode(vn);error1:    move_vnode(vn, FREE_LIST);    UNLOCK(vnlock);    return err;}static intcompare_vnode(vnode *vna, vnode *vnb){    if (vna->vnid > vnb->vnid)        return 1;    else        if (vna->vnid < vnb->vnid)            return -1;        else            if (vna->ns->nsid > vnb->ns->nsid)                return 1;            else                if (vna->ns->nsid < vnb->ns->nsid)                    return -1;                else                    return 0;}/* * path management functions */intnew_path(const char *path, char **copy){    const char  *q, *r;    char        *p;    int         l, s;    if (!path) {        *copy = NULL;        return 0;    }    l = strlen(path);    if (l == 0)        return ENOENT;    s = l;    if (path[l-1] == '/')        s++;    if (l >= MAXPATHLEN)        return ENAMETOOLONG;    q = path;    while(*q != '\0') {        while (*q == '/')            q++;        r = q;        while ((*q != '/') && (*q != '\0'))            q++;        if (q - r >= FILE_NAME_LENGTH)            return ENAMETOOLONG;            }    p = (char *) malloc(s+1);    if (!p)        return ENOMEM;    /* ### do real checking: MAXPATHLEN, max file name len, buffer address... */    strcpy(p, path);        if (p[l-1] == '/') {        p[l] = '.';        p[l+1] = '\0';    }    *copy = p;    return 0;}voidfree_path(char *p){    if (p) {        free(p);    }}static char *cat_paths(char *a, char *b){    char        *p;    p = (char *) realloc(a, strlen(a) + strlen(b) + 2);    if (!p)        return NULL;    strcat(p, "/");    strcat(p, b);    return p;}/*  * mount point management functions */static intis_mount_vnode(vnode *mount, vnode **root){    nspace      *ns;    LOCK(vnlock);    ns = mount->mounted;    if (ns) {        *root = ns->root;        ns->root->rcnt++;    }    UNLOCK(vnlock);    return (ns != NULL);        }static intis_mount_vnid(nspace_id nsid, vnode_id vnid, vnode_id *mount){    nspace      *ns;    for(ns = nshead; ns; ns = ns->next) {        if (!ns->mount)            continue;        if (ns->mount->ns->nsid != nsid)            continue;        if (ns->mount->vnid != vnid)            continue;        *mount = ns->root->vnid;        return TRUE;    }    return FALSE;}static intis_root(vnode *root, vnode **mount){    if ((root->ns->root == root) && root->ns->mount) {        *mount = root->ns->mount;        inc_vnode(*mount);        return TRUE;    } else        return FALSE;}/* * file descriptor management functions */ static ofile *get_fd(bool kernel, int fd, int type){    ofile       *f;    fdarray     *fds;    f = NULL;    if (kernel)        fds = global_fds;    else        fds = get_cur_ioctx()->fds;    LOCK(fds->lock);    if ((fd >= 0) && (fd < fds->num) && fds->fds[fd]) {        f = fds->fds[fd];        if (f->type & type)            atomic_add(&f->rcnt, 1);        else            f = NULL;    }    UNLOCK(fds->lock);    return f;}static intput_fd(ofile *f){    long            cnt;    cnt = atomic_add(&f->rcnt, -1);    if (cnt == 1)        invoke_free(f);    return 0;}static intnew_fd(bool kernel, int nfd, ofile *f, int fd, bool coe){    int         i, j, num, end;    fdarray     *fds;    ofile       *of;    int         err;    long        cnt;    if (kernel)        fds = global_fds;    else        fds = get_cur_ioctx()->fds;    LOCK(fds->lock);    num = fds->num;    if (!f) {        if ((fd < 0) || (fd >= num)) {            err = EBADF;            goto error1;        }        f = fds->fds[fd];        if (!f) {            err = EBADF;            goto error1;        }    }    atomic_add(&f->rcnt, 1);    atomic_add(&f->ocnt, 1);    if (nfd >= 0) {        if (nfd >= num) {            err = EBADF;            goto error2;        }        of = fds->fds[nfd];        fds->fds[nfd] = f;        SETBIT(fds->alloc, nfd, TRUE);        SETBIT(fds->coes, nfd, coe);        UNLOCK(fds->lock);        if (of) {            cnt = atomic_add(&of->ocnt, -1);            if (cnt == 1)                invoke_close(of);            cnt = atomic_add(&of->rcnt, -1);            if (cnt == 1)                invoke_free(of);        }        return nfd;    }    end = num & ~31;    for(j=0; j<end; j+=32)        if (fds->alloc[j/32] != 0xffffffff)            for(i=j; i<j+32; i++)                if (!GETBIT(fds->alloc, i))                    goto found;    for(i=end; i<num; i++)        if (!GETBIT(fds->alloc, i))            goto found;    err = EMFILE;    goto error2;found:    SETBIT(fds->alloc, i, 1);    fds->fds[i] = f;    SETBIT(fds->coes, i, coe);    UNLOCK(fds->lock);    return i;error2:    atomic_add(&f->rcnt, -1);    atomic_add(&f->ocnt, -1);error1:    UNLOCK(fds->lock);    return err;}static intremove_fd(bool kernel, int fd, int type){    ofile       *f;    fdarray     *fds;    long        cnt;    int         err;    f = NULL;    if (kernel)        fds = global_fds;    else        fds = get_cur_ioctx()->fds;    LOCK(fds->lock);    if ((fd >= 0) && (fd < fds->num) && fds->fds[fd]) {        f = fds->fds[fd];        if (f->type == type) {            SETBIT(fds->alloc, fd, 0);            fds->fds[fd] = NULL;        } else            f = NULL;    }    UNLOCK(fds->lock);    if (f == NULL)        return EBADF;    err = 0;    cnt = atomic_add(&f->ocnt, -1);    if (cnt == 1)        err = invoke_close(f);    cnt = atomic_add(&f->rcnt, -1);    if (cnt == 1)        invoke_free(f);    return err;}static intget_coe(bool kernel, int fd, int type, bool *coe){    ofile       *f;    fdarray     *fds;    f = NULL;    if (kernel)        fds = global_fds;    else        fds = get_cur_ioctx()->fds;    LOCK(fds->lock);    if ((fd >= 0) && (fd < fds->num) && fds->fds[fd]) {        f = fds->fds[fd];        if (f->type == type) {            *coe = GETBIT(fds->coes, fd);            UNLOCK(fds->lock);            return 0;        }    }    UNLOCK(fds->lock);    return EBADF;}static intset_coe(bool kernel, int fd, int type, bool coe){    ofile       *f;    fdarray     *fds;    f = NULL;    if (kernel)        fds = global_fds;    else        fds = get_cur_ioctx()->fds;    LOCK(fds->lock);    if ((fd >= 0) && (fd < fds->num) && fds->fds[fd]) {        f = fds->fds[fd];        if (f->type == type) {            SETBIT(fds->coes, fd, coe);            UNLOCK(fds->lock);            return 0;        }    }    UNLOCK(fds->lock);    return EBADF;}static intget_omode(bool kernel, int fd, int type, int *omode){    ofile       *f;    fdarray     *fds;    f = NULL;    if (kernel)        fds = global_fds;    else        fds = get_cur_ioctx()->fds;    LOCK(fds->lock);    if ((fd >= 0) && (fd < fds->num) && fds->fds[fd]) {        f = fds->fds[fd];        if (f->type == type) {            *omode = f->omode;            UNLOCK(fds->lock);            return 0;        }    }    UNLOCK(fds->lock);    return EBADF;}static intinvoke_close(ofile *f){    int     err;    vnode   *vn;    vn = f->vn;    switch (f->type) {    case FD_FILE:        err = (*vn->ns->fs->ops.close)(vn->ns->data, vn->data, f->cookie);        break;    case FD_DIR:        err = (*vn->ns->fs->ops.closedir)(vn->ns->data, vn->data, f->cookie);        break;    case FD_WD:    default:        err = 0;        break;    }    return err;}static intinvoke_free(ofile *f){    vnode           *vn;    op_free_cookie  *op = NULL;    vn = f->vn;    switch(f->type) {    case FD_FILE:        op = vn->ns->fs->ops.free_cookie;        break;    case FD_DIR:        op = vn->ns->fs->ops.free_dircookie;        break;    case FD_WD:        op = NULL;        break;    }    if (op)        (*op)(vn->ns->data, vn->data, f->cookie);    dec_vnode(vn, FALSE);    free(f);    return 0;}/* * other routines */static nspace *nsidtons(nspace_id nsid){    nspace      *ns;    ns = nstab[nsid % nns];    if (!ns || (ns->nsid != nsid) || ns->shutdown)        return NULL;    return ns;}static intalloc_wd_fd(bool kernel, vnode *vn, bool coe, int *fdp){    int             err;    ofile           *f;    int             nfd;    /*    find a file descriptor    */    f = (ofile *) calloc(sizeof(ofile), 1);    if (!f) {        err = ENOMEM;        goto error1;    }    f->type = FD_WD;    f->vn = vn;    f->rcnt = 0;    f->ocnt = 0;    nfd = new_fd(kernel, -1, f, -1, coe);    if (nfd < 0) {        err = EMFILE;        goto error2;    }    *fdp = nfd;    return 0;error2:    free(f);error1:    return err;}/* * file system operations */void *install_file_system(vnode_ops *ops, const char *name, bool fixed, image_id aid){    fsystem     *fs;    int         i;    fs = (fsystem *) malloc(sizeof(fsystem));    if (!fs)        return NULL;    memcpy(&fs->ops, ops, sizeof(vnode_ops));    strcpy(fs->name, name);    fs->rcnt = 1;    fs->fixed = fixed;    fs->aid = aid;    for(i=0; i<nfs; i++, nxfsid++)        if (!fstab[nxfsid % nfs]) {            fstab[nxfsid % nfs] = fs;            fs->fsid = nxfsid;            nxfsid++;            break;        }    if (i == nfs) {        free(fs);        return NULL;    }    return (void *)fs;}static fsystem *load_file_system(const char *name){    return NULL;}static intunload_file_system(fsystem *fs){    fstab[fs->fsid % nfs] = NULL;    free(fs);    return 0;}static fsystem *inc_file_system(const char *name){    fsystem         *fs;    int             i;    fs = NULL;    LOCK(fstablock);    for(i=0; i<nfs; i++)        if (fstab[i] && !strcmp(fstab[i]->name, name)) {            fs = fstab[i];            fs->rcnt++;            break;        }    if (!fs)        fs = load_file_system(name);    UNLOCK(fstablock);    return fs;}static intdec_file_system(fsystem *fs){    LOCK(fstablock);    fs->rcnt--;    if (!fs->fixed && (fs->rcnt == 0))        unload_file_system(fs);    UNLOCK(fstablock);    return 0;}static fdarray *new_fds(int num){    fdarray *fds;    size_t      sz;    sz = sizeof(fdarray) + (num-1) * sizeof(void *) + 2*BITSZ(num);    fds = (fdarray *) malloc(sz);    if (!fds)        return NULL;    memset(fds, 0, sz);    fds->rcnt = 1;    if (new_lock(&fds->lock, "fdlock") < 0) {        free(fds);        return NULL;    }    fds->num = num;    fds->alloc = (ulong *) &fds->fds[num];    fds->coes = &fds->alloc[BITSZ(num) / sizeof(ulong)];    return fds;}static intfree_fds(fdarray *fds){    long    cnt;    int     i;    ofile   *f;    for(i=0; i<fds->num; i++)        if (fds->fds[i]) {            f = fds->fds[i];            cnt = atomic_add(&f->ocnt, -1);            if (cnt == 1)                invoke_close(f);            cnt = atomic_add(&f->rcnt, -1);            if (cnt == 1)                invoke_free(f);        }    delete_sem(fds->lock.s);    free(fds);    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人在线视频首页| 99精品热视频| 成人三级在线视频| 色婷婷激情综合| 26uuu亚洲综合色欧美| 亚洲制服丝袜av| 1024国产精品| 一区二区成人在线视频 | 亚洲午夜av在线| 韩国一区二区三区| 欧美中文字幕一区二区三区| 26uuu亚洲综合色| 石原莉奈在线亚洲二区| 99久久伊人网影院| 久久综合999| 日韩国产欧美视频| 色综合久久88色综合天天| 久久久精品综合| 免费高清成人在线| 在线不卡免费欧美| 亚洲免费资源在线播放| 丁香激情综合国产| 久久精品人人做人人爽97| 久久狠狠亚洲综合| 日韩一区二区精品| 日韩和欧美的一区| 日韩欧美的一区| 午夜不卡av在线| 色妹子一区二区| 中文字幕中文在线不卡住| 国产一区二区三区黄视频 | 99久久精品费精品国产一区二区| 欧美xxxx老人做受| 麻豆91在线看| 日韩午夜激情免费电影| 丝袜美腿亚洲一区| 欧美一卡在线观看| 日韩电影网1区2区| 日韩视频在线你懂得| 日韩av一区二区在线影视| 欧美日韩在线综合| 香港成人在线视频| 欧美精品在线观看播放| 午夜在线成人av| 91精品中文字幕一区二区三区| 亚洲国产日韩a在线播放性色| 日本高清不卡视频| 亚洲国产精品一区二区www在线| 99视频有精品| 亚洲一线二线三线视频| 欧美日韩在线精品一区二区三区激情| 亚洲精品va在线观看| 欧美伊人久久大香线蕉综合69| 一区二区欧美国产| 正在播放亚洲一区| 精品在线免费视频| 国产精品丝袜一区| 91蜜桃在线免费视频| 亚洲综合激情网| 欧美一区二区三区性视频| 捆绑变态av一区二区三区 | 欧美三级中文字| 美女视频黄久久| 中文字幕不卡一区| 欧美亚洲日本国产| 久久精品免费观看| 国产欧美日韩在线观看| 色哟哟亚洲精品| 琪琪一区二区三区| 日本一区二区三区久久久久久久久不| caoporen国产精品视频| 香蕉久久夜色精品国产使用方法 | 亚洲视频一区二区免费在线观看 | 99久久精品国产精品久久| 午夜久久电影网| 国产无一区二区| 欧美怡红院视频| 国内精品国产成人| 一区二区三区免费在线观看| 欧美一区二区女人| 99久久99久久免费精品蜜臀| 五月天网站亚洲| 日本一区二区三区dvd视频在线| 日本久久一区二区三区| 九九国产精品视频| 亚洲狠狠爱一区二区三区| 久久综合资源网| 欧美三级视频在线| 国产精选一区二区三区| 亚洲成av人综合在线观看| 国产三级三级三级精品8ⅰ区| 日本乱人伦aⅴ精品| 国产成人在线影院| 男女视频一区二区| 亚洲激情中文1区| 国产色产综合产在线视频| 欧美日韩aaa| 91视频免费播放| 国产自产2019最新不卡| 日韩国产欧美在线观看| 一区二区三区电影在线播| 精品国产sm最大网站免费看| 色国产综合视频| 91小视频免费看| 成人国产精品免费观看| 国产九九视频一区二区三区| 美女在线一区二区| 肉丝袜脚交视频一区二区| 亚洲精品国产无天堂网2021| 国产精品沙发午睡系列990531| 精品剧情v国产在线观看在线| 日韩毛片精品高清免费| 7777女厕盗摄久久久| 在线精品亚洲一区二区不卡| 成人app下载| 成人aa视频在线观看| 国产成人高清在线| 国产成人欧美日韩在线电影| 国产一区二区三区| 国产在线精品一区二区| 久久99精品久久只有精品| 久久精品免费看| 麻豆91在线看| 九色porny丨国产精品| 久久91精品久久久久久秒播| 精品无人码麻豆乱码1区2区 | 亚洲成人在线网站| 亚洲一二三区在线观看| 亚洲国产一区在线观看| 亚洲va韩国va欧美va精品 | 中文字幕一区二区三区色视频| 国产欧美日韩久久| 日韩一区在线看| 亚洲午夜精品网| 日韩不卡在线观看日韩不卡视频| 亚洲成人免费av| 日韩电影在线免费看| 狠狠色丁香久久婷婷综| 高清不卡一二三区| 91蝌蚪porny九色| 欧美精选一区二区| 精品成人一区二区三区| 欧美国产日韩亚洲一区| 日韩毛片在线免费观看| 亚洲韩国精品一区| 麻豆一区二区三区| 北条麻妃国产九九精品视频| 一本到一区二区三区| 91 com成人网| 日本一区二区三级电影在线观看| 成人免费一区二区三区在线观看| 一区二区三区在线观看欧美| 日本免费新一区视频| 国产精品一级二级三级| 色婷婷综合五月| 日韩欧美视频一区| 中文字幕日韩精品一区| 日本中文在线一区| av成人免费在线| 日韩欧美123| 亚洲欧美激情插| 激情综合五月婷婷| 欧美色综合网站| 中文成人综合网| 视频一区视频二区在线观看| 东方欧美亚洲色图在线| 欧美四级电影在线观看| 国产午夜亚洲精品不卡| 日韩综合在线视频| 色综合激情五月| 国产亚洲欧美色| 日韩专区中文字幕一区二区| eeuss鲁片一区二区三区| 日韩午夜激情电影| 亚洲1区2区3区视频| 白白色亚洲国产精品| 精品久久国产老人久久综合| 一区二区三区在线视频播放| 风间由美一区二区av101| 欧美一区午夜精品| 天天综合天天综合色| 97国产精品videossex| 欧美国产日韩亚洲一区| 国产自产v一区二区三区c| 欧美疯狂做受xxxx富婆| 亚洲一区二区3| 97精品超碰一区二区三区| 中文字幕免费观看一区| 激情欧美一区二区| 欧美tickling挠脚心丨vk| 亚洲第一会所有码转帖| 日本韩国一区二区三区| 成人免费在线视频| 成人网页在线观看| 亚洲国产高清aⅴ视频| 国产成人免费视频| 欧美激情中文不卡| 粉嫩一区二区三区在线看| 久久久不卡影院| 国产成都精品91一区二区三|