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

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

?? main.c

?? Linux設備驅動程序第二版
?? C
?? 第 1 頁 / 共 2 頁
字號:
    }    if (count > quantum - q_pos)        count = quantum - q_pos; /* write only up to the end of this quantum */    if (copy_from_user (dptr->data[s_pos]+q_pos, buf, count)) {        retval = -EFAULT;        goto nomem;    }    *f_pos += count;     /* update the size */    if (dev->size < *f_pos)        dev->size = *f_pos;    up (&dev->sem);    return count;  nomem:    up (&dev->sem);    return retval;}/* * The ioctl() implementation */int scullv_ioctl (struct inode *inode, struct file *filp,                 unsigned int cmd, unsigned long arg){    int err= 0, ret = 0, tmp;    /* don't even decode wrong cmds: better returning  ENOTTY than EFAULT */    if (_IOC_TYPE(cmd) != SCULLV_IOC_MAGIC) return -ENOTTY;    if (_IOC_NR(cmd) > SCULLV_IOC_MAXNR) return -ENOTTY;    /*     * the type is a bitmask, and VERIFY_WRITE catches R/W     * transfers. Note that the type is user-oriented, while     * verify_area is kernel-oriented, so the concept of "read" and     * "write" is reversed     */    if (_IOC_DIR(cmd) & _IOC_READ)        err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));    else if (_IOC_DIR(cmd) & _IOC_WRITE)        err =  !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));    if (err) return -EFAULT;    switch(cmd) {      case SCULLV_IOCRESET:        scullv_qset = SCULLV_QSET;        scullv_order = SCULLV_ORDER;        break;              case SCULLV_IOCSORDER: /* Set: arg points to the value */        ret = __GET_USER(scullv_order, (int *) arg);        break;      case SCULLV_IOCTORDER: /* Tell: arg is the value */        scullv_order = arg;        break;      case SCULLV_IOCGORDER: /* Get: arg is pointer to result */        ret = __PUT_USER (scullv_order, (int *) arg);        break;      case SCULLV_IOCQORDER: /* Query: return it (it's positive) */        return scullv_order;      case SCULLV_IOCXORDER: /* eXchange: use arg as pointer */        tmp = scullv_order;        ret = __GET_USER(scullv_order, (int *) arg);        if (ret == 0)            ret = __PUT_USER(tmp, (int *) arg);        break;      case SCULLV_IOCHORDER: /* sHift: like Tell + Query */        tmp = scullv_order;        scullv_order = arg;        return tmp;              case SCULLV_IOCSQSET:        ret = __GET_USER(scullv_qset, (int *) arg);        break;      case SCULLV_IOCTQSET:        scullv_qset = arg;        break;      case SCULLV_IOCGQSET:        ret = __PUT_USER(scullv_qset, (int *)arg);        break;      case SCULLV_IOCQQSET:        return scullv_qset;      case SCULLV_IOCXQSET:        tmp = scullv_qset;        ret = __GET_USER(scullv_qset, (int *) arg);        if (ret == 0)            ret = __PUT_USER(tmp, (int *)arg);        break;      case SCULLV_IOCHQSET:        tmp = scullv_qset;        scullv_qset = arg;        return tmp;      default:  /* redundant, as cmd was checked against MAXNR */        return -ENOTTY;    }    return ret;}/* * The "extended" operations */loff_t scullv_llseek (struct file *filp, loff_t off, int whence){    ScullV_Dev *dev = filp->private_data;    long newpos;    switch(whence) {      case 0: /* SEEK_SET */        newpos = off;        break;      case 1: /* SEEK_CUR */        newpos = filp->f_pos + off;        break;      case 2: /* SEEK_END */        newpos = dev->size + off;        break;      default: /* can't happen */        return -EINVAL;    }    if (newpos<0) return -EINVAL;    filp->f_pos = newpos;    return newpos;} /* * Mmap *is* available, but confined in a different file */#ifndef LINUX_20extern int scullv_mmap(struct file *filp, struct vm_area_struct *vma);#elseextern int scullv_mmap(struct inode *inode, struct file *filp,		struct vm_area_struct *vma);#endif/* * The 2.0 wrappers */#ifdef LINUX_20int scullv_lseek_20 (struct inode *ino, struct file *f,                off_t offset, int whence){    return (int)scullv_llseek(f, offset, whence);}int scullv_read_20 (struct inode *ino, struct file *f, char *buf, int count){    return (int)scullv_read(f, buf, count, &f->f_pos);}int scullv_write_20 (struct inode *ino, struct file *f, const char *b, int c){    return (int)scullv_write(f, b, c, &f->f_pos);}void scullv_release_20 (struct inode *ino, struct file *f){    scullv_release(ino, f);}#define scullv_llseek scullv_lseek_20#define scullv_read scullv_read_20#define scullv_write scullv_write_20#define scullv_release scullv_release_20#define llseek lseek#endif /* LINUX_20 *//* * The fops */struct file_operations scullv_fops = {    llseek: scullv_llseek,    read: scullv_read,    write: scullv_write,    ioctl: scullv_ioctl,    mmap: scullv_mmap,    open: scullv_open,    release: scullv_release,};int scullv_trim(ScullV_Dev *dev){    ScullV_Dev *next, *dptr;    int qset = dev->qset;   /* "dev" is not-null */    int i;    if (dev->vmas) /* don't trim: there are active mappings */        return -EBUSY;    for (dptr = dev; dptr; dptr = next) { /* all the list items */        if (dptr->data) {            /* Release the quantum-set */            for (i = 0; i < qset; i++)                if (dptr->data[i])                    vfree(dptr->data[i]);            kfree(dptr->data);            dptr->data=NULL;        }        next=dptr->next;        if (dptr != dev) kfree(dptr); /* all of them but the first */    }    dev->size = 0;    dev->qset = scullv_qset;    dev->order = scullv_order;    dev->next = NULL;    return 0;}/* * Finally, the module stuff */int scullv_init(void){    int result, i;    SET_MODULE_OWNER(&scullv_fops);    /*     * Register your major, and accept a dynamic number     */    result = register_chrdev(scullv_major, "scullv", &scullv_fops);    if (result < 0) return result;    if (scullv_major == 0) scullv_major = result; /* dynamic */    /*      * allocate the devices -- we can't have them static, as the number     * can be specified at load time     */    scullv_devices = kmalloc(scullv_devs * sizeof (ScullV_Dev), GFP_KERNEL);    if (!scullv_devices) {        result = -ENOMEM;        goto fail_malloc;    }    memset(scullv_devices, 0, scullv_devs * sizeof (ScullV_Dev));    for (i=0; i < scullv_devs; i++) {        scullv_devices[i].order = scullv_order;        scullv_devices[i].qset = scullv_qset;        sema_init (&scullv_devices[i].sem, 1);    }#ifdef SCULLV_USE_PROC /* only when available */    create_proc_read_entry("scullvmem", 0, NULL, scullv_read_procmem, NULL);#endif    return 0; /* succeed */  fail_malloc:    unregister_chrdev(scullv_major, "scullv");    return result;}void scullv_cleanup(void){    int i;    unregister_chrdev(scullv_major, "scullv");#ifdef SCULLV_USE_PROC    remove_proc_entry("scullvmem", 0);#endif    for (i=0; i<scullv_devs; i++)        scullv_trim(scullv_devices+i);    kfree(scullv_devices);}module_init(scullv_init);module_exit(scullv_cleanup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一区二区免费| 91成人免费在线视频| 亚洲国产精品久久人人爱| 亚洲黄色性网站| 中文字幕中文字幕中文字幕亚洲无线 | 免费在线观看一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 亚洲免费av高清| 亚洲精品写真福利| 亚洲一区二区三区免费视频| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧美日韩国产一区二区三区| 亚洲人成网站色在线观看| 亚洲一区二区在线视频| 日本欧美久久久久免费播放网| 精品一区在线看| 成人免费黄色大片| 色av成人天堂桃色av| 91麻豆精品国产91久久久 | 午夜激情综合网| 免费av网站大全久久| 国产乱人伦偷精品视频不卡| 国产高清精品久久久久| 色妹子一区二区| 欧美一二三区在线| 中文字幕一区三区| 日本不卡一区二区| 粗大黑人巨茎大战欧美成人| 91成人看片片| 久久亚洲精品国产精品紫薇| 中文字幕一区二区视频| 日韩国产欧美三级| 丁香婷婷综合色啪| 欧美精品亚洲二区| 国产欧美一区二区精品性色| 亚洲午夜一区二区三区| 国产福利一区在线| 91精品国产乱码久久蜜臀| 国产精品美女久久久久久久久久久| 亚洲国产一区二区在线播放| 国内精品视频666| 欧美亚洲自拍偷拍| 国产欧美一区二区精品性| 三级影片在线观看欧美日韩一区二区 | 成年人午夜久久久| 91精品国产一区二区| ...xxx性欧美| 国产毛片精品国产一区二区三区| 在线观看日韩毛片| 三级一区在线视频先锋| www.久久精品| 久久久影院官网| 日韩高清在线观看| 色乱码一区二区三区88| 国产免费成人在线视频| 老司机午夜精品| 欧美二区乱c少妇| 亚洲国产裸拍裸体视频在线观看乱了 | 国产欧美精品区一区二区三区 | 久久综合久久综合久久| 香蕉av福利精品导航| 国产91丝袜在线播放| 欧美精品一区二区精品网| 午夜视频一区在线观看| 欧美性xxxxx极品少妇| 国产精品家庭影院| 成人一级片在线观看| 国产日韩欧美一区二区三区综合 | 国产精品沙发午睡系列990531| 五月婷婷综合网| 欧美日韩国产精品自在自线| 亚洲图片一区二区| 欧美日韩国产小视频在线观看| 亚洲国产精品久久不卡毛片| 欧美日韩一区二区三区不卡| 亚洲一区二区五区| 欧美日韩综合在线| 亚洲国产中文字幕| 777午夜精品免费视频| 日韩成人精品在线观看| 欧美tickling挠脚心丨vk| 麻豆视频一区二区| 国产网站一区二区三区| 国产成人免费视频精品含羞草妖精| 精品美女一区二区| 成人黄色一级视频| 一二三四社区欧美黄| 欧美视频一区二区在线观看| 日本中文在线一区| 精品国产百合女同互慰| 国产99久久久久久免费看农村| 欧美国产精品中文字幕| 色就色 综合激情| 日韩不卡一区二区三区| 久久奇米777| 一本大道久久a久久精品综合| 亚洲综合偷拍欧美一区色| 欧美一区二区三级| 国产美女娇喘av呻吟久久| 国产精品伦理在线| 欧美色精品在线视频| 美女视频黄免费的久久 | 久久新电视剧免费观看| 北条麻妃一区二区三区| 亚洲一卡二卡三卡四卡五卡| 日韩欧美国产精品| 成人av在线影院| 日韩福利电影在线| 国产精品美女久久久久久久网站| 久久久高清一区二区三区| 99久久综合99久久综合网站| 亚洲成人先锋电影| 国产精品丝袜91| 91精品国产一区二区三区| 不卡欧美aaaaa| 蜜桃在线一区二区三区| 亚洲日本va午夜在线影院| 日韩精品专区在线影院重磅| 日本乱码高清不卡字幕| 国产很黄免费观看久久| 亚洲成人一二三| 中文字幕日韩欧美一区二区三区| 日韩免费性生活视频播放| 91一区二区在线| 国产精品 日产精品 欧美精品| 亚洲韩国一区二区三区| 国产精品动漫网站| 久久综合av免费| 日韩精品在线一区| 欧美熟乱第一页| 日本精品视频一区二区三区| 成人在线综合网站| 国产资源精品在线观看| 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产另类精品专区| 一区二区在线观看视频| 1000部国产精品成人观看| 久久久不卡影院| 久久久不卡影院| 精品国产一二三区| 欧美va亚洲va| 日韩一区二区三区av| 欧美另类久久久品| 欧美三区在线观看| 精品视频一区 二区 三区| 一本色道a无线码一区v| 91蝌蚪porny九色| 97精品电影院| 日本电影欧美片| 成人黄色软件下载| 成人sese在线| 91在线观看美女| 99精品久久免费看蜜臀剧情介绍| 成人激情动漫在线观看| 成人av网站在线| 91在线观看下载| 在线观看国产一区二区| 欧美无砖专区一中文字| 欧美日韩二区三区| 91精品午夜视频| 欧美精品一区二区三区久久久| 337p粉嫩大胆色噜噜噜噜亚洲| 亚洲精品一区二区三区在线观看| 日韩精品资源二区在线| 久久新电视剧免费观看| 国产精品狼人久久影院观看方式| 国产精品久久久久影院老司| 亚洲精品你懂的| 日韩国产欧美三级| 国产精品一品视频| 色域天天综合网| 日韩色视频在线观看| 久久综合九色欧美综合狠狠| 中文字幕在线一区| 日韩影院免费视频| 韩国av一区二区三区四区| 丁香激情综合国产| 欧美在线免费播放| 精品伦理精品一区| 亚洲女人的天堂| 麻豆国产91在线播放| 波多野结衣91| 欧美电影免费观看高清完整版在线| 久久久久久久综合狠狠综合| 亚洲欧美日韩系列| 久久精品国产亚洲高清剧情介绍 | 中文字幕在线免费不卡| 亚洲国产三级在线| 国产精品一区免费视频| 欧美午夜电影网| 日本一区二区电影| 日韩极品在线观看| 99久久免费国产| 欧美电视剧免费全集观看| 亚洲欧洲成人精品av97| 久久99日本精品| 欧美午夜宅男影院| 国产精品麻豆一区二区| 蜜臀av一区二区在线免费观看| 91在线你懂得|