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

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

?? nthread.c

?? Ubuntu公司提供免費(fèi)的iSCSI Target
?? C
字號(hào):
/* * Network thread. * (C) 2004 - 2005 FUJITA Tomonori <tomof@acm.org> * This code is licenced under the GPL. */#include <linux/sched.h>#include <linux/file.h>#include <linux/kthread.h>#include <asm/ioctls.h>#include "iscsi.h"#include "iscsi_dbg.h"#include "digest.h"enum daemon_state_bit {	D_ACTIVE,	D_DATA_READY,};void nthread_wakeup(struct iscsi_target *target){	struct network_thread_info *info = &target->nthread_info;	spin_lock_bh(&info->nthread_lock);	set_bit(D_DATA_READY, &info->flags);	wake_up_process(info->task);	spin_unlock_bh(&info->nthread_lock);}static inline void iscsi_conn_init_read(struct iscsi_conn *conn, void *data, size_t len){	len = (len + 3) & -4; // XXX ???	conn->read_iov[0].iov_base = data;	conn->read_iov[0].iov_len = len;	conn->read_msg.msg_iov = conn->read_iov;	conn->read_msg.msg_iovlen = 1;	conn->read_size = (len + 3) & -4;}static void iscsi_conn_read_ahs(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd){	cmnd->pdu.ahs = kmalloc(cmnd->pdu.ahssize, __GFP_NOFAIL|GFP_KERNEL);	assert(cmnd->pdu.ahs);	iscsi_conn_init_read(conn, cmnd->pdu.ahs, cmnd->pdu.ahssize);}static struct iscsi_cmnd * iscsi_get_send_cmnd(struct iscsi_conn *conn){	struct iscsi_cmnd *cmnd = NULL;	spin_lock(&conn->list_lock);	if (!list_empty(&conn->write_list)) {		cmnd = list_entry(conn->write_list.next, struct iscsi_cmnd, list);		list_del_init(&cmnd->list);	}	spin_unlock(&conn->list_lock);	return cmnd;}static int is_data_available(struct iscsi_conn *conn){	int avail, res;	mm_segment_t oldfs;	struct socket *sock = conn->sock;	oldfs = get_fs();	set_fs(get_ds());	res = sock->ops->ioctl(sock, SIOCINQ, (unsigned long) &avail);	set_fs(oldfs);	return (res >= 0) ? avail : res;}static void forward_iov(struct msghdr *msg, int len){	while (msg->msg_iov->iov_len <= len) {		len -= msg->msg_iov->iov_len;		msg->msg_iov++;		msg->msg_iovlen--;	}	msg->msg_iov->iov_base = (char *) msg->msg_iov->iov_base + len;	msg->msg_iov->iov_len -= len;}static int do_recv(struct iscsi_conn *conn, int state){	mm_segment_t oldfs;	struct msghdr msg;	struct iovec iov[ISCSI_CONN_IOV_MAX];	int i, len, res;	if (!test_bit(CONN_ACTIVE, &conn->state)) {		res = -EIO;		goto out;	}	if (is_data_available(conn) <= 0) {		res = -EAGAIN;		goto out;	}	msg.msg_iov = iov;	msg.msg_iovlen = min_t(size_t, conn->read_msg.msg_iovlen, ISCSI_CONN_IOV_MAX);	for (i = 0, len = 0; i < msg.msg_iovlen; i++) {		iov[i] = conn->read_msg.msg_iov[i];		len += iov[i].iov_len;	}	oldfs = get_fs();	set_fs(get_ds());	res = sock_recvmsg(conn->sock, &msg, len, MSG_DONTWAIT | MSG_NOSIGNAL);	set_fs(oldfs);	if (res <= 0) {		switch (res) {		case -EAGAIN:		case -ERESTARTSYS:			break;		default:			eprintk("%d\n", res);			conn_close(conn);			break;		}	} else {		conn->read_size -= res;		if (conn->read_size)			forward_iov(&conn->read_msg, res);		else			conn->read_state = state;	}out:	dprintk(D_IOD, "%d\n", res);	return res;}enum rx_state {	RX_INIT_BHS, /* Must be zero. */	RX_BHS,	RX_INIT_AHS,	RX_AHS,	RX_INIT_HDIGEST,	RX_HDIGEST,	RX_CHECK_HDIGEST,	RX_INIT_DATA,	RX_DATA,	RX_INIT_DDIGEST,	RX_DDIGEST,	RX_CHECK_DDIGEST,	RX_END,};static void rx_ddigest(struct iscsi_conn *conn, int state){	struct iscsi_cmnd *cmnd = conn->read_cmnd;	int res = digest_rx_data(cmnd);	if (!res)		conn->read_state = state;	else		conn_close(conn);}static void rx_hdigest(struct iscsi_conn *conn, int state){	struct iscsi_cmnd *cmnd = conn->read_cmnd;	int res = digest_rx_header(cmnd);	if (!res)		conn->read_state = state;	else		conn_close(conn);}static struct iscsi_cmnd *create_cmnd(struct iscsi_conn *conn){	struct iscsi_cmnd *cmnd;	cmnd = cmnd_alloc(conn, 1);	iscsi_conn_init_read(cmnd->conn, &cmnd->pdu.bhs, sizeof(cmnd->pdu.bhs));	conn->read_state = RX_BHS;	return cmnd;}static int recv(struct iscsi_conn *conn){	struct iscsi_cmnd *cmnd = conn->read_cmnd;	int hdigest, ddigest, res = 1;	if (!test_bit(CONN_ACTIVE, &conn->state))		return -EIO;	hdigest = conn->hdigest_type & DIGEST_NONE ? 0 : 1;	ddigest = conn->ddigest_type & DIGEST_NONE ? 0 : 1;	switch (conn->read_state) {	case RX_INIT_BHS:		assert(!cmnd);		cmnd = conn->read_cmnd = create_cmnd(conn);	case RX_BHS:		res = do_recv(conn, RX_INIT_AHS);		if (res <= 0 || conn->read_state != RX_INIT_AHS)			break;	case RX_INIT_AHS:		iscsi_cmnd_get_length(&cmnd->pdu);		if (cmnd->pdu.ahssize) {			iscsi_conn_read_ahs(conn, cmnd);			conn->read_state = RX_AHS;		} else			conn->read_state = hdigest ? RX_INIT_HDIGEST : RX_INIT_DATA;		if (conn->read_state != RX_AHS)			break;	case RX_AHS:		res = do_recv(conn, hdigest ? RX_INIT_HDIGEST : RX_INIT_DATA);		if (res <= 0 || conn->read_state != RX_INIT_HDIGEST)			break;	case RX_INIT_HDIGEST:		iscsi_conn_init_read(conn, &cmnd->hdigest, sizeof(u32));		conn->read_state = RX_HDIGEST;	case RX_HDIGEST:		res = do_recv(conn, RX_CHECK_HDIGEST);		if (res <= 0 || conn->read_state != RX_CHECK_HDIGEST)			break;	case RX_CHECK_HDIGEST:		rx_hdigest(conn, RX_INIT_DATA);		if (conn->read_state != RX_INIT_DATA)			break;	case RX_INIT_DATA:		cmnd_rx_start(cmnd);		conn->read_state = cmnd->pdu.datasize ? RX_DATA : RX_END;		if (conn->read_state != RX_DATA)			break;	case RX_DATA:		res = do_recv(conn, ddigest ? RX_INIT_DDIGEST : RX_END);		if (res <= 0 || conn->read_state != RX_INIT_DDIGEST)			break;	case RX_INIT_DDIGEST:		iscsi_conn_init_read(conn, &cmnd->ddigest, sizeof(u32));		conn->read_state = RX_DDIGEST;	case RX_DDIGEST:		res = do_recv(conn, RX_CHECK_DDIGEST);		if (res <= 0 || conn->read_state != RX_CHECK_DDIGEST)			break;	case RX_CHECK_DDIGEST:		rx_ddigest(conn, RX_END);		break;	default:		eprintk("%d %d %x\n", res, conn->read_state, cmnd_opcode(cmnd));		assert(0);	}	if (res <= 0)		return res;	if (conn->read_state != RX_END)		return res;	if (conn->read_size) {		eprintk("%d %x %d\n", res, cmnd_opcode(cmnd), conn->read_size);		assert(0);	}	cmnd_rx_end(cmnd);	if (conn->read_size) {		eprintk("%x %d\n", cmnd_opcode(cmnd), conn->read_size);		conn->read_state = RX_DATA;		return 1;	}	conn->read_cmnd = NULL;	conn->read_state = RX_INIT_BHS;	return 0;}/* This is taken from the Ardis code. */static int write_data(struct iscsi_conn *conn){	mm_segment_t oldfs;	struct file *file;	struct socket *sock;	ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int);	struct tio *tio;	struct iovec *iop;	int saved_size, size, sendsize;	int offset, idx;	int flags, res;	file = conn->file;	saved_size = size = conn->write_size;	iop = conn->write_iop;	if (iop) while (1) {		loff_t off = 0;		unsigned long count;		struct iovec *vec;		int rest;		vec = iop;		for (count = 0; vec->iov_len; count++, vec++)			;		oldfs = get_fs();		set_fs(KERNEL_DS);		res = vfs_writev(file, (struct iovec __user *) iop, count, &off);		set_fs(oldfs);		dprintk(D_DATA, "%#Lx:%u: %d(%ld)\n",			(unsigned long long) conn->session->sid, conn->cid,			res, (long) iop->iov_len);		if (unlikely(res <= 0)) {			if (res == -EAGAIN || res == -EINTR) {				conn->write_iop = iop;				goto out_iov;			}			goto err;		}		rest = res;		size -= res;		while (iop->iov_len <= rest && rest) {			rest -= iop->iov_len;			iop++;		}		iop->iov_base += rest;		iop->iov_len -= rest;		if (!iop->iov_len) {			conn->write_iop = NULL;			if (size)				break;			goto out_iov;		}	}	if (!(tio = conn->write_tcmnd)) {		eprintk("%s\n", "warning data missing!");		return 0;	}	offset = conn->write_offset;	idx = offset >> PAGE_CACHE_SHIFT;	offset &= ~PAGE_CACHE_MASK;	sock = conn->sock;	sendpage = sock->ops->sendpage ? : sock_no_sendpage;	flags = MSG_DONTWAIT;	while (1) {		sendsize = PAGE_CACHE_SIZE - offset;		if (size <= sendsize) {			res = sendpage(sock, tio->pvec[idx], offset, size, flags);			dprintk(D_DATA, "%s %#Lx:%u: %d(%lu,%u,%u)\n",				sock->ops->sendpage ? "sendpage" : "writepage",				(unsigned long long ) conn->session->sid, conn->cid,				res, tio->pvec[idx]->index, offset, size);			if (unlikely(res <= 0)) {				if (res == -EAGAIN || res == -EINTR) {					goto out;				}				goto err;			}			if (res == size) {				conn->write_tcmnd = NULL;				conn->write_size = 0;				return saved_size;			}			offset += res;			size -= res;			continue;		}		res = sendpage(sock, tio->pvec[idx], offset,sendsize, flags | MSG_MORE);		dprintk(D_DATA, "%s %#Lx:%u: %d(%lu,%u,%u)\n",			sock->ops->sendpage ? "sendpage" : "writepage",			(unsigned long long ) conn->session->sid, conn->cid,			res, tio->pvec[idx]->index, offset, sendsize);		if (unlikely(res <= 0)) {			if (res == -EAGAIN || res == -EINTR) {				goto out;			}			goto err;		}		if (res == sendsize) {			idx++;			offset = 0;		} else			offset += res;		size -= res;	} out:	conn->write_offset = (idx << PAGE_CACHE_SHIFT) + offset; out_iov:	conn->write_size = size;	if ((saved_size == size) && res == -EAGAIN)		return res;	return saved_size - size; err:	eprintk("error %d at %#Lx:%u\n", res,		(unsigned long long) conn->session->sid, conn->cid);	return res;}static void exit_tx(struct iscsi_conn *conn, int res){	if (res > 0)		return;	switch (res) {	case -EAGAIN:	case -ERESTARTSYS:		break;	default:		eprintk("%d %d %d\n", conn->write_size, conn->write_state, res);		conn_close(conn);		break;	}}static int tx_ddigest(struct iscsi_cmnd *cmnd, int state){	int res, rest = cmnd->conn->write_size;	struct msghdr msg = {.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT};	struct kvec iov;	iov.iov_base = (char *) (&cmnd->ddigest) + (sizeof(u32) - rest);	iov.iov_len = rest;	res = kernel_sendmsg(cmnd->conn->sock, &msg, &iov, 1, rest);	if (res > 0) {		cmnd->conn->write_size -= res;		if (!cmnd->conn->write_size)			cmnd->conn->write_state = state;	} else		exit_tx(cmnd->conn, res);	return res;}static void init_tx_hdigest(struct iscsi_cmnd *cmnd){	struct iscsi_conn *conn = cmnd->conn;	struct iovec *iop;	if (conn->hdigest_type & DIGEST_NONE)		return;	digest_tx_header(cmnd);	for (iop = conn->write_iop; iop->iov_len; iop++)		;	iop->iov_base = &(cmnd->hdigest);	iop->iov_len = sizeof(u32);	conn->write_size += sizeof(u32);	iop++;	iop->iov_len = 0;	return;}enum tx_state {	TX_INIT, /* Must be zero. */	TX_BHS_DATA,	TX_INIT_DDIGEST,	TX_DDIGEST,	TX_END,};static int do_send(struct iscsi_conn *conn, int state){	int res;	res = write_data(conn);	if (res > 0) {		if (!conn->write_size)			conn->write_state = state;	} else		exit_tx(conn, res);	return res;}static int send(struct iscsi_conn *conn){	struct iscsi_cmnd *cmnd = conn->write_cmnd;	int ddigest, res = 0;	ddigest = conn->ddigest_type != DIGEST_NONE ? 1 : 0;	switch (conn->write_state) {	case TX_INIT:		assert(!cmnd);		cmnd = conn->write_cmnd = iscsi_get_send_cmnd(conn);		if (!cmnd)			return 0;		cmnd_tx_start(cmnd);		init_tx_hdigest(cmnd);		conn->write_state = TX_BHS_DATA;	case TX_BHS_DATA:		res = do_send(conn, ddigest && cmnd->pdu.datasize ? TX_INIT_DDIGEST : TX_END);		if (res <= 0 || conn->write_state != TX_INIT_DDIGEST)			break;	case TX_INIT_DDIGEST:		digest_tx_data(cmnd);		assert(!cmnd->conn->write_size);		cmnd->conn->write_size += sizeof(u32);		conn->write_state = TX_DDIGEST;	case TX_DDIGEST:		res = tx_ddigest(cmnd, TX_END);		break;	default:		eprintk("%d %d %x\n", res, conn->write_state, cmnd_opcode(cmnd));		assert(0);	}	if (res <= 0)		return res;	if (conn->write_state != TX_END)		return res;	if (conn->write_size) {		eprintk("%d %x %u\n", res, cmnd_opcode(cmnd), conn->write_size);		assert(!conn->write_size);	}	cmnd_tx_end(cmnd);	cmnd_release(cmnd, 0);	conn->write_cmnd = NULL;	conn->write_state = TX_INIT;	return 0;}static void process_io(struct iscsi_conn *conn){	struct iscsi_target *target = conn->session->target;	int res, wakeup = 0;	res = recv(conn);	if (is_data_available(conn) > 0 || res > 0)		wakeup = 1;	if (!test_bit(CONN_ACTIVE, &conn->state)) {		wakeup = 1;		goto out;	}	res = send(conn);	if (!list_empty(&conn->write_list) || conn->write_cmnd)		wakeup = 1;out:	if (wakeup)		nthread_wakeup(target);	return;}static void close_conn(struct iscsi_conn *conn){	struct iscsi_session *session = conn->session;	struct iscsi_cmnd *cmnd;	assert(conn);	conn->sock->ops->shutdown(conn->sock, 2);	write_lock_bh(&conn->sock->sk->sk_callback_lock);	conn->sock->sk->sk_state_change = session->target->nthread_info.old_state_change;	conn->sock->sk->sk_data_ready = session->target->nthread_info.old_data_ready;	write_unlock_bh(&conn->sock->sk->sk_callback_lock);	fput(conn->file);	conn->file = NULL;	conn->sock = NULL;	while (atomic_read(&conn->nr_busy_cmnds))		yield();	while (!list_empty(&conn->pdu_list)) {		cmnd = list_entry(conn->pdu_list.next, struct iscsi_cmnd, conn_list);		list_del_init(&cmnd->list);		cmnd_release(cmnd, 1);	}	if (atomic_read(&conn->nr_cmnds)) {		eprintk("%u\n", atomic_read(&conn->nr_cmnds));		list_for_each_entry(cmnd, &conn->pdu_list, conn_list)			eprintk("%x %x\n", cmnd_opcode(cmnd), cmnd_itt(cmnd));		assert(0);	}	event_send(session->target->tid, session->sid, conn->cid, E_CONN_CLOSE, 0);	conn_free(conn);	if (list_empty(&session->conn_list))		session_del(session->target, session->sid);}static int istd(void *arg){	struct iscsi_target *target = arg;	struct network_thread_info *info = &target->nthread_info;	struct iscsi_conn *conn, *tmp;	__set_current_state(TASK_RUNNING);	do {		spin_lock_bh(&info->nthread_lock);		__set_current_state(TASK_INTERRUPTIBLE);		if (!test_bit(D_DATA_READY, &info->flags)) {			spin_unlock_bh(&info->nthread_lock);			schedule();			spin_lock_bh(&info->nthread_lock);		}		__set_current_state(TASK_RUNNING);		clear_bit(D_DATA_READY, &info->flags);		spin_unlock_bh(&info->nthread_lock);		target_lock(target, 0);		list_for_each_entry_safe(conn, tmp, &info->active_conns, poll_list) {			if (test_bit(CONN_ACTIVE, &conn->state))				process_io(conn);			else				close_conn(conn);		}		target_unlock(target);	} while (!kthread_should_stop());	return 0;}int nthread_init(struct iscsi_target *target){	struct network_thread_info *info = &target->nthread_info;	info->flags = 0;	info->task = NULL;	info->old_state_change = NULL;	info->old_data_ready = NULL;	INIT_LIST_HEAD(&info->active_conns);	spin_lock_init(&info->nthread_lock);	return 0;}int nthread_start(struct iscsi_target *target){	int err = 0;	struct network_thread_info *info = &target->nthread_info;	struct task_struct *task;	if (info->task) {		eprintk("Target (%u) already runs\n", target->tid);		return -EALREADY;	}	task = kthread_run(istd, target, "istd%d", target->tid);	if (IS_ERR(task))		err = PTR_ERR(task);	else		info->task = task;	return err;}int nthread_stop(struct iscsi_target *target){	int err;	struct network_thread_info *info = &target->nthread_info;	if (!info->task)		return -ESRCH;	err = kthread_stop(info->task);	if (!err)		info->task = NULL;	return err;}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丁香六月久久综合狠狠色| 国产亚洲精品7777| 在线观看亚洲a| 在线区一区二视频| 欧美亚洲国产怡红院影院| 在线观看一区日韩| 欧美性一区二区| 884aa四虎影成人精品一区| 欧美日韩在线三级| 欧美精品电影在线播放| 日韩欧美国产精品一区| 精品国产亚洲一区二区三区在线观看 | 夜夜嗨av一区二区三区网页| 亚洲精品久久7777| 五月天一区二区| 麻豆国产精品一区二区三区| 久久国产精品99精品国产| 国产资源精品在线观看| 成人午夜精品在线| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美制服丝袜第一页| 欧美日韩一区中文字幕| 欧美一区二区在线视频| 日韩欧美一区二区视频| 国产欧美日韩综合| 亚洲视频一区二区在线观看| 亚洲国产精品久久艾草纯爱| 另类欧美日韩国产在线| 成人av综合一区| 欧美日韩国产美女| 欧美精品一区二区久久久| 国产精品美女久久久久久| 一区二区三区在线不卡| 免费成人在线影院| eeuss鲁片一区二区三区在线观看| 日本久久电影网| 精品国产伦理网| 亚洲天堂久久久久久久| 男女性色大片免费观看一区二区 | 成人av综合在线| 欧美精品第一页| 国产亚洲欧美在线| 亚洲一区二区三区中文字幕在线| 久久er99热精品一区二区| 成人app在线观看| 欧美一区二区视频在线观看2020 | 亚洲一区二区在线观看视频| 蜜桃精品视频在线| 91欧美激情一区二区三区成人| 欧美精品一二三区| 中文字幕av一区二区三区免费看| 亚洲成人综合在线| 国产福利电影一区二区三区| 欧美日韩一区在线观看| 国产精品私房写真福利视频| 爽好多水快深点欧美视频| 国产成人免费xxxxxxxx| 欧美日韩一区三区| 国产精品久久久久久户外露出| 日韩中文字幕1| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩免费看的电影| 中文字幕日韩精品一区| 久久国产精品无码网站| 在线免费观看一区| 中文av一区二区| 久久成人18免费观看| 欧美日韩国产一级片| 日韩一区欧美小说| 国产美女在线精品| 欧美精品777| 亚洲美女区一区| 成人国产精品免费网站| 久久人人97超碰com| 日韩精品国产欧美| 欧美性受xxxx黑人xyx性爽| 中文字幕制服丝袜成人av| 久久精品国产亚洲aⅴ| 欧美日韩另类一区| 亚洲色图制服诱惑| www.久久久久久久久| 久久欧美一区二区| 久久精品国产免费| 欧美妇女性影城| 亚洲一区二区三区四区的| 99久久伊人精品| 欧美国产一区视频在线观看| 国产一区二区主播在线| 日韩欧美你懂的| 日本亚洲电影天堂| 4hu四虎永久在线影院成人| 亚洲国产cao| 欧美午夜理伦三级在线观看| 亚洲色欲色欲www| 97久久精品人人爽人人爽蜜臀 | 精品一区二区成人精品| 91精品国产91久久综合桃花| 日韩精品免费视频人成| 欧美日韩免费电影| 天天爽夜夜爽夜夜爽精品视频| 欧美在线视频你懂得| 亚洲一区二区在线视频| 日本韩国一区二区三区视频| 亚洲综合免费观看高清完整版在线 | 黄色小说综合网站| 精品国产伦一区二区三区观看体验 | 欧美视频一区二区三区在线观看| 亚洲三级电影网站| 91小视频免费观看| 亚洲视频免费在线| 色一情一乱一乱一91av| 亚洲在线免费播放| 欧美日韩卡一卡二| 日本中文字幕一区| 日韩精品最新网址| 韩国三级在线一区| 国产欧美一区二区三区在线看蜜臀| 国产在线精品一区二区| 久久久久久久久久看片| 国产精品一区二区三区乱码| 日本一区二区三区高清不卡| 99久久综合国产精品| 亚洲丝袜精品丝袜在线| 欧洲亚洲精品在线| 日本成人在线电影网| 26uuu国产在线精品一区二区| 久久超级碰视频| 国产精品久久午夜| 色丁香久综合在线久综合在线观看| 午夜精品福利视频网站| 精品久久五月天| 成人黄色网址在线观看| 亚洲人精品午夜| 欧美男男青年gay1069videost| 久久精品国产一区二区| 国产精品久久久久久妇女6080| 在线观看亚洲成人| 久久99精品国产麻豆婷婷洗澡| 欧美国产精品一区二区三区| 欧美中文字幕一二三区视频| 久久99热狠狠色一区二区| 国产精品美女久久久久久2018| 欧美影视一区二区三区| 国模套图日韩精品一区二区| 亚洲欧美一区二区视频| 884aa四虎影成人精品一区| 粉嫩欧美一区二区三区高清影视| 一区二区三区在线免费视频| www国产成人免费观看视频 深夜成人网 | 国产精品99久久久久| 亚洲靠逼com| 日韩免费电影一区| 色一情一伦一子一伦一区| 久久精品国产99久久6| 日韩理论片在线| 精品国产污网站| 欧日韩精品视频| 成人综合婷婷国产精品久久蜜臀| 亚洲h精品动漫在线观看| 国产日韩在线不卡| 7777精品伊人久久久大香线蕉 | 日本成人在线不卡视频| 中文字幕中文字幕一区二区| 日韩美女天天操| 色综合久久天天| 国产一区 二区| 视频一区视频二区在线观看| 国产精品视频一二| 精品国产成人在线影院| 欧美日韩在线免费视频| 99精品久久只有精品| 激情图区综合网| 亚洲成人动漫精品| 亚洲免费观看高清| 国产欧美精品一区二区色综合 | 亚洲欧美中日韩| 久久久久久久综合日本| 91精品国产色综合久久不卡蜜臀 | 欧美亚洲一区二区三区四区| 国产98色在线|日韩| 青青草国产成人av片免费| 亚洲精品成人天堂一二三| 国产欧美中文在线| www国产精品av| 日韩欧美中文一区| 欧美日韩精品一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃| 成人av动漫网站| 国产成人精品亚洲日本在线桃色| 免费在线观看日韩欧美| 天使萌一区二区三区免费观看| 亚洲精品久久7777| 亚洲欧美日韩在线| 中文字幕一区二区三区视频| 久久精品无码一区二区三区| 欧美成人r级一区二区三区| 91精品国产综合久久精品app| 在线观看视频91| 91极品视觉盛宴| 91久久一区二区|