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

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

?? scsi_ioctl.c

?? linux 1.0 源代碼
?? C
字號:
#include <asm/io.h>#include <asm/segment.h>#include <asm/system.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/string.h>#include "../block/blk.h"#include "scsi.h"#include "hosts.h"#include "scsi_ioctl.h"#define MAX_RETRIES 5	#define MAX_TIMEOUT 200#define MAX_BUF 4096#define max(a,b) (((a) > (b)) ? (a) : (b))/* * If we are told to probe a host, we will return 0 if  the host is not * present, 1 if the host is present, and will return an identifying * string at *arg, if arg is non null, filling to the length stored at * (int *) arg */static int ioctl_probe(struct Scsi_Host * host, void *buffer){	int temp;	unsigned int len,slen;	const char * string;		if ((temp = host->hostt->present) && buffer) {		len = get_fs_long ((unsigned long *) buffer);		string = host->hostt->info();		slen = strlen(string);		if (len > slen)			len = slen + 1;		verify_area(VERIFY_WRITE, buffer, len);		memcpy_tofs (buffer, string, len);	}	return temp;}/* *  * The SCSI_IOCTL_SEND_COMMAND ioctl sends a command out to the SCSI host. * The MAX_TIMEOUT and MAX_RETRIES  variables are used.   *  * dev is the SCSI device struct ptr, *(int *) arg is the length of the * input data, if any, not including the command string & counts,  * *((int *)arg + 1) is the output buffer size in bytes. *  * *(char *) ((int *) arg)[2] the actual command byte.    *  * Note that no more than MAX_BUF data bytes will be transfered.  Since * SCSI block device size is 512 bytes, I figured 1K was good. * but (WDE) changed it to 8192 to handle large bad track buffers. * ERY: I changed this to a dynamic allocation using scsi_malloc - we were * getting a kernel stack overflow which was crashing the system when we * were using 8192 bytes. *  * This size *does not* include the initial lengths that were passed. *  * The SCSI command is read from the memory location immediately after the * length words, and the input data is right after the command.  The SCSI * routines know the command size based on the opcode decode.   *  * The output area is then filled in starting from the command byte.  */static void scsi_ioctl_done (Scsi_Cmnd * SCpnt){  struct request * req;  struct task_struct * p;    req = &SCpnt->request;  req->dev = 0xfffe; /* Busy, but indicate request done */    if ((p = req->waiting) != NULL) {    req->waiting = NULL;    p->state = TASK_RUNNING;    if (p->counter > current->counter)      need_resched = 1;  }}	static int ioctl_internal_command(Scsi_Device *dev, char * cmd){	int result;	Scsi_Cmnd * SCpnt;	SCpnt = allocate_device(NULL, dev->index, 1);	scsi_do_cmd(SCpnt,  cmd, NULL,  0,			scsi_ioctl_done,  MAX_TIMEOUT,			MAX_RETRIES);	if (SCpnt->request.dev != 0xfffe){	  SCpnt->request.waiting = current;	  current->state = TASK_UNINTERRUPTIBLE;	  while (SCpnt->request.dev != 0xfffe) schedule();	};	if(driver_byte(SCpnt->result) != 0)	  switch(SCpnt->sense_buffer[2] & 0xf) {	  case ILLEGAL_REQUEST:	    if(cmd[0] == ALLOW_MEDIUM_REMOVAL) dev->lockable = 0;	    else printk("SCSI device (ioctl) reports ILLEGAL REQUEST.\n");	    break;	  case NOT_READY: /* This happens if there is no disc in drive */	    if(dev->removable){	      printk("Device not ready.  Make sure there is a disc in the drive.\n");	      break;	    };	  case UNIT_ATTENTION:	    if (dev->removable){	      dev->changed = 1;	      SCpnt->result = 0; /* This is no longer considered an error */	      printk("Disc change detected.\n");	      break;	    };	  default: /* Fall through for non-removable media */	    printk("SCSI CD error: host %d id %d lun %d return code = %x\n",		   dev->host->host_no,		   dev->id,		   dev->lun,		   SCpnt->result);	    printk("\tSense class %x, sense error %x, extended sense %x\n",		   sense_class(SCpnt->sense_buffer[0]),		   sense_error(SCpnt->sense_buffer[0]),		   SCpnt->sense_buffer[2] & 0xf);	  };	result = SCpnt->result;	SCpnt->request.dev = -1;  /* Mark as not busy */	wake_up(&scsi_devices[SCpnt->index].device_wait);	return result;}static int ioctl_command(Scsi_Device *dev, void *buffer){	char * buf;	char cmd[12];	char * cmd_in;	Scsi_Cmnd * SCpnt;	unsigned char opcode;	int inlen, outlen, cmdlen;	int needed;	int result;	if (!buffer)		return -EINVAL;		inlen = get_fs_long((unsigned long *) buffer);	outlen = get_fs_long( ((unsigned long *) buffer) + 1);	cmd_in = (char *) ( ((int *)buffer) + 2);	opcode = get_fs_byte(cmd_in); 	needed = (inlen > outlen ? inlen : outlen);	if(needed){	  needed = (needed + 511) & ~511;	  if (needed > MAX_BUF) needed = MAX_BUF;	  buf = (char *) scsi_malloc(needed);	  if (!buf) return -ENOMEM;	} else	  buf = NULL;	memcpy_fromfs ((void *) cmd,  cmd_in,  cmdlen = COMMAND_SIZE (opcode));	memcpy_fromfs ((void *) buf,  (void *) (cmd_in + cmdlen), inlen > MAX_BUF ? MAX_BUF : inlen);	cmd[1] = ( cmd[1] & 0x1f ) | (dev->lun << 5);#ifndef DEBUG_NO_CMD		SCpnt = allocate_device(NULL, dev->index, 1);	scsi_do_cmd(SCpnt,  cmd,  buf, needed,  scsi_ioctl_done,  MAX_TIMEOUT, 			MAX_RETRIES);	if (SCpnt->request.dev != 0xfffe){	  SCpnt->request.waiting = current;	  current->state = TASK_UNINTERRUPTIBLE;	  while (SCpnt->request.dev != 0xfffe) schedule();	};	/* If there was an error condition, pass the info back to the user. */	if(SCpnt->result) {	  result = verify_area(VERIFY_WRITE, cmd_in, sizeof(SCpnt->sense_buffer));	  if (result)	    return result;	  memcpy_tofs((void *) cmd_in,  SCpnt->sense_buffer, sizeof(SCpnt->sense_buffer));	} else {	  result = verify_area(VERIFY_WRITE, cmd_in, (outlen > MAX_BUF) ? MAX_BUF  : outlen);	  if (result)	    return result;	  memcpy_tofs ((void *) cmd_in,  buf,  (outlen > MAX_BUF) ? MAX_BUF  : outlen);	};	result = SCpnt->result;	SCpnt->request.dev = -1;  /* Mark as not busy */	if (buf) scsi_free(buf, needed);	wake_up(&scsi_devices[SCpnt->index].device_wait);	return result;#else	{	int i;	printk("scsi_ioctl : device %d.  command = ", dev->id);	for (i = 0; i < 12; ++i)		printk("%02x ", cmd[i]);	printk("\nbuffer =");	for (i = 0; i < 20; ++i)		printk("%02x ", buf[i]);	printk("\n");	printk("inlen = %d, outlen = %d, cmdlen = %d\n",		inlen, outlen, cmdlen);	printk("buffer = %d, cmd_in = %d\n", buffer, cmd_in);	}	return 0;#endif}	/*	the scsi_ioctl() function differs from most ioctls in that it does	not take a major/minor number as the dev filed.  Rather, it takes	a pointer to a scsi_devices[] element, a structure. */int scsi_ioctl (Scsi_Device *dev, int cmd, void *arg){        char scsi_cmd[12];	if ((cmd != 0 && dev->index > NR_SCSI_DEVICES))		return -ENODEV;		switch (cmd) {	        case SCSI_IOCTL_GET_IDLUN:	                verify_area(VERIFY_WRITE, (void *) arg, sizeof(int));			put_fs_long(dev->id + (dev->lun << 8) + 				    (dev->host->host_no << 16), (unsigned long *) arg);			return 0;		case SCSI_IOCTL_TAGGED_ENABLE:			if(!suser())  return -EACCES;			if(!dev->tagged_supported) return -EINVAL;			dev->tagged_queue = 1;			dev->current_tag = 1;			break;		case SCSI_IOCTL_TAGGED_DISABLE:			if(!suser())  return -EACCES;			if(!dev->tagged_supported) return -EINVAL;			dev->tagged_queue = 0;			dev->current_tag = 0;			break;		case SCSI_IOCTL_PROBE_HOST:			return ioctl_probe(dev->host, arg);		case SCSI_IOCTL_SEND_COMMAND:			if(!suser())  return -EACCES;			return ioctl_command((Scsi_Device *) dev, arg);		case SCSI_IOCTL_DOORLOCK:			if (!dev->removable || !dev->lockable) return 0;		        scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL;			scsi_cmd[1] = dev->lun << 5;			scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;			scsi_cmd[4] = SCSI_REMOVAL_PREVENT;			return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd);			break;		case SCSI_IOCTL_DOORUNLOCK:			if (!dev->removable || !dev->lockable) return 0;		        scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL;			scsi_cmd[1] = dev->lun << 5;			scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;			scsi_cmd[4] = SCSI_REMOVAL_ALLOW;			return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd);		case SCSI_IOCTL_TEST_UNIT_READY:		        scsi_cmd[0] = TEST_UNIT_READY;			scsi_cmd[1] = dev->lun << 5;			scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;			scsi_cmd[4] = 0;			return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd);			break;		default :						return -EINVAL;	}	return -EINVAL;}/* * Just like scsi_ioctl, only callable from kernel space with no  * fs segment fiddling. */int kernel_scsi_ioctl (Scsi_Device *dev, int cmd, void *arg) {  unsigned long oldfs;  int tmp;  oldfs = get_fs();  set_fs(get_ds());  tmp = scsi_ioctl (dev, cmd, arg);  set_fs(oldfs);  return tmp;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合久久综合久久| 麻豆精品一区二区| 麻豆91在线看| 色噜噜狠狠成人网p站| 日韩一区二区三| 亚洲精品国产精品乱码不99| 韩日欧美一区二区三区| 天堂久久久久va久久久久| 8v天堂国产在线一区二区| 欧美精品一区二区久久久| 亚洲已满18点击进入久久| 国产高清一区日本| 日韩午夜av电影| 亚洲成人精品一区二区| 91在线播放网址| 日本一区二区电影| 国产一区二区网址| 国产激情偷乱视频一区二区三区| 欧美专区亚洲专区| 国产精品视频看| 国产精品一区二区在线观看不卡| 麻豆91精品视频| 精品一区二区三区蜜桃| 欧美久久一二区| 亚洲日本一区二区| 大尺度一区二区| 国产视频一区二区三区在线观看| 久久草av在线| 欧美一级日韩一级| 天天操天天色综合| 欧美一区二区在线观看| 日韩电影在线观看一区| 3d成人h动漫网站入口| 亚洲成人激情综合网| 欧美日韩一区二区在线视频| 亚洲成人av中文| 6080日韩午夜伦伦午夜伦| 午夜欧美电影在线观看| 日韩一区二区三区观看| 精油按摩中文字幕久久| 日本一区二区视频在线| 99在线热播精品免费| 亚洲精品国产成人久久av盗摄| 91久久奴性调教| 亚洲123区在线观看| 日韩一级免费一区| 国产福利一区在线| 一区二区三区色| 91精品免费观看| 国产精品一区二区久久不卡| 国产精品久久毛片| 欧美日韩一区二区在线观看| 奇米精品一区二区三区四区 | 欧美日韩一区在线观看| 日韩激情av在线| 久久欧美一区二区| 91小视频免费观看| 天天做天天摸天天爽国产一区 | 国产精品高潮呻吟| 欧美午夜影院一区| 韩日欧美一区二区三区| 亚洲伦理在线免费看| 欧美一区二区人人喊爽| 成人高清视频在线| 五月婷婷激情综合网| 国产亚洲一区二区在线观看| 91麻豆国产精品久久| 免费成人av在线| 国产精品久久午夜夜伦鲁鲁| 欧美日韩国产成人在线91| 国产69精品久久久久毛片 | 欧美一区二区三区四区久久| 国产福利一区在线| 午夜精品久久久久久| 国产欧美精品日韩区二区麻豆天美| 在线观看亚洲a| 中文字幕一区二区5566日韩| 久久久久国产精品麻豆ai换脸| av福利精品导航| 日韩精品午夜视频| 国产精品久久久久久福利一牛影视| 6080国产精品一区二区| 成人av午夜影院| 国产一区二区福利视频| 亚洲一线二线三线视频| 国产精品动漫网站| 26uuu亚洲婷婷狠狠天堂| 欧美日本一区二区三区| 日本久久一区二区| 成人丝袜18视频在线观看| 久草在线在线精品观看| 偷拍与自拍一区| 曰韩精品一区二区| 日韩美女视频一区二区| 亚洲国产精品激情在线观看| 欧美精品一区二区三区蜜桃| 91精品国产福利在线观看| 91麻豆swag| 91小视频免费观看| 成人97人人超碰人人99| 一区二区三区四区视频精品免费 | 国产·精品毛片| 免费成人在线播放| 亚洲国产精品久久艾草纯爱| 亚洲日本电影在线| 国产精品国产三级国产aⅴ原创| 久久奇米777| 日韩欧美中文一区| 欧美日韩精品三区| 欧美三级电影网站| 欧美日韩日日夜夜| 欧美午夜一区二区| 欧美日本一区二区在线观看| 欧美日韩一本到| 欧美日韩一区二区在线观看视频| 中文成人综合网| 亚洲一区二区三区在线看| 欧美国产一区视频在线观看| 久久久777精品电影网影网| 日韩欧美一二三区| 日韩精品一区二区三区蜜臀| 日韩欧美一卡二卡| 精品国产91久久久久久久妲己| 精品久久久久香蕉网| 日韩一区二区三区视频| 精品久久99ma| 日本一二三四高清不卡| 成人免费视频在线观看| 亚洲最快最全在线视频| 亚洲一区二区av电影| 日韩国产一二三区| 久久国产日韩欧美精品| 国产一区二区在线视频| 成人avav影音| 欧美日韩大陆在线| xfplay精品久久| 最新欧美精品一区二区三区| 亚洲午夜激情av| 美国欧美日韩国产在线播放| 国产福利一区二区三区在线视频| 成人av电影在线网| 国产亚洲精品中文字幕| 国产精品网站在线观看| 亚洲卡通欧美制服中文| 秋霞午夜鲁丝一区二区老狼| 国产高清精品在线| 欧美日韩一区二区三区高清| 精品久久一区二区三区| 亚洲精品乱码久久久久| 蜜桃视频在线一区| 99久久精品一区| 欧美精品一级二级三级| 中文字幕+乱码+中文字幕一区| 午夜在线电影亚洲一区| 夫妻av一区二区| 日韩一级大片在线观看| 亚洲私人影院在线观看| 久久91精品久久久久久秒播| 色综合久久久久综合体桃花网| 欧美一级二级三级蜜桃| 亚洲免费av在线| 国产一区二区女| 69成人精品免费视频| 亚洲人一二三区| 国产制服丝袜一区| 欧美人体做爰大胆视频| 最新热久久免费视频| 久久国产精品色婷婷| 精品视频一区三区九区| 欧美国产日本韩| 狠狠色狠狠色综合系列| 欧美性高清videossexo| 国产精品免费av| 美国一区二区三区在线播放| 欧美色综合天天久久综合精品| 国产欧美日韩中文久久| 免费国产亚洲视频| 欧美调教femdomvk| 国产精品进线69影院| 国产一区二区三区久久悠悠色av | 中文字幕一区二区三区蜜月 | 日韩精品成人一区二区三区| 99九九99九九九视频精品| 久久精品视频一区二区三区| 免费在线观看日韩欧美| 欧美日韩在线播| 亚洲图片一区二区| 91久久精品网| 亚洲色欲色欲www| 91亚洲永久精品| 亚洲欧洲色图综合| 国产一区中文字幕| 久久久精品中文字幕麻豆发布| 黄色日韩网站视频| 久久这里都是精品| 国产一区二区伦理片| 久久久久久久久久久久久夜| 国产精品资源在线看| 久久久99精品免费观看不卡| 国产精品影视网|