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

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

?? sbull.c

?? linux device driver源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
#endif                                  {    while(1) {        INIT_REQUEST;        printk("<1>request %p: cmd %i sec %li (nr. %li)\n", CURRENT,               CURRENT->cmd,               CURRENT->sector,               CURRENT->current_nr_sectors);        end_request(1); /* success */    }}#elif defined(SBULL_MULTIQUEUE)  /* 2.4 only *//* * Clean up this request. */int sbull_end_request(struct request *req, int status){    if (end_that_request_first(req, status, DEVICE_NAME))        return 1;    end_that_request_last(req);    return 0;}void sbull_request(request_queue_t *q){    Sbull_Dev *device;    struct request *req;    int status;    /* Find our device */    device = sbull_locate_device (blkdev_entry_next_request(&q->queue_head));    if (device->busy) /* no race here - io_request_lock held */        return;    device->busy = 1;    /* Process requests in the queue */    while(! list_empty(&q->queue_head)) {    /* Pull the next request off the list. */        req = blkdev_entry_next_request(&q->queue_head);        blkdev_dequeue_request(req);        spin_unlock_irq (&io_request_lock);        spin_lock(&device->lock);    /* Process all of the buffers in this (possibly clustered) request. */        do {            status = sbull_transfer(device, req);        } while (end_that_request_first(req, status, DEVICE_NAME));        spin_unlock(&device->lock);        spin_lock_irq (&io_request_lock);        end_that_request_last(req);    }    device->busy = 0;}/* * Tell the block layer where to queue a request. */request_queue_t *sbull_find_queue(kdev_t device){    int devno = DEVICE_NR(device);    if (devno >= sbull_devs) {        static int count = 0;        if (count++ < 5) /* print the message at most five times */            printk(KERN_WARNING "sbull: request for unknown device\n");        return NULL;    }    return &sbull_devices[devno].queue;}#else /* not SBULL_MULTIQUEUE */#ifdef LINUX_24                                 void sbull_request(request_queue_t *q)#else                                           void sbull_request()                            #endif                                          {    Sbull_Dev *device;    int status;    while(1) {        INIT_REQUEST;  /* returns when queue is empty */        /* Which "device" are we using? */        device = sbull_locate_device (CURRENT);        if (device == NULL) {            end_request(0);            continue;        }        /* Perform the transfer and clean up. */	spin_lock(&device->lock);        status = sbull_transfer(device, CURRENT);        spin_unlock(&device->lock);        end_request(status);     }}#endif /* not SBULL_EMPTY_REQUEST nor SBULL_MULTIQUEUE *//* * Finally, the module stuff */int sbull_init(void){    int result, i;    /*     * Copy the (static) cfg variables to public prefixed ones to allow     * snoozing with a debugger.     */    sbull_major    = major;    sbull_devs     = devs;    sbull_rahead   = rahead;    sbull_size     = size;    sbull_blksize  = blksize;    sbull_hardsect = hardsect;#ifdef LINUX_20    /* Hardsect can't be changed :( */    if (hardsect != 512) {        printk(KERN_ERR "sbull: can't change hardsect size\n");        hardsect = sbull_hardsect = 512;    }#endif    /*     * Register your major, and accept a dynamic number     */    result = register_blkdev(sbull_major, "sbull", &sbull_bdops);    if (result < 0) {        printk(KERN_WARNING "sbull: can't get major %d\n",sbull_major);        return result;    }    if (sbull_major == 0) sbull_major = result; /* dynamic */    major = sbull_major; /* Use `major' later on to save typing */    /*     * Assign the other needed values: request, rahead, size, blksize,     * hardsect. All the minor devices feature the same value.     * Note that `sbull' defines all of them to allow testing non-default     * values. A real device could well avoid setting values in global     * arrays if it uses the default values.     */    read_ahead[major] = sbull_rahead;    result = -ENOMEM; /* for the possible errors */    sbull_sizes = kmalloc(sbull_devs * sizeof(int), GFP_KERNEL);    if (!sbull_sizes)        goto fail_malloc;    for (i=0; i < sbull_devs; i++) /* all the same size */        sbull_sizes[i] = sbull_size;    blk_size[major]=sbull_sizes;    sbull_blksizes = kmalloc(sbull_devs * sizeof(int), GFP_KERNEL);    if (!sbull_blksizes)        goto fail_malloc;    for (i=0; i < sbull_devs; i++) /* all the same blocksize */        sbull_blksizes[i] = sbull_blksize;    blksize_size[major]=sbull_blksizes;    sbull_hardsects = kmalloc(sbull_devs * sizeof(int), GFP_KERNEL);    if (!sbull_hardsects)        goto fail_malloc;    for (i=0; i < sbull_devs; i++) /* all the same hardsect */        sbull_hardsects[i] = sbull_hardsect;    hardsect_size[major]=sbull_hardsects;    /* FIXME: max_readahead and max_sectors */         /*      * allocate the devices -- we can't have them static, as the number     * can be specified at load time     */    sbull_devices = kmalloc(sbull_devs * sizeof (Sbull_Dev), GFP_KERNEL);    if (!sbull_devices)        goto fail_malloc;    memset(sbull_devices, 0, sbull_devs * sizeof (Sbull_Dev));    for (i=0; i < sbull_devs; i++) {        /* data and usage remain zeroed */        sbull_devices[i].size = 1024 * sbull_size;        init_timer(&(sbull_devices[i].timer));        sbull_devices[i].timer.data = (unsigned long)(sbull_devices+i);        sbull_devices[i].timer.function = sbull_expires;        spin_lock_init(&sbull_devices[i].lock);    }    /*     * Get the queue set up, and register our (nonexistent) partitions.     */  #ifdef SBULL_MULTIQUEUE    for (i = 0; i < sbull_devs; i++) {        blk_init_queue(&sbull_devices[i].queue, sbull_request);        blk_queue_headactive(&sbull_devices[i].queue, 0);    }    blk_dev[major].queue = sbull_find_queue;#else#  ifdef LINUX_24    if (noqueue)        blk_queue_make_request(BLK_DEFAULT_QUEUE(major), sbull_make_request);    else#  endif /* LINUX_24 */        blk_init_queue(BLK_DEFAULT_QUEUE(major), sbull_request);#endif    /* A no-op in 2.4.0, but all drivers seem to do it anyway */    for (i = 0; i < sbull_devs; i++)            register_disk(NULL, MKDEV(major, i), 1, &sbull_bdops,                            sbull_size << 1);#ifndef SBULL_DEBUG    EXPORT_NO_SYMBOLS; /* otherwise, leave global symbols visible */#endif    printk ("<1>sbull: init complete, %d devs, size %d blks %d hs %d\n",                    sbull_devs, sbull_size, sbull_blksize, sbull_hardsect);#ifdef SBULL_MULTIQUEUE    printk ("<1>sbull: Using multiqueue request\n");#elif defined(LINUX_24)    if (noqueue)            printk (KERN_INFO "sbull: using direct make_request\n");#endif#ifdef DO_RAW_INTERFACE    sbullr_init();#endif    return 0; /* succeed */  fail_malloc:    read_ahead[major] = 0;    if (sbull_sizes) kfree(sbull_sizes);    blk_size[major] = NULL;    if (sbull_blksizes) kfree(sbull_blksizes);    blksize_size[major] = NULL;    if (sbull_hardsects) kfree(sbull_hardsects);    hardsect_size[major] = NULL;    if (sbull_devices) kfree(sbull_devices);    unregister_blkdev(major, "sbull");    return result;}void sbull_cleanup(void){    int i;/* * Before anything else, get rid of the timer functions.  Set the "usage" * flag on each device as well, under lock, so that if the timer fires up * just before we delete it, it will either complete or abort.  Otherwise * we have nasty race conditions to worry about. */    for (i = 0; i < sbull_devs; i++) {        Sbull_Dev *dev = sbull_devices + i;        del_timer(&dev->timer);        spin_lock(&dev->lock);        dev->usage++;        spin_unlock(&dev->lock);    }#ifdef DO_RAW_INTERFACE    sbullr_release();#endif        /* flush it all and reset all the data structures */    for (i=0; i<sbull_devs; i++)        fsync_dev(MKDEV(sbull_major, i)); /* flush the devices */    unregister_blkdev(major, "sbull");/* * Fix up the request queue(s) */#ifdef SBULL_MULTIQUEUE    for (i = 0; i < sbull_devs; i++)            blk_cleanup_queue(&sbull_devices[i].queue);    blk_dev[major].queue = NULL;#else    blk_cleanup_queue(BLK_DEFAULT_QUEUE(major));#endif       /* Clean up the global arrays */    read_ahead[major] = 0;    kfree(blk_size[major]);    blk_size[major] = NULL;    kfree(blksize_size[major]);    blksize_size[major] = NULL;    kfree(hardsect_size[major]);    hardsect_size[major] = NULL;    /* FIXME: max_readahead and max_sectors */     /* finally, the usual cleanup */    for (i=0; i < sbull_devs; i++) {        if (sbull_devices[i].data)            vfree(sbull_devices[i].data);    }    kfree(sbull_devices);}/* * Below here is the "raw device" implementation, available only * in 2.4. */#ifdef DO_RAW_INTERFACE/* * Transfer an iovec */static int sbullr_rw_iovec(Sbull_Dev *dev, struct kiobuf *iobuf, int rw,                int sector, int nsectors){    struct request fakereq;    struct page *page;    int offset = iobuf->offset, ndone = 0, pageno, result;    /* Perform I/O on each sector */    fakereq.sector = sector;    fakereq.current_nr_sectors = 1;    fakereq.cmd = rw;        for (pageno = 0; pageno < iobuf->nr_pages; pageno++) {        page = iobuf->maplist[pageno];        while (ndone < nsectors) {            /* Fake up a request structure for the operation */            fakereq.buffer = (void *) (kmap(page) + offset);            result = sbull_transfer(dev, &fakereq);	    kunmap(page);            if (result == 0)                return ndone;            /* Move on to the next one */            ndone++;            fakereq.sector++;            offset += SBULLR_SECTOR;            if (offset >= PAGE_SIZE) {                offset = 0;                break;            }        }    }    return ndone;}/* * Handle actual transfers of data. */static int sbullr_transfer (Sbull_Dev *dev, char *buf, size_t count,                loff_t *offset, int rw){    struct kiobuf *iobuf;           int result;        /* Only block alignment and size allowed */    if ((*offset & SBULLR_SECTOR_MASK) || (count & SBULLR_SECTOR_MASK))        return -EINVAL;    if ((unsigned long) buf & SBULLR_SECTOR_MASK)        return -EINVAL;    /* Allocate an I/O vector */    result = alloc_kiovec(1, &iobuf);    if (result)        return result;    /* Map the user I/O buffer and do the I/O. */    result = map_user_kiobuf(rw, iobuf, (unsigned long) buf, count);    if (result) {        free_kiovec(1, &iobuf);        return result;    }    spin_lock(&dev->lock);    result = sbullr_rw_iovec(dev, iobuf, rw, *offset >> SBULLR_SECTOR_SHIFT,                    count >> SBULLR_SECTOR_SHIFT);    spin_unlock(&dev->lock);    /* Clean up and return. */    unmap_kiobuf(iobuf);    free_kiovec(1, &iobuf);    if (result > 0)        *offset += result << SBULLR_SECTOR_SHIFT;    return result << SBULLR_SECTOR_SHIFT;}/* * Read and write syscalls. */ssize_t sbullr_read(struct file *filp, char *buf, size_t size, loff_t *off){    Sbull_Dev *dev = sbull_devices + MINOR(filp->f_dentry->d_inode->i_rdev);    return sbullr_transfer(dev, buf, size, off, READ);}ssize_t sbullr_write(struct file *filp, const char *buf, size_t size,                loff_t *off){    Sbull_Dev *dev = sbull_devices + MINOR(filp->f_dentry->d_inode->i_rdev);    return sbullr_transfer(dev, (char *) buf, size, off, WRITE);}static int sbullr_registered = 0;static struct file_operations sbullr_fops = {   read:        sbullr_read,   write:       sbullr_write,   open:        sbull_open,   release:     sbull_release,   ioctl:	sbull_ioctl,};static void sbullr_init(){    int result;            /* Simplify the math */    if (sbull_hardsect != SBULLR_SECTOR) {        printk(KERN_NOTICE "Sbullr requires hardsect = %d\n", SBULLR_SECTOR);        return;    }    SET_MODULE_OWNER(&sbullr_fops);    result = register_chrdev(sbullr_major, "sbullr", &sbullr_fops);    if (result >= 0)        sbullr_registered = 1;    if (sbullr_major == 0)        sbullr_major = result;}static void sbullr_release(){    if (sbullr_registered)        unregister_chrdev(sbullr_major, "sbullr");}#endif /* DO_RAW_INTERFACE */module_init(sbull_init);module_exit(sbull_cleanup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频在线观看一区| 欧美精品亚洲一区二区在线播放| 国产成人在线看| 成人高清视频在线观看| 欧美日韩国产高清一区| 久久久九九九九| 午夜精品久久久久久久久| 91在线免费看| 国产日韩影视精品| 免费三级欧美电影| 欧美日韩免费观看一区三区| 中文字幕日韩av资源站| 国产成人午夜精品5599| 欧洲av一区二区嗯嗯嗯啊| 久久综合资源网| 男女男精品视频| 欧美日韩国产综合视频在线观看| 国产精品久久久久9999吃药| 国产一区二区三区久久久| 欧美疯狂做受xxxx富婆| 亚洲精品乱码久久久久久日本蜜臀| 国产大片一区二区| 欧美xxxx在线观看| 免费欧美日韩国产三级电影| 欧美日韩免费观看一区二区三区| 亚洲激情第一区| 色婷婷久久久亚洲一区二区三区| 国产精品拍天天在线| 国产福利一区在线观看| 国产亚洲一本大道中文在线| 久久精品999| 欧美tickling挠脚心丨vk| 日韩国产成人精品| 欧美另类z0zxhd电影| 午夜伊人狠狠久久| 欧美精品一卡两卡| 免费在线成人网| 日韩三级视频中文字幕| 精东粉嫩av免费一区二区三区| 日韩三级视频在线看| 国产在线精品视频| 国产精品少妇自拍| 色综合色综合色综合| 五月天中文字幕一区二区| 欧美一区二区成人| 国产一区二区精品久久99| 国产精品国产三级国产有无不卡| av在线不卡电影| 亚洲最新视频在线观看| 69久久99精品久久久久婷婷| 日韩高清电影一区| 国产亚洲一二三区| 色噜噜夜夜夜综合网| 亚洲网友自拍偷拍| 欧美成人伊人久久综合网| 国产精品综合一区二区| 亚洲品质自拍视频网站| 欧美性受极品xxxx喷水| 免费成人深夜小野草| 久久久久亚洲综合| 色94色欧美sute亚洲线路二| 午夜激情久久久| 精品处破学生在线二十三| 福利一区二区在线观看| 亚洲国产精品一区二区久久恐怖片| 欧美日韩黄色影视| 国产成人在线视频播放| 亚洲免费av在线| 欧美一级久久久| a美女胸又www黄视频久久| 天天综合日日夜夜精品| 久久精品网站免费观看| 在线视频你懂得一区二区三区| 日韩在线a电影| 国产精品久久久久精k8| 欧美浪妇xxxx高跟鞋交| 国产成人av在线影院| 一二三区精品视频| 久久久一区二区| 欧美日韩综合在线| 成人午夜私人影院| 奇米影视一区二区三区小说| 成人欧美一区二区三区黑人麻豆| 欧美日韩高清一区| 波多野结衣精品在线| 麻豆精品在线看| 亚洲精品写真福利| 欧美激情一区二区三区全黄| 欧美日本一区二区在线观看| 99视频在线观看一区三区| 韩国精品在线观看| 亚洲电影激情视频网站| 亚洲色图视频免费播放| 久久久久久亚洲综合| 制服.丝袜.亚洲.中文.综合| 一本久久a久久精品亚洲| 国产成人高清视频| 国产麻豆成人传媒免费观看| 丝袜a∨在线一区二区三区不卡| ㊣最新国产の精品bt伙计久久| 亚洲精品一区二区精华| 欧美精选一区二区| 欧美午夜片在线看| 色一情一乱一乱一91av| 暴力调教一区二区三区| 国产一区二区女| 色婷婷国产精品久久包臀 | 国产麻豆成人传媒免费观看| 丝袜诱惑制服诱惑色一区在线观看 | 国产日韩亚洲欧美综合| 日韩欧美一级精品久久| 欧美另类一区二区三区| 欧美日韩一区中文字幕| 欧洲视频一区二区| 欧洲日韩一区二区三区| 欧美优质美女网站| 2023国产一二三区日本精品2022| 欧美三级欧美一级| 欧美日韩国产电影| 在线播放一区二区三区| 欧美日韩一区视频| 精品视频一区三区九区| 欧美丝袜第三区| 欧美日韩一区二区三区不卡| 欧美三级资源在线| 欧美一区二区三区四区高清 | 欧美在线免费观看亚洲| 在线观看视频一区| 欧美网站一区二区| 欧美一级理论片| 久久久综合九色合综国产精品| 中文字幕乱码日本亚洲一区二区 | 欧美大片拔萝卜| 久久亚洲综合色一区二区三区| 精品国产一区二区亚洲人成毛片| 久久无码av三级| 国产精品国产三级国产a| 亚洲欧美日韩中文播放 | 日韩一区二区免费视频| 精品蜜桃在线看| 欧美激情一区二区三区在线| 亚洲人成伊人成综合网小说| 亚洲制服丝袜av| 日本女人一区二区三区| 国产一区二区三区免费播放| 色综合中文字幕| 欧美男人的天堂一二区| 久久久亚洲精品石原莉奈 | 日本丶国产丶欧美色综合| 亚洲第一福利一区| 精品一区二区三区日韩| 日韩和欧美的一区| 韩国欧美一区二区| 色8久久人人97超碰香蕉987| 亚洲精品一二三四区| 免费一级片91| 99精品视频在线观看| 91精品国产高清一区二区三区| 久久久久久久久久久电影| 一区二区三区四区在线播放 | 91成人看片片| 精品国产网站在线观看| 亚洲色图一区二区| 精品一区二区在线视频| 在线视频国内自拍亚洲视频| 精品999久久久| 亚洲风情在线资源站| 国产成人精品免费看| 制服丝袜日韩国产| 亚洲卡通欧美制服中文| 国产专区欧美精品| 欧美巨大另类极品videosbest| 国产精品毛片大码女人| 精品一区二区在线看| 欧美日韩大陆在线| 亚洲日本在线观看| 国产精品亚洲专一区二区三区| 欧美日韩午夜影院| 亚洲乱码日产精品bd| 国产精品一二三在| 日韩欧美二区三区| 亚洲国产人成综合网站| 北岛玲一区二区三区四区| 精品播放一区二区| 日精品一区二区三区| 91片在线免费观看| 国产精品色在线| 风间由美一区二区av101| 日韩欧美精品在线视频| 亚洲第一主播视频| 欧美性色综合网| 亚洲精品免费一二三区| 91亚洲精品久久久蜜桃| 国产精品成人免费精品自在线观看| 久久99国产精品久久| 日韩精品一区二区在线| 日本最新不卡在线| 67194成人在线观看| 欧美aaaaaa午夜精品| 日韩一区二区在线观看视频播放|