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

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

?? scsi_tgt_lib.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
{	struct Scsi_Host *shost = scsi_tgt_cmd_to_host(cmd);	int err;	dprintk("cmd %p %lu\n", cmd, rq_data_dir(cmd->request));	err = shost->hostt->transfer_response(cmd, scsi_tgt_cmd_done);	switch (err) {	case SCSI_MLQUEUE_HOST_BUSY:	case SCSI_MLQUEUE_DEVICE_BUSY:		return -EAGAIN;	}	return 0;}static int scsi_tgt_init_cmd(struct scsi_cmnd *cmd, gfp_t gfp_mask){	struct request *rq = cmd->request;	int count;	cmd->use_sg = rq->nr_phys_segments;	cmd->request_buffer = scsi_alloc_sgtable(cmd, gfp_mask);	if (!cmd->request_buffer)		return -ENOMEM;	cmd->request_bufflen = rq->data_len;	dprintk("cmd %p cnt %d %lu\n", cmd, cmd->use_sg, rq_data_dir(rq));	count = blk_rq_map_sg(rq->q, rq, cmd->request_buffer);	if (likely(count <= cmd->use_sg)) {		cmd->use_sg = count;		return 0;	}	eprintk("cmd %p cnt %d\n", cmd, cmd->use_sg);	scsi_free_sgtable(cmd);	return -EINVAL;}/* TODO: test this crap and replace bio_map_user with new interface maybe */static int scsi_map_user_pages(struct scsi_tgt_cmd *tcmd, struct scsi_cmnd *cmd,			       unsigned long uaddr, unsigned int len, int rw){	struct request_queue *q = cmd->request->q;	struct request *rq = cmd->request;	int err;	dprintk("%lx %u\n", uaddr, len);	err = blk_rq_map_user(q, rq, (void *)uaddr, len);	if (err) {		/*		 * TODO: need to fixup sg_tablesize, max_segment_size,		 * max_sectors, etc for modern HW and software drivers		 * where this value is bogus.		 *		 * TODO2: we can alloc a reserve buffer of max size		 * we can handle and do the slow copy path for really large		 * IO.		 */		eprintk("Could not handle request of size %u.\n", len);		return err;	}	tcmd->bio = rq->bio;	err = scsi_tgt_init_cmd(cmd, GFP_KERNEL);	if (err)		goto unmap_rq;	return 0;unmap_rq:	scsi_unmap_user_pages(tcmd);	return err;}static int scsi_tgt_copy_sense(struct scsi_cmnd *cmd, unsigned long uaddr,				unsigned len){	char __user *p = (char __user *) uaddr;	if (copy_from_user(cmd->sense_buffer, p,			   min_t(unsigned, SCSI_SENSE_BUFFERSIZE, len))) {		printk(KERN_ERR "Could not copy the sense buffer\n");		return -EIO;	}	return 0;}static int scsi_tgt_abort_cmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd){	struct scsi_tgt_cmd *tcmd;	int err;	err = shost->hostt->eh_abort_handler(cmd);	if (err)		eprintk("fail to abort %p\n", cmd);	tcmd = cmd->request->end_io_data;	scsi_tgt_cmd_destroy(&tcmd->work);	return err;}static struct request *tgt_cmd_hash_lookup(struct request_queue *q, u64 tag){	struct scsi_tgt_queuedata *qdata = q->queuedata;	struct request *rq = NULL;	struct list_head *head;	struct scsi_tgt_cmd *tcmd;	unsigned long flags;	head = &qdata->cmd_hash[cmd_hashfn(tag)];	spin_lock_irqsave(&qdata->cmd_hash_lock, flags);	list_for_each_entry(tcmd, head, hash_list) {		if (tcmd->tag == tag) {			rq = tcmd->rq;			list_del(&tcmd->hash_list);			break;		}	}	spin_unlock_irqrestore(&qdata->cmd_hash_lock, flags);	return rq;}int scsi_tgt_kspace_exec(int host_no, u64 itn_id, int result, u64 tag,			 unsigned long uaddr, u32 len, unsigned long sense_uaddr,			 u32 sense_len, u8 rw){	struct Scsi_Host *shost;	struct scsi_cmnd *cmd;	struct request *rq;	struct scsi_tgt_cmd *tcmd;	int err = 0;	dprintk("%d %llu %d %u %lx %u\n", host_no, (unsigned long long) tag,		result, len, uaddr, rw);	/* TODO: replace with a O(1) alg */	shost = scsi_host_lookup(host_no);	if (IS_ERR(shost)) {		printk(KERN_ERR "Could not find host no %d\n", host_no);		return -EINVAL;	}	if (!shost->uspace_req_q) {		printk(KERN_ERR "Not target scsi host %d\n", host_no);		goto done;	}	rq = tgt_cmd_hash_lookup(shost->uspace_req_q, tag);	if (!rq) {		printk(KERN_ERR "Could not find tag %llu\n",		       (unsigned long long) tag);		err = -EINVAL;		goto done;	}	cmd = rq->special;	dprintk("cmd %p scb %x result %d len %d bufflen %u %lu %x\n",		cmd, cmd->cmnd[0], result, len, cmd->request_bufflen,		rq_data_dir(rq), cmd->cmnd[0]);	if (result == TASK_ABORTED) {		scsi_tgt_abort_cmd(shost, cmd);		goto done;	}	/*	 * store the userspace values here, the working values are	 * in the request_* values	 */	tcmd = cmd->request->end_io_data;	cmd->result = result;	if (cmd->result == SAM_STAT_CHECK_CONDITION)		scsi_tgt_copy_sense(cmd, sense_uaddr, sense_len);	if (len) {		err = scsi_map_user_pages(rq->end_io_data, cmd, uaddr, len, rw);		if (err) {			/*			 * user-space daemon bugs or OOM			 * TODO: we can do better for OOM.			 */			struct scsi_tgt_queuedata *qdata;			struct list_head *head;			unsigned long flags;			eprintk("cmd %p ret %d uaddr %lx len %d rw %d\n",				cmd, err, uaddr, len, rw);			qdata = shost->uspace_req_q->queuedata;			head = &qdata->cmd_hash[cmd_hashfn(tcmd->tag)];			spin_lock_irqsave(&qdata->cmd_hash_lock, flags);			list_add(&tcmd->hash_list, head);			spin_unlock_irqrestore(&qdata->cmd_hash_lock, flags);			goto done;		}	}	err = scsi_tgt_transfer_response(cmd);done:	scsi_host_put(shost);	return err;}int scsi_tgt_tsk_mgmt_request(struct Scsi_Host *shost, u64 itn_id,			      int function, u64 tag, struct scsi_lun *scsilun,			      void *data){	int err;	/* TODO: need to retry if this fails. */	err = scsi_tgt_uspace_send_tsk_mgmt(shost->host_no, itn_id,					    function, tag, scsilun, data);	if (err < 0)		eprintk("The task management request lost!\n");	return err;}EXPORT_SYMBOL_GPL(scsi_tgt_tsk_mgmt_request);int scsi_tgt_kspace_tsk_mgmt(int host_no, u64 itn_id, u64 mid, int result){	struct Scsi_Host *shost;	int err = -EINVAL;	dprintk("%d %d %llx\n", host_no, result, (unsigned long long) mid);	shost = scsi_host_lookup(host_no);	if (IS_ERR(shost)) {		printk(KERN_ERR "Could not find host no %d\n", host_no);		return err;	}	if (!shost->uspace_req_q) {		printk(KERN_ERR "Not target scsi host %d\n", host_no);		goto done;	}	err = shost->transportt->tsk_mgmt_response(shost, itn_id, mid, result);done:	scsi_host_put(shost);	return err;}int scsi_tgt_it_nexus_create(struct Scsi_Host *shost, u64 itn_id,			     char *initiator){	int err;	/* TODO: need to retry if this fails. */	err = scsi_tgt_uspace_send_it_nexus_request(shost->host_no, itn_id, 0,						    initiator);	if (err < 0)		eprintk("The i_t_neuxs request lost, %d %llx!\n",			shost->host_no, (unsigned long long)itn_id);	return err;}EXPORT_SYMBOL_GPL(scsi_tgt_it_nexus_create);int scsi_tgt_it_nexus_destroy(struct Scsi_Host *shost, u64 itn_id){	int err;	/* TODO: need to retry if this fails. */	err = scsi_tgt_uspace_send_it_nexus_request(shost->host_no,						    itn_id, 1, NULL);	if (err < 0)		eprintk("The i_t_neuxs request lost, %d %llx!\n",			shost->host_no, (unsigned long long)itn_id);	return err;}EXPORT_SYMBOL_GPL(scsi_tgt_it_nexus_destroy);int scsi_tgt_kspace_it_nexus_rsp(int host_no, u64 itn_id, int result){	struct Scsi_Host *shost;	int err = -EINVAL;	dprintk("%d %d %llx\n", host_no, result, (unsigned long long) mid);	shost = scsi_host_lookup(host_no);	if (IS_ERR(shost)) {		printk(KERN_ERR "Could not find host no %d\n", host_no);		return err;	}	if (!shost->uspace_req_q) {		printk(KERN_ERR "Not target scsi host %d\n", host_no);		goto done;	}	err = shost->transportt->it_nexus_response(shost, itn_id, result);done:	scsi_host_put(shost);	return err;}static int __init scsi_tgt_init(void){	int err;	scsi_tgt_cmd_cache = kmem_cache_create("scsi_tgt_cmd",					       sizeof(struct scsi_tgt_cmd),					       0, 0, NULL);	if (!scsi_tgt_cmd_cache)		return -ENOMEM;	scsi_tgtd = create_workqueue("scsi_tgtd");	if (!scsi_tgtd) {		err = -ENOMEM;		goto free_kmemcache;	}	err = scsi_tgt_if_init();	if (err)		goto destroy_wq;	return 0;destroy_wq:	destroy_workqueue(scsi_tgtd);free_kmemcache:	kmem_cache_destroy(scsi_tgt_cmd_cache);	return err;}static void __exit scsi_tgt_exit(void){	destroy_workqueue(scsi_tgtd);	scsi_tgt_if_exit();	kmem_cache_destroy(scsi_tgt_cmd_cache);}module_init(scsi_tgt_init);module_exit(scsi_tgt_exit);MODULE_DESCRIPTION("SCSI target core");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本强好片久久久久久aaa| 成人在线综合网| 国产盗摄视频一区二区三区| 99久久久无码国产精品| 日韩精品一区二区在线| 一区二区三区中文字幕电影 | 韩国三级在线一区| 欧美日韩一区视频| 亚洲人快播电影网| 成人看片黄a免费看在线| 欧美一区二区日韩| 午夜私人影院久久久久| 色天使色偷偷av一区二区 | 日韩一级完整毛片| 性做久久久久久免费观看| 一本色道久久综合亚洲精品按摩| 久久久高清一区二区三区| 香蕉久久夜色精品国产使用方法| 色婷婷亚洲婷婷| 国产精品美女一区二区| 高清日韩电视剧大全免费| 日韩精品专区在线影院重磅| 日韩高清不卡一区二区| 欧美一区二区三区在线| 日韩电影在线一区二区三区| 制服视频三区第一页精品| 婷婷中文字幕综合| 6080午夜不卡| 麻豆传媒一区二区三区| 日韩欧美国产综合在线一区二区三区 | 综合亚洲深深色噜噜狠狠网站| 国产高清一区日本| 国产精品久久三区| 99精品欧美一区| 亚洲另类中文字| 欧美伊人久久久久久久久影院| 有坂深雪av一区二区精品| 欧美性受xxxx黑人xyx| 性久久久久久久| 精品少妇一区二区三区免费观看 | 91麻豆精东视频| 夜夜亚洲天天久久| 欧美日韩一区久久| 九九热在线视频观看这里只有精品| 欧美一卡2卡三卡4卡5免费| 久久精品99国产国产精| 国产日韩欧美精品一区| 色综合天天视频在线观看| 亚洲第一二三四区| 日韩一区二区三区视频在线| 国产在线视频一区二区| 中文字幕在线播放不卡一区| 欧美色视频一区| 激情另类小说区图片区视频区| 久久精品视频在线看| 91麻豆.com| 蜜臀久久久99精品久久久久久| www日韩大片| 一道本成人在线| 久久精品99久久久| 亚洲精品成人精品456| 欧美成人一区二区三区| 99久久99久久精品免费看蜜桃| 午夜免费欧美电影| 中文字幕不卡三区| 91精选在线观看| 成人免费福利片| 日韩va欧美va亚洲va久久| 国产女人水真多18毛片18精品视频| 色噜噜夜夜夜综合网| 精品一区二区三区免费视频| 亚洲精品高清在线观看| 久久精品男人的天堂| 欧美日韩国产一二三| 99久久精品免费看国产免费软件| 日韩va亚洲va欧美va久久| 国产精品伦一区| 精品欧美一区二区久久| 在线亚洲+欧美+日本专区| 国产成人精品一区二区三区四区 | 免费高清在线视频一区·| 国产精品人成在线观看免费 | 色八戒一区二区三区| 国产乱码字幕精品高清av| 午夜精品福利在线| 亚洲欧美另类久久久精品2019| 2023国产精华国产精品| 538在线一区二区精品国产| 91麻豆自制传媒国产之光| 国产伦精品一区二区三区视频青涩 | 精品亚洲porn| 日韩经典一区二区| 亚洲一区二区三区视频在线播放| 久久精品一区二区三区四区| 欧美一区二区在线观看| 欧美视频在线观看一区| 99国产精品视频免费观看| 成人爱爱电影网址| 国产电影精品久久禁18| 国产精品一区久久久久| 国产真实精品久久二三区| 蜜桃久久av一区| 麻豆精品国产传媒mv男同| 丝瓜av网站精品一区二区 | 欧美色综合天天久久综合精品| 成人免费观看男女羞羞视频| 国产伦精品一区二区三区免费迷 | 亚洲bt欧美bt精品777| 亚洲一二三专区| 亚洲福利一二三区| 性感美女久久精品| 免费精品视频最新在线| 青青草国产成人av片免费| 免费高清成人在线| 狠狠色综合播放一区二区| 国产一区二区伦理片| 国产成人av影院| www.欧美日韩国产在线| 91亚洲资源网| 在线这里只有精品| 欧美久久一二区| 精品国产一区二区三区不卡 | 国产不卡高清在线观看视频| 激情欧美一区二区| 丰满少妇在线播放bd日韩电影| 国产福利不卡视频| 成人免费视频视频| 在线观看网站黄不卡| 欧美放荡的少妇| 精品国产1区二区| 国产精品毛片无遮挡高清| 亚洲综合清纯丝袜自拍| 亚洲va韩国va欧美va精品| 久草热8精品视频在线观看| 国产精品一区二区在线播放| 99久久精品国产毛片| 欧美亚洲国产一区二区三区va| 欧美丰满少妇xxxbbb| 国产欧美一区二区三区网站 | 91久久精品国产91性色tv| 欧美理论片在线| 久久久国产午夜精品| 亚洲女人的天堂| 蜜臀va亚洲va欧美va天堂| 懂色一区二区三区免费观看| 在线亚洲人成电影网站色www| 欧美一级精品在线| 国产精品国产三级国产三级人妇 | 亚洲在线观看免费视频| 男女视频一区二区| 成人激情免费视频| 欧美高清在线精品一区| 亚洲精品国产精华液| 精品一二三四区| 色吊一区二区三区| 久久精品免视看| 午夜电影网一区| 成人精品视频网站| 日韩一区二区精品在线观看| ●精品国产综合乱码久久久久 | 91精品国产黑色紧身裤美女| 国产偷v国产偷v亚洲高清| 日韩精品一级中文字幕精品视频免费观看 | 日韩精品一区二区三区swag| 亚洲欧美怡红院| 久久aⅴ国产欧美74aaa| 91精品福利视频| 久久精品亚洲国产奇米99| 日韩国产欧美在线视频| 色中色一区二区| 国产亚洲综合性久久久影院| 日韩电影在线免费看| 日本韩国一区二区三区视频| 国产亚洲精品bt天堂精选| 日本免费在线视频不卡一不卡二| 播五月开心婷婷综合| 精品国产髙清在线看国产毛片| 一区二区日韩电影| av成人动漫在线观看| 亚洲国产精品传媒在线观看| 国产综合色产在线精品| 欧美电视剧在线看免费| 天天综合网 天天综合色| 一本一本大道香蕉久在线精品| 中文字幕免费观看一区| 精品一区二区影视| 精品久久99ma| 久久成人免费电影| 日韩精品一区二区三区老鸭窝| 视频一区免费在线观看| 欧美欧美欧美欧美首页| 香蕉成人啪国产精品视频综合网| 在线免费亚洲电影| 亚洲午夜国产一区99re久久| 色菇凉天天综合网| 午夜亚洲国产au精品一区二区| 欧美猛男男办公室激情| 日韩精品视频网站| 欧美刺激脚交jootjob| 国内不卡的二区三区中文字幕|