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

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

?? iscsi_tcp.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
		if (tcp_conn->in.padding)			tcp_conn->in_progress = IN_PROGRESS_PAD_RECV;		else if (conn->datadgst_en)			tcp_conn->in_progress = IN_PROGRESS_DDIGEST_RECV;		else			tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER;		tcp_conn->data_copied = 0;	}	if (tcp_conn->in_progress == IN_PROGRESS_PAD_RECV &&	    tcp_conn->in.copy) {		int copylen = min(tcp_conn->in.padding - tcp_conn->data_copied,				  tcp_conn->in.copy);		tcp_conn->in.copy -= copylen;		tcp_conn->in.offset += copylen;		tcp_conn->data_copied += copylen;		if (tcp_conn->data_copied != tcp_conn->in.padding)			tcp_conn->in_progress = IN_PROGRESS_PAD_RECV;		else if (conn->datadgst_en)			tcp_conn->in_progress = IN_PROGRESS_DDIGEST_RECV;		else			tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER;		tcp_conn->data_copied = 0;	}	debug_tcp("f, processed %d from out of %d padding %d\n",	       tcp_conn->in.offset - offset, (int)len, tcp_conn->in.padding);	BUG_ON(tcp_conn->in.offset - offset > len);	if (tcp_conn->in.offset - offset != len) {		debug_tcp("continue to process %d bytes\n",		       (int)len - (tcp_conn->in.offset - offset));		goto more;	}nomore:	processed = tcp_conn->in.offset - offset;	BUG_ON(processed == 0);	return processed;again:	processed = tcp_conn->in.offset - offset;	debug_tcp("c, processed %d from out of %d rd_desc_cnt %d\n",	          processed, (int)len, (int)rd_desc->count);	BUG_ON(processed == 0);	BUG_ON(processed > len);	conn->rxdata_octets += processed;	return processed;}static voidiscsi_tcp_data_ready(struct sock *sk, int flag){	struct iscsi_conn *conn = sk->sk_user_data;	read_descriptor_t rd_desc;	read_lock(&sk->sk_callback_lock);	/*	 * Use rd_desc to pass 'conn' to iscsi_tcp_data_recv.	 * We set count to 1 because we want the network layer to	 * hand us all the skbs that are available. iscsi_tcp_data_recv	 * handled pdus that cross buffers or pdus that still need data.	 */	rd_desc.arg.data = conn;	rd_desc.count = 1;	tcp_read_sock(sk, &rd_desc, iscsi_tcp_data_recv);	read_unlock(&sk->sk_callback_lock);}static voidiscsi_tcp_state_change(struct sock *sk){	struct iscsi_tcp_conn *tcp_conn;	struct iscsi_conn *conn;	struct iscsi_session *session;	void (*old_state_change)(struct sock *);	read_lock(&sk->sk_callback_lock);	conn = (struct iscsi_conn*)sk->sk_user_data;	session = conn->session;	if ((sk->sk_state == TCP_CLOSE_WAIT ||	     sk->sk_state == TCP_CLOSE) &&	    !atomic_read(&sk->sk_rmem_alloc)) {		debug_tcp("iscsi_tcp_state_change: TCP_CLOSE|TCP_CLOSE_WAIT\n");		iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);	}	tcp_conn = conn->dd_data;	old_state_change = tcp_conn->old_state_change;	read_unlock(&sk->sk_callback_lock);	old_state_change(sk);}/** * iscsi_write_space - Called when more output buffer space is available * @sk: socket space is available for **/static voidiscsi_write_space(struct sock *sk){	struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data;	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;	tcp_conn->old_write_space(sk);	debug_tcp("iscsi_write_space: cid %d\n", conn->id);	scsi_queue_work(conn->session->host, &conn->xmitwork);}static voidiscsi_conn_set_callbacks(struct iscsi_conn *conn){	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;	struct sock *sk = tcp_conn->sock->sk;	/* assign new callbacks */	write_lock_bh(&sk->sk_callback_lock);	sk->sk_user_data = conn;	tcp_conn->old_data_ready = sk->sk_data_ready;	tcp_conn->old_state_change = sk->sk_state_change;	tcp_conn->old_write_space = sk->sk_write_space;	sk->sk_data_ready = iscsi_tcp_data_ready;	sk->sk_state_change = iscsi_tcp_state_change;	sk->sk_write_space = iscsi_write_space;	write_unlock_bh(&sk->sk_callback_lock);}static voidiscsi_conn_restore_callbacks(struct iscsi_tcp_conn *tcp_conn){	struct sock *sk = tcp_conn->sock->sk;	/* restore socket callbacks, see also: iscsi_conn_set_callbacks() */	write_lock_bh(&sk->sk_callback_lock);	sk->sk_user_data    = NULL;	sk->sk_data_ready   = tcp_conn->old_data_ready;	sk->sk_state_change = tcp_conn->old_state_change;	sk->sk_write_space  = tcp_conn->old_write_space;	sk->sk_no_check	 = 0;	write_unlock_bh(&sk->sk_callback_lock);}/** * iscsi_send - generic send routine * @sk: kernel's socket * @buf: buffer to write from * @size: actual size to write * @flags: socket's flags */static inline intiscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags){	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;	struct socket *sk = tcp_conn->sock;	int offset = buf->sg.offset + buf->sent, res;	/*	 * if we got use_sg=0 or are sending something we kmallocd	 * then we did not have to do kmap (kmap returns page_address)	 *	 * if we got use_sg > 0, but had to drop down, we do not	 * set clustering so this should only happen for that	 * slab case.	 */	if (buf->use_sendmsg)		res = sock_no_sendpage(sk, sg_page(&buf->sg), offset, size, flags);	else		res = tcp_conn->sendpage(sk, sg_page(&buf->sg), offset, size, flags);	if (res >= 0) {		conn->txdata_octets += res;		buf->sent += res;		return res;	}	tcp_conn->sendpage_failures_cnt++;	if (res == -EAGAIN)		res = -ENOBUFS;	else		iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);	return res;}/** * iscsi_sendhdr - send PDU Header via tcp_sendpage() * @conn: iscsi connection * @buf: buffer to write from * @datalen: lenght of data to be sent after the header * * Notes: *	(Tx, Fast Path) **/static inline intiscsi_sendhdr(struct iscsi_conn *conn, struct iscsi_buf *buf, int datalen){	int flags = 0; /* MSG_DONTWAIT; */	int res, size;	size = buf->sg.length - buf->sent;	BUG_ON(buf->sent + size > buf->sg.length);	if (buf->sent + size != buf->sg.length || datalen)		flags |= MSG_MORE;	res = iscsi_send(conn, buf, size, flags);	debug_tcp("sendhdr %d bytes, sent %d res %d\n", size, buf->sent, res);	if (res >= 0) {		if (size != res)			return -EAGAIN;		return 0;	}	return res;}/** * iscsi_sendpage - send one page of iSCSI Data-Out. * @conn: iscsi connection * @buf: buffer to write from * @count: remaining data * @sent: number of bytes sent * * Notes: *	(Tx, Fast Path) **/static inline intiscsi_sendpage(struct iscsi_conn *conn, struct iscsi_buf *buf,	       int *count, int *sent){	int flags = 0; /* MSG_DONTWAIT; */	int res, size;	size = buf->sg.length - buf->sent;	BUG_ON(buf->sent + size > buf->sg.length);	if (size > *count)		size = *count;	if (buf->sent + size != buf->sg.length || *count != size)		flags |= MSG_MORE;	res = iscsi_send(conn, buf, size, flags);	debug_tcp("sendpage: %d bytes, sent %d left %d sent %d res %d\n",		  size, buf->sent, *count, *sent, res);	if (res >= 0) {		*count -= res;		*sent += res;		if (size != res)			return -EAGAIN;		return 0;	}	return res;}static inline voidiscsi_data_digest_init(struct iscsi_tcp_conn *tcp_conn,		      struct iscsi_tcp_cmd_task *tcp_ctask){	crypto_hash_init(&tcp_conn->tx_hash);	tcp_ctask->digest_count = 4;}/** * iscsi_solicit_data_cont - initialize next Data-Out * @conn: iscsi connection * @ctask: scsi command task * @r2t: R2T info * @left: bytes left to transfer * * Notes: *	Initialize next Data-Out within this R2T sequence and continue *	to process next Scatter-Gather element(if any) of this SCSI command. * *	Called under connection lock. **/static voidiscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,			struct iscsi_r2t_info *r2t, int left){	struct iscsi_data *hdr;	int new_offset;	hdr = &r2t->dtask.hdr;	memset(hdr, 0, sizeof(struct iscsi_data));	hdr->ttt = r2t->ttt;	hdr->datasn = cpu_to_be32(r2t->solicit_datasn);	r2t->solicit_datasn++;	hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;	memcpy(hdr->lun, ctask->hdr->lun, sizeof(hdr->lun));	hdr->itt = ctask->hdr->itt;	hdr->exp_statsn = r2t->exp_statsn;	new_offset = r2t->data_offset + r2t->sent;	hdr->offset = cpu_to_be32(new_offset);	if (left > conn->max_xmit_dlength) {		hton24(hdr->dlength, conn->max_xmit_dlength);		r2t->data_count = conn->max_xmit_dlength;	} else {		hton24(hdr->dlength, left);		r2t->data_count = left;		hdr->flags = ISCSI_FLAG_CMD_FINAL;	}	conn->dataout_pdus_cnt++;	iscsi_buf_init_iov(&r2t->headbuf, (char*)hdr,			   sizeof(struct iscsi_hdr));	if (iscsi_buf_left(&r2t->sendbuf))		return;	iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);	r2t->sg += 1;}static void iscsi_set_padding(struct iscsi_tcp_cmd_task *tcp_ctask,			      unsigned long len){	tcp_ctask->pad_count = len & (ISCSI_PAD_LEN - 1);	if (!tcp_ctask->pad_count)		return;	tcp_ctask->pad_count = ISCSI_PAD_LEN - tcp_ctask->pad_count;	debug_scsi("write padding %d bytes\n", tcp_ctask->pad_count);	set_bit(XMSTATE_BIT_W_PAD, &tcp_ctask->xmstate);}/** * iscsi_tcp_cmd_init - Initialize iSCSI SCSI_READ or SCSI_WRITE commands * @conn: iscsi connection * @ctask: scsi command task * @sc: scsi command **/static voidiscsi_tcp_cmd_init(struct iscsi_cmd_task *ctask){	struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;	BUG_ON(__kfifo_len(tcp_ctask->r2tqueue));	tcp_ctask->xmstate = 1 << XMSTATE_BIT_CMD_HDR_INIT;}/** * iscsi_tcp_mtask_xmit - xmit management(immediate) task * @conn: iscsi connection * @mtask: task management task * * Notes: *	The function can return -EAGAIN in which case caller must *	call it again later, or recover. '0' return code means successful *	xmit. * *	Management xmit state machine consists of these states: *		XMSTATE_BIT_IMM_HDR_INIT - calculate digest of PDU Header *		XMSTATE_BIT_IMM_HDR      - PDU Header xmit in progress *		XMSTATE_BIT_IMM_DATA     - PDU Data xmit in progress *		XMSTATE_VALUE_IDLE       - management PDU is done **/static intiscsi_tcp_mtask_xmit(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask){	struct iscsi_tcp_mgmt_task *tcp_mtask = mtask->dd_data;	int rc;	debug_scsi("mtask deq [cid %d state %x itt 0x%x]\n",		conn->id, tcp_mtask->xmstate, mtask->itt);	if (test_bit(XMSTATE_BIT_IMM_HDR_INIT, &tcp_mtask->xmstate)) {		iscsi_buf_init_iov(&tcp_mtask->headbuf, (char*)mtask->hdr,				   sizeof(struct iscsi_hdr));		if (mtask->data_count) {			set_bit(XMSTATE_BIT_IMM_DATA, &tcp_mtask->xmstate);			iscsi_buf_init_iov(&tcp_mtask->sendbuf,					   (char*)mtask->data,					   mtask->data_count);		}		if (conn->c_stage != ISCSI_CONN_INITIAL_STAGE &&		    conn->stop_stage != STOP_CONN_RECOVER &&		    conn->hdrdgst_en)			iscsi_hdr_digest(conn, &tcp_mtask->headbuf,					(u8*)tcp_mtask->hdrext);		tcp_mtask->sent = 0;		clear_bit(XMSTATE_BIT_IMM_HDR_INIT, &tcp_mtask->xmstate);		set_bit(XMSTATE_BIT_IMM_HDR, &tcp_mtask->xmstate);	}	if (test_bit(XMSTATE_BIT_IMM_HDR, &tcp_mtask->xmstate)) {		rc = iscsi_sendhdr(conn, &tcp_mtask->headbuf,				   mtask->data_count);		if (rc)			return rc;		clear_bit(XMSTATE_BIT_IMM_HDR, &tcp_mtask->xmstate);	}	if (test_and_clear_bit(XMSTATE_BIT_IMM_DATA, &tcp_mtask->xmstate)) {		BUG_ON(!mtask->data_count);		/* FIXME: implement.		 * Virtual buffer could be spreaded across multiple pages...		 */		do {			int rc;			rc = iscsi_sendpage(conn, &tcp_mtask->sendbuf,					&mtask->data_count, &tcp_mtask->sent);			if (rc) {				set_bit(XMSTATE_BIT_IMM_DATA, &tcp_mtask->xmstate);				return rc;			}		} while (mtask->data_count);	}	BUG_ON(tcp_mtask->xmstate != XMSTATE_VALUE_IDLE);	if (mtask->hdr->itt == RESERVED_ITT) {		struct iscsi_session *session = conn->session;		spin_lock_bh(&session->lock);		list_del(&conn->mtask->running);		__kfifo_put(session->mgmtpool.queue, (void*)&conn->mtask,			    sizeof(void*));		spin_unlock_bh(&session->lock);	}	return 0;}static intiscsi_send_cmd_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask){	struct scsi_cmnd *sc = ctask->sc;	struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;	int rc = 0;	if (test_bit(XMSTATE_BIT_CMD_HDR_INIT, &tcp_ctask->xmstate)) {		tcp_ctask->sent = 0;		tcp_ctask->sg_count = 0;		tcp_ctask->exp_datasn = 0;		if (sc->sc_data_direction == DMA_TO_DEVICE) {			struct scatterlist *sg = scsi_sglist(sc);			iscsi_buf_init_sg(&tcp_ctask->sendbuf, sg);			tcp_ctask->sg = sg + 1;			tcp_ctask->bad_sg = sg + scsi_sg_count(sc);			debug_scsi("cmd [itt 0x%x total %d imm_data %d "				   "unsol count %d, unsol offset %d]\n",				   ctask->itt, scsi_bufflen(sc),				   ctask->imm_count, ctask->unsol_count,				   ctask->unsol_offset);		}		iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)ctask->hdr,				  sizeof(struct iscsi_hdr));		if (conn->hdrdgst_en)			iscsi_hdr_digest(conn, &tcp_ctask->headbuf,					 (u8*)tcp_ctask->hdrext);		clear_bit(XMSTATE_BIT_CMD_HDR_INIT, &tcp_ctask->xmstate);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品美国一| 亚洲欧洲日韩一区二区三区| 国产成人精品免费一区二区| 亚洲精选在线视频| 欧美电影免费提供在线观看| 成人爱爱电影网址| 天天综合网天天综合色| 国产精品久久久久久亚洲伦| 91精品国产一区二区三区 | 国产99久久久久久免费看农村| 亚洲黄色片在线观看| 久久久青草青青国产亚洲免观| 欧美性videosxxxxx| 成人亚洲一区二区一| 日韩电影在线一区二区| 亚洲精品中文在线| 久久精品亚洲乱码伦伦中文| 欧美电影一区二区| 日本二三区不卡| 国产91精品精华液一区二区三区 | 日韩美女在线视频| 91视频在线观看| 国产精品一线二线三线| 日韩av电影免费观看高清完整版在线观看| 亚洲色图在线视频| 亚洲国产精品v| 久久久精品一品道一区| 日韩精品一区二区三区在线观看| 欧美日韩一级视频| 欧美午夜不卡在线观看免费| av男人天堂一区| 国产91在线看| 国产精品一二三四五| 麻豆精品一区二区| 秋霞电影一区二区| 日本成人中文字幕在线视频| 午夜在线电影亚洲一区| 亚洲国产日韩精品| 亚洲成人先锋电影| 丝瓜av网站精品一区二区 | 中文av一区二区| 久久九九99视频| 久久综合色天天久久综合图片| 日韩欧美亚洲国产精品字幕久久久| 欧美日韩成人一区二区| 7777精品伊人久久久大香线蕉完整版 | 国产精品丝袜在线| 中文字幕+乱码+中文字幕一区| 国产欧美日韩在线视频| 国产日韩综合av| 中文字幕欧美激情| 国产精品国产精品国产专区不蜜| 国产精品美女久久久久aⅴ | 欧美亚州韩日在线看免费版国语版| 99在线视频精品| 欧洲一区在线观看| 欧美日韩一区二区不卡| 欧美丰满少妇xxxbbb| 欧美白人最猛性xxxxx69交| 精品美女一区二区| 欧美国产亚洲另类动漫| 亚洲欧美日韩电影| 婷婷久久综合九色国产成人| 日韩不卡手机在线v区| 久久99久国产精品黄毛片色诱| 韩国精品主播一区二区在线观看 | 亚洲资源在线观看| 亚洲成av人片| 久久99国产精品久久99 | 国产久卡久卡久卡久卡视频精品| 国产盗摄视频一区二区三区| 91在线视频播放地址| 欧美日韩aaaaa| 精品少妇一区二区三区视频免付费| 久久久另类综合| 亚洲婷婷在线视频| 视频一区二区欧美| 国产盗摄女厕一区二区三区| 91免费在线视频观看| 欧美一区日韩一区| 国产三级精品视频| 亚洲国产aⅴ天堂久久| 九九久久精品视频| 91网上在线视频| 日韩欧美亚洲国产精品字幕久久久| 国产欧美日韩在线| 婷婷久久综合九色综合绿巨人 | 成人免费观看视频| 欧美日韩二区三区| 国产精品理论片在线观看| 亚洲最新视频在线观看| 国产在线播放一区三区四| 色综合天天综合网国产成人综合天| 91精品国产aⅴ一区二区| 中文字幕国产一区二区| 日韩一区精品视频| 99re8在线精品视频免费播放| 欧美一区二区三区在线观看视频 | 亚洲九九爱视频| 国产中文字幕一区| 欧美日韩国产精选| 国产精品天干天干在观线| 免费成人美女在线观看.| av在线综合网| 日韩欧美电影在线| 亚洲一卡二卡三卡四卡五卡| 国产成人综合亚洲91猫咪| 欧美久久一二三四区| 亚洲欧洲国产日本综合| 韩国一区二区在线观看| 欧美精品123区| 亚洲人被黑人高潮完整版| 久久不见久久见中文字幕免费| 日本精品视频一区二区三区| 中文字幕av不卡| 国产精品一区二区无线| 日韩欧美国产综合| 亚洲gay无套男同| 日本道精品一区二区三区| 中文av一区二区| 国产91在线|亚洲| 久久蜜桃av一区二区天堂| 免费人成精品欧美精品 | 26uuu欧美| 欧美aⅴ一区二区三区视频| 欧美亚洲日本一区| 亚洲少妇30p| 不卡欧美aaaaa| 中文字幕二三区不卡| 国产高清不卡一区| 国产午夜精品一区二区三区视频| 理论片日本一区| 日韩欧美在线综合网| 亚洲1区2区3区4区| 欧美日韩综合色| 亚洲动漫第一页| 在线影院国内精品| 亚洲高清免费观看| 欧美日韩精品福利| 视频一区中文字幕| 91精品免费观看| 日韩av电影免费观看高清完整版 | 日日夜夜精品视频免费| 欧美日韩亚洲综合| 三级欧美韩日大片在线看| 欧美日韩不卡一区| 麻豆精品视频在线观看| 亚洲精品在线观| 国产成人精品网址| 国产精品高清亚洲| 日本福利一区二区| 婷婷激情综合网| 2020国产成人综合网| 国产成人自拍网| 日韩理论在线观看| 色婷婷av一区二区三区gif| 亚洲国产欧美在线| 在线电影欧美成精品| 精品中文av资源站在线观看| 久久日韩精品一区二区五区| 成人综合日日夜夜| 亚洲三级电影全部在线观看高清| 在线观看www91| 看国产成人h片视频| 国产欧美一区二区精品性| 色天使色偷偷av一区二区| 性做久久久久久| 久久精品夜色噜噜亚洲aⅴ| 91在线免费视频观看| 日日骚欧美日韩| 久久久综合九色合综国产精品| 91啪亚洲精品| 日本vs亚洲vs韩国一区三区 | 色婷婷av一区二区三区大白胸 | 国产精品久久夜| 欧美日韩日本视频| 国产美女一区二区三区| 亚洲欧美福利一区二区| 91精品在线免费| 成人av影院在线| 日韩国产成人精品| 国产精品天美传媒沈樵| 欧美日本在线看| www.久久精品| 免费看欧美女人艹b| 中文字幕中文字幕一区二区 | 欧美在线短视频| 国产在线视频一区二区| 一区二区久久久久久| 26uuu久久天堂性欧美| 91成人免费在线视频| 国产一区二三区好的| 一区二区三区免费看视频| 精品国产乱码久久久久久1区2区 | 99国内精品久久| 蜜桃久久久久久久| 亚洲精品日韩专区silk| 26uuu亚洲综合色欧美| 欧美视频第二页| 成人黄色片在线观看|