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

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

?? scsi_tgt_lib.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * SCSI target lib functions * * Copyright (C) 2005 Mike Christie <michaelc@cs.wisc.edu> * Copyright (C) 2005 FUJITA Tomonori <tomof@acm.org> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA */#include <linux/blkdev.h>#include <linux/hash.h>#include <linux/module.h>#include <linux/pagemap.h>#include <scsi/scsi.h>#include <scsi/scsi_cmnd.h>#include <scsi/scsi_device.h>#include <scsi/scsi_host.h>#include <scsi/scsi_transport.h>#include <scsi/scsi_tgt.h>#include "scsi_tgt_priv.h"static struct workqueue_struct *scsi_tgtd;static struct kmem_cache *scsi_tgt_cmd_cache;/* * TODO: this struct will be killed when the block layer supports large bios * and James's work struct code is in */struct scsi_tgt_cmd {	/* TODO replace work with James b's code */	struct work_struct work;	/* TODO fix limits of some drivers */	struct bio *bio;	struct list_head hash_list;	struct request *rq;	u64 itn_id;	u64 tag;};#define TGT_HASH_ORDER	4#define cmd_hashfn(tag)	hash_long((unsigned long) (tag), TGT_HASH_ORDER)struct scsi_tgt_queuedata {	struct Scsi_Host *shost;	struct list_head cmd_hash[1 << TGT_HASH_ORDER];	spinlock_t cmd_hash_lock;};/* * Function:	scsi_host_get_command() * * Purpose:	Allocate and setup a scsi command block and blk request * * Arguments:	shost	- scsi host *		data_dir - dma data dir *		gfp_mask- allocator flags * * Returns:	The allocated scsi command structure. * * This should be called by target LLDs to get a command. */struct scsi_cmnd *scsi_host_get_command(struct Scsi_Host *shost,					enum dma_data_direction data_dir,					gfp_t gfp_mask){	int write = (data_dir == DMA_TO_DEVICE);	struct request *rq;	struct scsi_cmnd *cmd;	struct scsi_tgt_cmd *tcmd;	/* Bail if we can't get a reference to the device */	if (!get_device(&shost->shost_gendev))		return NULL;	tcmd = kmem_cache_alloc(scsi_tgt_cmd_cache, GFP_ATOMIC);	if (!tcmd)		goto put_dev;	/*	 * The blk helpers are used to the READ/WRITE requests	 * transfering data from a initiator point of view. Since	 * we are in target mode we want the opposite.	 */	rq = blk_get_request(shost->uspace_req_q, !write, gfp_mask);	if (!rq)		goto free_tcmd;	cmd = __scsi_get_command(shost, gfp_mask);	if (!cmd)		goto release_rq;	memset(cmd, 0, sizeof(*cmd));	cmd->sc_data_direction = data_dir;	cmd->jiffies_at_alloc = jiffies;	cmd->request = rq;	rq->special = cmd;	rq->cmd_type = REQ_TYPE_SPECIAL;	rq->cmd_flags |= REQ_TYPE_BLOCK_PC;	rq->end_io_data = tcmd;	tcmd->rq = rq;	return cmd;release_rq:	blk_put_request(rq);free_tcmd:	kmem_cache_free(scsi_tgt_cmd_cache, tcmd);put_dev:	put_device(&shost->shost_gendev);	return NULL;}EXPORT_SYMBOL_GPL(scsi_host_get_command);/* * Function:	scsi_host_put_command() * * Purpose:	Free a scsi command block * * Arguments:	shost	- scsi host * 		cmd	- command block to free * * Returns:	Nothing. * * Notes:	The command must not belong to any lists. */void scsi_host_put_command(struct Scsi_Host *shost, struct scsi_cmnd *cmd){	struct request_queue *q = shost->uspace_req_q;	struct request *rq = cmd->request;	struct scsi_tgt_cmd *tcmd = rq->end_io_data;	unsigned long flags;	kmem_cache_free(scsi_tgt_cmd_cache, tcmd);	spin_lock_irqsave(q->queue_lock, flags);	__blk_put_request(q, rq);	spin_unlock_irqrestore(q->queue_lock, flags);	__scsi_put_command(shost, cmd, &shost->shost_gendev);}EXPORT_SYMBOL_GPL(scsi_host_put_command);static void cmd_hashlist_del(struct scsi_cmnd *cmd){	struct request_queue *q = cmd->request->q;	struct scsi_tgt_queuedata *qdata = q->queuedata;	unsigned long flags;	struct scsi_tgt_cmd *tcmd = cmd->request->end_io_data;	spin_lock_irqsave(&qdata->cmd_hash_lock, flags);	list_del(&tcmd->hash_list);	spin_unlock_irqrestore(&qdata->cmd_hash_lock, flags);}static void scsi_unmap_user_pages(struct scsi_tgt_cmd *tcmd){	blk_rq_unmap_user(tcmd->bio);}static void scsi_tgt_cmd_destroy(struct work_struct *work){	struct scsi_tgt_cmd *tcmd =		container_of(work, struct scsi_tgt_cmd, work);	struct scsi_cmnd *cmd = tcmd->rq->special;	dprintk("cmd %p %d %lu\n", cmd, cmd->sc_data_direction,		rq_data_dir(cmd->request));	scsi_unmap_user_pages(tcmd);	scsi_host_put_command(scsi_tgt_cmd_to_host(cmd), cmd);}static void init_scsi_tgt_cmd(struct request *rq, struct scsi_tgt_cmd *tcmd,			      u64 itn_id, u64 tag){	struct scsi_tgt_queuedata *qdata = rq->q->queuedata;	unsigned long flags;	struct list_head *head;	tcmd->itn_id = itn_id;	tcmd->tag = tag;	tcmd->bio = NULL;	INIT_WORK(&tcmd->work, scsi_tgt_cmd_destroy);	spin_lock_irqsave(&qdata->cmd_hash_lock, flags);	head = &qdata->cmd_hash[cmd_hashfn(tag)];	list_add(&tcmd->hash_list, head);	spin_unlock_irqrestore(&qdata->cmd_hash_lock, flags);}/* * scsi_tgt_alloc_queue - setup queue used for message passing * shost: scsi host * * This should be called by the LLD after host allocation. * And will be released when the host is released. */int scsi_tgt_alloc_queue(struct Scsi_Host *shost){	struct scsi_tgt_queuedata *queuedata;	struct request_queue *q;	int err, i;	/*	 * Do we need to send a netlink event or should uspace	 * just respond to the hotplug event?	 */	q = __scsi_alloc_queue(shost, NULL);	if (!q)		return -ENOMEM;	queuedata = kzalloc(sizeof(*queuedata), GFP_KERNEL);	if (!queuedata) {		err = -ENOMEM;		goto cleanup_queue;	}	queuedata->shost = shost;	q->queuedata = queuedata;	/*	 * this is a silly hack. We should probably just queue as many	 * command as is recvd to userspace. uspace can then make	 * sure we do not overload the HBA	 */	q->nr_requests = shost->can_queue;	/*	 * We currently only support software LLDs so this does	 * not matter for now. Do we need this for the cards we support?	 * If so we should make it a host template value.	 */	blk_queue_dma_alignment(q, 0);	shost->uspace_req_q = q;	for (i = 0; i < ARRAY_SIZE(queuedata->cmd_hash); i++)		INIT_LIST_HEAD(&queuedata->cmd_hash[i]);	spin_lock_init(&queuedata->cmd_hash_lock);	return 0;cleanup_queue:	blk_cleanup_queue(q);	return err;}EXPORT_SYMBOL_GPL(scsi_tgt_alloc_queue);void scsi_tgt_free_queue(struct Scsi_Host *shost){	int i;	unsigned long flags;	struct request_queue *q = shost->uspace_req_q;	struct scsi_cmnd *cmd;	struct scsi_tgt_queuedata *qdata = q->queuedata;	struct scsi_tgt_cmd *tcmd, *n;	LIST_HEAD(cmds);	spin_lock_irqsave(&qdata->cmd_hash_lock, flags);	for (i = 0; i < ARRAY_SIZE(qdata->cmd_hash); i++) {		list_for_each_entry_safe(tcmd, n, &qdata->cmd_hash[i],					 hash_list) {			list_del(&tcmd->hash_list);			list_add(&tcmd->hash_list, &cmds);		}	}	spin_unlock_irqrestore(&qdata->cmd_hash_lock, flags);	while (!list_empty(&cmds)) {		tcmd = list_entry(cmds.next, struct scsi_tgt_cmd, hash_list);		list_del(&tcmd->hash_list);		cmd = tcmd->rq->special;		shost->hostt->eh_abort_handler(cmd);		scsi_tgt_cmd_destroy(&tcmd->work);	}}EXPORT_SYMBOL_GPL(scsi_tgt_free_queue);struct Scsi_Host *scsi_tgt_cmd_to_host(struct scsi_cmnd *cmd){	struct scsi_tgt_queuedata *queue = cmd->request->q->queuedata;	return queue->shost;}EXPORT_SYMBOL_GPL(scsi_tgt_cmd_to_host);/* * scsi_tgt_queue_command - queue command for userspace processing * @cmd:	scsi command * @scsilun:	scsi lun * @tag:	unique value to identify this command for tmf */int scsi_tgt_queue_command(struct scsi_cmnd *cmd, u64 itn_id,			   struct scsi_lun *scsilun, u64 tag){	struct scsi_tgt_cmd *tcmd = cmd->request->end_io_data;	int err;	init_scsi_tgt_cmd(cmd->request, tcmd, itn_id, tag);	err = scsi_tgt_uspace_send_cmd(cmd, itn_id, scsilun, tag);	if (err)		cmd_hashlist_del(cmd);	return err;}EXPORT_SYMBOL_GPL(scsi_tgt_queue_command);/* * This is run from a interrpt handler normally and the unmap * needs process context so we must queue */static void scsi_tgt_cmd_done(struct scsi_cmnd *cmd){	struct scsi_tgt_cmd *tcmd = cmd->request->end_io_data;	dprintk("cmd %p %lu\n", cmd, rq_data_dir(cmd->request));	scsi_tgt_uspace_send_status(cmd, tcmd->itn_id, tcmd->tag);	if (cmd->request_buffer)		scsi_free_sgtable(cmd);	queue_work(scsi_tgtd, &tcmd->work);}static int scsi_tgt_transfer_response(struct scsi_cmnd *cmd)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日韩国产手机在线| 成人毛片在线观看| 成人免费va视频| 欧美日韩精品一区二区| 日本一区二区三区dvd视频在线| 亚洲国产中文字幕| 成人理论电影网| 久久一日本道色综合| 午夜精品aaa| 欧美午夜精品久久久| 欧美国产国产综合| 国产精选一区二区三区| 在线播放欧美女士性生活| 亚洲人成伊人成综合网小说| 国产精品一区专区| 欧美一区二区三区色| 亚洲大片一区二区三区| 91传媒视频在线播放| 中文字幕在线不卡国产视频| 国产精品资源网| 久久色在线视频| 久久91精品国产91久久小草| 欧美日本国产一区| 亚州成人在线电影| 欧美日韩精品专区| 日本强好片久久久久久aaa| 欧洲精品中文字幕| 亚洲综合色自拍一区| 色av成人天堂桃色av| 亚洲视频1区2区| 91原创在线视频| 亚洲人精品一区| 色综合欧美在线| 亚洲欧美日本在线| 欧美性videosxxxxx| 亚洲午夜久久久久久久久电影院| 色噜噜久久综合| 一区二区三区在线视频免费| 色偷偷成人一区二区三区91| 亚洲精品综合在线| 在线看国产日韩| 看电影不卡的网站| 日本一区二区免费在线| 成人激情黄色小说| 亚洲精品菠萝久久久久久久| 在线精品视频一区二区| 丝袜美腿高跟呻吟高潮一区| 91精品在线免费| 国产一区二区主播在线| 久久精品日产第一区二区三区高清版| 国产在线视视频有精品| 久久看人人爽人人| 91麻豆国产在线观看| 一区二区三区日韩在线观看| 欧美三级中文字| 久久国产三级精品| 最新欧美精品一区二区三区| 欧美性xxxxxxxx| 国产精品小仙女| 一区二区三区中文字幕| 欧美xfplay| 99热这里都是精品| 日本亚洲三级在线| 国产精品夫妻自拍| 91精品国产乱| 91美女福利视频| 捆绑变态av一区二区三区| 国产精品国模大尺度视频| 正在播放亚洲一区| 91丨porny丨在线| 国产一区二区h| 亚洲一区二区av在线| 精品捆绑美女sm三区| 91麻豆国产精品久久| 麻豆精品在线播放| 一区二区激情小说| 国产欧美日韩精品一区| 欧美三区在线视频| 99精品偷自拍| 国产在线国偷精品产拍免费yy| 亚洲精品高清在线| 国产亚洲福利社区一区| 欧美日韩久久久久久| 成人午夜又粗又硬又大| 免费高清不卡av| 亚洲第一福利视频在线| 中文字幕中文字幕一区| 精品国产一区二区三区久久久蜜月 | 色偷偷88欧美精品久久久| 九色|91porny| 日本不卡中文字幕| 亚洲影院免费观看| 国产亚洲人成网站| 欧美一级淫片007| 欧美性猛片aaaaaaa做受| 成人av免费在线观看| 国产麻豆91精品| 免费在线观看视频一区| 丝袜亚洲另类欧美| 亚洲成人激情社区| 亚洲欧美激情在线| 中文字幕日韩一区| 中文字幕亚洲视频| 国产精品拍天天在线| 久久亚洲捆绑美女| 337p粉嫩大胆噜噜噜噜噜91av | 成人v精品蜜桃久久一区| 国产乱子伦视频一区二区三区| 日韩av二区在线播放| 亚洲成人福利片| 亚洲美女在线一区| 亚洲免费毛片网站| 亚洲乱码国产乱码精品精98午夜| 久久久不卡网国产精品一区| 精品蜜桃在线看| 26uuu亚洲综合色| 欧美精品一区二区三区在线 | 天堂久久一区二区三区| 午夜精品福利一区二区三区av| 亚洲午夜精品网| 日本免费在线视频不卡一不卡二| 午夜激情一区二区三区| 日本一不卡视频| 久久精品99久久久| 国产一区三区三区| 不卡区在线中文字幕| 色综合天天综合网天天看片| 91国产视频在线观看| 欧美日韩国产首页| 日韩精品一区二区三区中文精品| 久久在线免费观看| 日韩久久一区二区| 亚洲aⅴ怡春院| 国产综合久久久久影院| 成人美女视频在线看| 在线区一区二视频| 日韩欧美一二三区| 国产欧美日韩精品a在线观看| 亚洲视频免费观看| 免费的成人av| jizz一区二区| 911精品产国品一二三产区| 欧美成人猛片aaaaaaa| 国产精品久久久一本精品| 亚洲国产精品视频| 激情五月婷婷综合网| 成人动漫av在线| 777久久久精品| 久久精品视频在线看| 亚洲制服丝袜av| 国产福利一区二区三区视频| 在线中文字幕一区二区| 久久久久久久综合日本| 亚洲综合视频在线观看| 国产一区在线精品| 欧美系列在线观看| 日本一区二区综合亚洲| 天堂va蜜桃一区二区三区漫画版 | 91麻豆精品视频| 日韩限制级电影在线观看| ...中文天堂在线一区| 韩国av一区二区三区四区| 91啪亚洲精品| 久久久久久久一区| 日韩av网站在线观看| 一本色道久久加勒比精品| 国产亚洲福利社区一区| 日韩精品久久理论片| 91丨九色丨蝌蚪丨老版| 久久久午夜电影| 奇米一区二区三区av| 欧美中文一区二区三区| 最新欧美精品一区二区三区| 国产在线视频不卡二| 欧美一区日韩一区| 一区二区三区日韩欧美| 99天天综合性| 欧美国产综合一区二区| 蜜臀av一级做a爰片久久| 日本韩国精品在线| 国产精品免费网站在线观看| 紧缚捆绑精品一区二区| 欧美一区二区视频在线观看2020 | 国产精品丝袜久久久久久app| 男男成人高潮片免费网站| 欧美体内she精高潮| 综合色中文字幕| 99久久免费精品高清特色大片| 久久久久久久网| 成人久久视频在线观看| 久久久久国产免费免费| 国产在线精品视频| 精品福利视频一区二区三区| 免费看欧美女人艹b| 欧美一区二区三区的| 午夜精品久久久久久久久| 欧美日韩国产成人在线91| 亚洲第一电影网| 91精品国产综合久久精品麻豆| 亚洲小说欧美激情另类|