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

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

?? scsi_ioctl.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
字號(hào):
#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;}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本欧美天堂| av在线不卡电影| 天堂蜜桃一区二区三区| 亚洲一区二区三区四区五区黄| 136国产福利精品导航| 亚洲日本一区二区三区| 亚洲乱码中文字幕综合| 亚洲综合免费观看高清完整版| 一区二区高清在线| 亚洲成人自拍网| 日韩中文字幕亚洲一区二区va在线| 亚洲成va人在线观看| 午夜视频在线观看一区二区三区| 亚洲国产aⅴ成人精品无吗| 亚洲成a人在线观看| 奇米777欧美一区二区| 激情六月婷婷久久| 国产精品99精品久久免费| 成人av网在线| 欧美在线观看一区| 91精品国模一区二区三区| 精品国产91乱码一区二区三区 | 在线免费av一区| 欧美精品在线一区二区三区| 日韩视频中午一区| 久久久久久久久97黄色工厂| 日本一区二区久久| 亚洲综合在线视频| 免费成人av资源网| 欧美吞精做爰啪啪高潮| 欧美久久婷婷综合色| 欧美变态口味重另类| 国产精品丝袜一区| 亚洲国产精品久久久男人的天堂| 日本伊人精品一区二区三区观看方式 | 中文字幕在线免费不卡| 亚洲精品国产无天堂网2021| 日韩不卡一二三区| 国产高清久久久久| 欧美视频一区在线| 日韩欧美你懂的| 国产精品久久久久久久久久久免费看| 亚洲精品免费在线观看| 免费高清在线一区| 高潮精品一区videoshd| 欧美色图片你懂的| www欧美成人18+| 亚洲免费电影在线| 国内精品久久久久影院薰衣草 | 日韩精品一区二区在线观看| 国产精品三级av在线播放| 亚洲一区二区五区| 国产91丝袜在线播放0| 欧美三级电影网站| 26uuu亚洲婷婷狠狠天堂| 亚洲黄色性网站| 国产在线视视频有精品| 色先锋资源久久综合| 久久综合色婷婷| 亚洲1区2区3区视频| 国产不卡在线视频| 欧美一级免费大片| 亚洲欧洲中文日韩久久av乱码| 免费成人美女在线观看| 色噜噜狠狠色综合中国| 久久久久久免费| 日韩国产在线一| 色婷婷香蕉在线一区二区| 2020国产精品自拍| 婷婷开心激情综合| 91蜜桃在线免费视频| 久久精品亚洲国产奇米99| 亚洲国产wwwccc36天堂| 99国产精品国产精品毛片| 久久亚洲欧美国产精品乐播| 日韩制服丝袜先锋影音| 在线国产亚洲欧美| 国产精品国产三级国产有无不卡 | 处破女av一区二区| 亚洲精品一区二区三区福利 | 99精品视频在线观看免费| 久久综合久久综合九色| 日韩精品免费专区| 欧美性生交片4| 亚洲欧美激情视频在线观看一区二区三区| 理论电影国产精品| 欧美一区二视频| 同产精品九九九| 欧美日韩国产成人在线免费| 一区二区三区小说| 色综合久久99| 一区二区三区在线视频播放 | 精品久久人人做人人爰| 日韩专区在线视频| 欧美精品久久99久久在免费线| 亚洲激情六月丁香| 日本二三区不卡| 亚洲精品中文字幕乱码三区| 91一区二区三区在线观看| 国产精品高潮久久久久无| av在线不卡电影| 亚洲欧美aⅴ...| 在线观看视频一区| 亚洲另类春色校园小说| 欧美专区亚洲专区| 亚洲一区中文日韩| 欧美日韩激情一区二区| 天天操天天干天天综合网| 欧美影视一区在线| 日韩黄色在线观看| 精品国产欧美一区二区| 国产精品99久久久久久久vr| 中文字幕精品三区| 99re视频精品| 亚洲综合男人的天堂| 欧美日韩精品欧美日韩精品一| 日韩精品电影一区亚洲| 日韩欧美国产wwwww| 国产精品一区二区无线| 国产精品久久久久影院老司 | 欧美精品一区二区三区一线天视频 | 亚洲电影在线播放| 欧美精品 国产精品| 美女网站在线免费欧美精品| 亚洲精品一线二线三线| 成人av在线电影| 玉米视频成人免费看| 欧美一区二区三区免费观看视频| 国产在线播放一区三区四| 日本一区二区不卡视频| 一本色道久久综合精品竹菊| 亚洲大片免费看| 久久综合99re88久久爱| www.亚洲精品| 天堂va蜜桃一区二区三区漫画版 | 亚洲成人激情av| 亚洲精品一线二线三线无人区| proumb性欧美在线观看| 亚洲成人三级小说| 久久久精品日韩欧美| 91麻豆国产福利在线观看| 视频一区视频二区中文| 久久久久久久久岛国免费| 欧美亚洲综合在线| 久99久精品视频免费观看| 国产精品传媒在线| 欧美精品久久99久久在免费线| 国产传媒一区在线| 亚洲福利视频一区| 亚洲国产高清aⅴ视频| 欧美色综合网站| 丰满白嫩尤物一区二区| 香蕉久久一区二区不卡无毒影院| 久久九九影视网| 欧美日韩精品一区二区天天拍小说 | 九色综合狠狠综合久久| 亚洲欧美日本在线| 久久久久久黄色| 在线精品视频一区二区| 国产一区二区三区精品视频| 亚洲一区二区欧美激情| 国产亚洲一区二区三区在线观看| 欧美在线999| 东方aⅴ免费观看久久av| 香蕉久久夜色精品国产使用方法| 国产精品理论片| 精品国产精品一区二区夜夜嗨| 欧美色综合天天久久综合精品| 大美女一区二区三区| 精品中文字幕一区二区小辣椒| 亚洲综合av网| 国产精品久久精品日日| 久久蜜桃av一区精品变态类天堂 | 成人欧美一区二区三区白人| 欧美tickling挠脚心丨vk| 在线精品视频一区二区三四| 成人av免费在线播放| 国产精品一二二区| 麻豆精品新av中文字幕| 香蕉成人伊视频在线观看| 亚洲黄色免费网站| 国产精品国模大尺度视频| 国产亚洲一区二区在线观看| 欧美大片免费久久精品三p| 欧美日韩一区二区三区四区| 96av麻豆蜜桃一区二区| 国产98色在线|日韩| 国产乱人伦精品一区二区在线观看| 日韩精品电影在线| 午夜精品视频一区| 一个色综合网站| 亚洲精品免费播放| 亚洲欧洲韩国日本视频| 久久久精品一品道一区| 久久女同互慰一区二区三区| 精品国产一区a| 久久一日本道色综合| 久久综合色8888| 久久免费视频色| 国产欧美精品国产国产专区|