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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sg.c

?? linux 1.0 源代碼
?? C
字號:
/*   History:    Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user      process control of SCSI devices.    Development Sponsored by Killy Corp. NY NY        Borrows code from st driver.*/#include <linux/fs.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/mtio.h>#include <linux/ioctl.h>#include <linux/fcntl.h>#include <asm/io.h>#include <asm/segment.h>#include <asm/system.h>#include "../block/blk.h"#include "scsi.h"#include "scsi_ioctl.h"#include "sg.h"int NR_SG=0;int MAX_SG=0;#ifdef SG_BIG_BUFFstatic char *big_buff;static struct wait_queue *big_wait;   /* wait for buffer available */static int big_inuse=0;#endifstruct scsi_generic {  Scsi_Device *device;  int users;   /* how many people have it open? */  struct wait_queue *generic_wait; /* wait for device to be available */  struct wait_queue *read_wait;    /* wait for response */  struct wait_queue *write_wait;   /* wait for free buffer */  int timeout; /* current default value for device */  int buff_len; /* length of current buffer */  char *buff;   /* the buffer */  struct sg_header header; /* header of pending command */  char exclude; /* opened for exclusive access */  char pending;  /* don't accept writes now */  char complete; /* command complete allow a read */ };static struct scsi_generic *scsi_generics=NULL;static int sg_ioctl(struct inode * inode,struct file * file,	     unsigned int cmd_in, unsigned long arg) {  int dev = MINOR(inode->i_rdev);  if ((dev<0) || (dev>=NR_SG))   return -ENODEV;  switch(cmd_in)   {    case SG_SET_TIMEOUT:     scsi_generics[dev].timeout=get_fs_long((int *) arg);     return 0;    case SG_GET_TIMEOUT:     return scsi_generics[dev].timeout;    default:     return scsi_ioctl(scsi_generics[dev].device, cmd_in, (void *) arg);   } }static int sg_open(struct inode * inode, struct file * filp) {  int dev=MINOR(inode->i_rdev);  int flags=filp->f_flags;  if (dev>=NR_SG)   return -ENODEV;  if (O_RDWR!=(flags & O_ACCMODE))   return -EACCES;  if (flags & O_EXCL)   {    while(scsi_generics[dev].users)     {      if (flags & O_NONBLOCK)       return -EBUSY;      interruptible_sleep_on(&scsi_generics[dev].generic_wait);      if (current->signal & ~current->blocked)       return -ERESTARTSYS;     }    scsi_generics[dev].exclude=1;   }  else   while(scsi_generics[dev].exclude)    {     if (flags & O_NONBLOCK)      return -EBUSY;     interruptible_sleep_on(&scsi_generics[dev].generic_wait);     if (current->signal & ~current->blocked)      return -ERESTARTSYS;    }  if (!scsi_generics[dev].users && scsi_generics[dev].pending && scsi_generics[dev].complete)   {    scsi_free(scsi_generics[dev].buff,scsi_generics[dev].buff_len);    scsi_generics[dev].pending=0;   }  if (!scsi_generics[dev].users)   scsi_generics[dev].timeout=SG_DEFAULT_TIMEOUT;  scsi_generics[dev].users++;  return 0; }static void sg_close(struct inode * inode, struct file * filp) {  int dev=MINOR(inode->i_rdev);  scsi_generics[dev].users--;  scsi_generics[dev].exclude=0;  wake_up(&scsi_generics[dev].generic_wait); }static char *sg_malloc(int size) {  if (size<=4096)   return (char *) scsi_malloc(size);#ifdef SG_BIG_BUFF  if (size<SG_BIG_BUFF)   {    while(big_inuse)     {      interruptible_sleep_on(&big_wait);      if (current->signal & ~current->blocked)       return NULL;     }    big_inuse=1;    return big_buff;   }#endif     return NULL; }static void sg_free(char *buff,int size)  {#ifdef SG_BIG_BUFF  if (buff==big_buff)   {    big_inuse=0;    wake_up(&big_wait);    return;   }#endif  scsi_free(buff,size); }static int sg_read(struct inode *inode,struct file *filp,char *buf,int count) {  int dev=MINOR(inode->i_rdev);  int i;  struct scsi_generic *device=&scsi_generics[dev];  if ((i=verify_area(VERIFY_WRITE,buf,count)))   return i;  while(!device->pending || !device->complete)   {    if (filp->f_flags & O_NONBLOCK)     return -EWOULDBLOCK;    interruptible_sleep_on(&device->read_wait);    if (current->signal & ~current->blocked)     return -ERESTARTSYS;   }  device->header.pack_len=device->header.reply_len;  device->header.result=0;  if (count>=sizeof(struct sg_header))   {    memcpy_tofs(buf,&device->header,sizeof(struct sg_header));    buf+=sizeof(struct sg_header);    if (count>device->header.pack_len)     count=device->header.pack_len;    memcpy_tofs(buf,device->buff,count-sizeof(struct sg_header));   }  else   count=0;  sg_free(device->buff,device->buff_len);  device->pending=0;  wake_up(&device->write_wait);  return count; }static void sg_command_done(Scsi_Cmnd * SCpnt) {  int dev=SCpnt->request.dev;  struct scsi_generic *device=&scsi_generics[dev];  if (!device->pending)   {    printk("unexpected done for sg %d\n",dev);    SCpnt->request.dev=-1;    return;   }  if (SCpnt->sense_buffer[0])   {    device->header.result=EIO;   }  else   device->header.result=SCpnt->result;  device->complete=1;  SCpnt->request.dev=-1;  wake_up(&scsi_generics[dev].read_wait); }static int sg_write(struct inode *inode,struct file *filp,char *buf,int count) {  int dev=MINOR(inode->i_rdev);  Scsi_Cmnd *SCpnt;  int bsize,size,amt,i;  unsigned char cmnd[MAX_COMMAND_SIZE];  struct scsi_generic *device=&scsi_generics[dev];  if ((i=verify_area(VERIFY_READ,buf,count)))   return i;  if (count<sizeof(struct sg_header))   return -EIO;  /* make sure we can fit */  while(device->pending)   {    if (filp->f_flags & O_NONBLOCK)     return -EWOULDBLOCK;#ifdef DEBUG    printk("sg_write: sleeping on pending request\n");#endif         interruptible_sleep_on(&device->write_wait);    if (current->signal & ~current->blocked)     return -ERESTARTSYS;   }  device->pending=1;  device->complete=0;  memcpy_fromfs(&device->header,buf,sizeof(struct sg_header));  /* fix input size */  device->header.pack_len=count;  buf+=sizeof(struct sg_header);  bsize=(device->header.pack_len>device->header.reply_len) ? device->header.pack_len : device->header.reply_len;  bsize-=sizeof(struct sg_header);  amt=bsize;  if (!bsize)   bsize++;  bsize=(bsize+511) & ~511;  if ((bsize<0) || !(device->buff=sg_malloc(device->buff_len=bsize)))   {    device->pending=0;    wake_up(&device->write_wait);    return -ENOMEM;   }#ifdef DEBUG  printk("allocating device\n");#endif  if (!(SCpnt=allocate_device(NULL,device->device->index, !(filp->f_flags & O_NONBLOCK))))   {    device->pending=0;    wake_up(&device->write_wait);    sg_free(device->buff,device->buff_len);    return -EWOULDBLOCK;   } #ifdef DEBUG  printk("device allocated\n");#endif      /* now issue command */  SCpnt->request.dev=dev;  SCpnt->sense_buffer[0]=0;  size=COMMAND_SIZE(get_fs_byte(buf));  memcpy_fromfs(cmnd,buf,size);  buf+=size;  memcpy_fromfs(device->buff,buf,device->header.pack_len-size-sizeof(struct sg_header));  cmnd[1]=(cmnd[1] & 0x1f) | (device->device->lun<<5);#ifdef DEBUG  printk("do cmd\n");#endif  scsi_do_cmd (SCpnt,(void *) cmnd,               (void *) device->buff,amt,sg_command_done,device->timeout,SG_DEFAULT_RETRIES);#ifdef DEBUG  printk("done cmd\n");#endif                 return count; }static struct file_operations sg_fops = {   NULL,            /* lseek */   sg_read,         /* read */   sg_write,        /* write */   NULL,            /* readdir */   NULL,            /* select */   sg_ioctl,        /* ioctl */   NULL,            /* mmap */   sg_open,         /* open */   sg_close,        /* release */   NULL		    /* fsync */};/* Driver initialization */unsigned long sg_init(unsigned long mem_start, unsigned long mem_end) {  if (register_chrdev(SCSI_GENERIC_MAJOR,"sg",&sg_fops))    {    printk("Unable to get major %d for generic SCSI device\n",	   SCSI_GENERIC_MAJOR);    return mem_start;   }  if (NR_SG == 0) return mem_start;#ifdef DEBUG  printk("sg: Init generic device.\n");#endif#ifdef SG_BIG_BUFF  big_buff= (char *) mem_start;  mem_start+=SG_BIG_BUFF;#endif  return mem_start; }unsigned long sg_init1(unsigned long mem_start, unsigned long mem_end) {  scsi_generics = (struct scsi_generic *) mem_start;  mem_start += MAX_SG * sizeof(struct scsi_generic);  return mem_start; };void sg_attach(Scsi_Device * SDp) {  if(NR_SG >= MAX_SG)    panic ("scsi_devices corrupt (sg)");  scsi_generics[NR_SG].device=SDp;  scsi_generics[NR_SG].users=0;  scsi_generics[NR_SG].generic_wait=NULL;  scsi_generics[NR_SG].read_wait=NULL;  scsi_generics[NR_SG].write_wait=NULL;  scsi_generics[NR_SG].exclude=0;  scsi_generics[NR_SG].pending=0;  scsi_generics[NR_SG].timeout=SG_DEFAULT_TIMEOUT;  NR_SG++; };

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合天天狠狠| 五月婷婷久久综合| 成人在线视频首页| 久久精品亚洲一区二区三区浴池| 激情文学综合插| 欧美成人福利视频| 精品一二线国产| 久久精品免视看| 9色porny自拍视频一区二区| 亚洲视频一区二区在线| 91成人免费在线视频| 亚洲成人手机在线| 日韩午夜电影在线观看| 国产一区欧美二区| 国产精品国产三级国产| 欧美性猛交xxxx乱大交退制版| 午夜伦欧美伦电影理论片| 日韩色在线观看| 风间由美一区二区av101| 亚洲日本丝袜连裤袜办公室| 欧美日精品一区视频| 久久99精品视频| 国产精品亲子乱子伦xxxx裸| 欧美亚洲一区三区| 久久99精品国产.久久久久| 中文字幕的久久| 欧美图区在线视频| 国产精品综合一区二区| 亚洲免费资源在线播放| 精品乱人伦一区二区三区| av在线一区二区| 麻豆免费看一区二区三区| 国产精品人妖ts系列视频| 欧美一级黄色录像| 99久久婷婷国产综合精品| 日韩国产在线观看| 综合在线观看色| 欧美成人女星排名| 一本到三区不卡视频| 久草这里只有精品视频| 一区二区在线观看不卡| 26uuu久久综合| 欧美日韩另类国产亚洲欧美一级| 国产精品自在在线| 午夜精品一区二区三区免费视频| 欧美国产日韩亚洲一区| 日韩一区二区在线观看视频| 99久久精品国产观看| 狠狠色综合色综合网络| 亚洲午夜激情网站| 亚洲日本在线视频观看| 久久久久久一二三区| 欧美另类一区二区三区| 色综合色狠狠综合色| 国产精品影视在线观看| 日本不卡高清视频| 一区二区免费看| 国产精品传媒入口麻豆| 欧美精品一区二区三区四区 | 日韩三级伦理片妻子的秘密按摩| 不卡一区在线观看| 国产91富婆露脸刺激对白| 秋霞电影网一区二区| 一区二区三区在线观看欧美| 国产精品久久久久久久久免费相片 | 国产1区2区3区精品美女| 免费黄网站欧美| 日韩电影免费一区| 亚洲va欧美va人人爽| 亚洲免费视频中文字幕| 中文字幕人成不卡一区| 国产精品嫩草久久久久| 国产校园另类小说区| 国产日产精品1区| 精品国产伦一区二区三区观看方式| 欧美丰满一区二区免费视频| 欧美午夜在线一二页| 欧美在线观看一二区| 色狠狠色狠狠综合| 91成人在线精品| 欧美日韩精品免费| 欧美人妇做爰xxxⅹ性高电影| 欧美三区在线观看| 欧美日本不卡视频| 日韩精品一区二区三区三区免费| 欧美一二区视频| 久久亚洲精品国产精品紫薇| 久久综合九色综合97婷婷女人 | 国产精品911| 成人永久免费视频| 99在线精品免费| 在线亚洲免费视频| 777午夜精品免费视频| 91精品国产乱| 精品国产乱码久久久久久浪潮| 精品国产乱码久久久久久免费 | 色欧美乱欧美15图片| 欧美在线一区二区| 欧美精品丝袜中出| 久久综合国产精品| 日本一区二区在线不卡| 亚洲欧美区自拍先锋| 亚洲444eee在线观看| 久草精品在线观看| 成人综合激情网| 欧美亚洲国产bt| 精品成人私密视频| 亚洲男人的天堂av| 老司机免费视频一区二区 | 亚洲激情综合网| 三级成人在线视频| 国产精品18久久久| 欧美亚洲一区三区| 久久久99久久精品欧美| 亚洲美女屁股眼交3| 蜜臀av一区二区三区| 成人免费看片app下载| 51精品国自产在线| 中文字幕欧美国产| 视频一区二区三区入口| 国产suv一区二区三区88区| 欧美色成人综合| 亚洲国产精品成人综合色在线婷婷| 一区二区三区欧美日| 久草在线在线精品观看| 欧美在线视频你懂得| 久久精品亚洲麻豆av一区二区| 亚洲国产va精品久久久不卡综合| 国产尤物一区二区在线| 欧美午夜一区二区三区| 中文字幕乱码亚洲精品一区| 婷婷中文字幕一区三区| 不卡在线观看av| 精品国产一区二区三区久久影院| 亚洲色图19p| 国产激情一区二区三区| 欧美一区在线视频| 亚洲理论在线观看| 成人激情小说乱人伦| 欧美tk—视频vk| 午夜日韩在线观看| 91女人视频在线观看| 久久精品亚洲一区二区三区浴池 | 久久成人av少妇免费| 精品视频在线免费看| 日韩码欧中文字| 国产成人一级电影| 欧美一区二区三区免费| 一区二区三区四区视频精品免费| 国产精品一级在线| 精品日产卡一卡二卡麻豆| 偷窥国产亚洲免费视频| 在线观看日韩电影| 亚洲乱码国产乱码精品精的特点| 成人动漫一区二区三区| 国产亚洲污的网站| 国产综合色精品一区二区三区| 欧美一区二区三区视频在线 | 欧美一级一级性生活免费录像| 一区二区三区中文字幕| av激情综合网| 中文字幕日韩欧美一区二区三区| 国产精品一区二区久激情瑜伽| 欧美大片一区二区| 精品在线免费观看| 精品国产伦一区二区三区免费| 调教+趴+乳夹+国产+精品| 欧美日韩国产不卡| 日韩精品一二区| 欧美一区二区日韩| 免费在线观看不卡| 日韩亚洲欧美在线| 国产在线精品一区在线观看麻豆| 日韩小视频在线观看专区| 久久er精品视频| 国产性天天综合网| 99久久久精品| 亚洲在线一区二区三区| 欧美三级乱人伦电影| 亚洲午夜羞羞片| 欧美久久久久久久久中文字幕| 午夜激情综合网| 欧美一区二区大片| 国产一区二区三区四区五区美女 | 国产精品久久久久天堂| voyeur盗摄精品| 夜色激情一区二区| 欧美丰满高潮xxxx喷水动漫| 老色鬼精品视频在线观看播放| 精品国产乱码久久久久久夜甘婷婷 | 99这里只有久久精品视频| 亚洲天堂2014| 欧美无砖专区一中文字| 美女一区二区在线观看| 欧美激情在线观看视频免费| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 日本美女一区二区三区| 久久亚区不卡日本| 91亚洲精品久久久蜜桃| 日韩国产在线观看|