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

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

?? block-vhd.c

?? xen source 推出最新的VHD操作工具VHD-UTIL 實現源碼,超強
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* 
 * Copyright (c) 2008, XenSource Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of XenSource Inc. nor the names of its contributors
 *       may be used to endorse or promote products derived from this software
 *       without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * A note on write transactions:
 * Writes that require updating the BAT or bitmaps cannot be signaled
 * as complete until all updates have reached disk.  Transactions are
 * used to ensure proper ordering in these cases.  The two types of
 * transactions are as follows:
 *   - Bitmap updates only: data writes that require updates to the same
 *     bitmap are grouped in a transaction.  Only after all data writes
 *     in a transaction complete does the bitmap write commence.  Only
 *     after the bitmap write finishes are the data writes signalled as
 *     complete.
 *   - BAT and bitmap updates: data writes are grouped in transactions
 *     as above, but a special extra write is included in the transaction,
 *     which zeros out the newly allocated bitmap on disk.  When the data
 *     writes and the zero-bitmap write complete, the BAT and bitmap writes
 *     are started in parallel.  The transaction is completed only after both
 *     the BAT and bitmap writes successfully return.
 */

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <uuid/uuid.h> /* For whatever reason, Linux packages this in */
                       /* e2fsprogs-devel.                            */
#include <string.h>    /* for memset.                                 */
#include <libaio.h>
#include <sys/mman.h>

#include "libvhd.h"
#include "tapdisk.h"
#include "tapdisk-driver.h"
#include "tapdisk-interface.h"

unsigned int SPB;

#define DEBUGGING   2
#define ASSERTING   1
#define MICROSOFT_COMPAT

#define VHD_BATMAP_MAX_RETRIES 10

#define __TRACE(s)							\
	do {								\
		DBG(TLOG_DBG, "%s: QUEUED: %" PRIu64 ", COMPLETED: %"	\
		    PRIu64", RETURNED: %" PRIu64 ", DATA_ALLOCATED: "	\
		    "%lu, BBLK: 0x%04x\n",				\
		    s->vhd.file, s->queued, s->completed, s->returned,	\
		    VHD_REQS_DATA - s->vreq_free_count,			\
		    s->bat.pbw_blk);					\
	} while(0)

#define __ASSERT(_p)							\
	if (!(_p)) {							\
		DPRINTF("%s:%d: FAILED ASSERTION: '%s'\n",		\
			__FILE__, __LINE__, #_p);			\
		DBG(TLOG_WARN, "%s:%d: FAILED ASSERTION: '%s'\n",	\
		    __FILE__, __LINE__, #_p);				\
		tlog_flush();						\
		*(int*)0 = 0;						\
	}

#if (DEBUGGING == 1)
  #define DBG(level, _f, _a...)      DPRINTF(_f, ##_a)
  #define ERR(err, _f, _a...)        DPRINTF("ERROR: %d: " _f, err, ##_a)
  #define TRACE(s)                   ((void)0)
#elif (DEBUGGING == 2)
  #define DBG(level, _f, _a...)      tlog_write(level, _f, ##_a)
  #define ERR(err, _f, _a...)	     tlog_error(err, _f, ##_a)
  #define TRACE(s)                   __TRACE(s)
#else
  #define DBG(level, _f, _a...)      ((void)0)
  #define ERR(err, _f, _a...)        ((void)0)
  #define TRACE(s)                   ((void)0)
#endif

#if (ASSERTING == 1)
  #define ASSERT(_p)                 __ASSERT(_p)
#else
  #define ASSERT(_p)                 ((void)0)
#endif

/******VHD DEFINES******/
#define VHD_CACHE_SIZE               32

#define VHD_REQS_DATA                TAPDISK_DATA_REQUESTS
#define VHD_REQS_META                (VHD_CACHE_SIZE + 2)
#define VHD_REQS_TOTAL               (VHD_REQS_DATA + VHD_REQS_META)

#define VHD_OP_BAT_WRITE             0
#define VHD_OP_DATA_READ             1
#define VHD_OP_DATA_WRITE            2
#define VHD_OP_BITMAP_READ           3
#define VHD_OP_BITMAP_WRITE          4
#define VHD_OP_ZERO_BM_WRITE         5

#define VHD_BM_BAT_LOCKED            0
#define VHD_BM_BAT_CLEAR             1
#define VHD_BM_BIT_CLEAR             2
#define VHD_BM_BIT_SET               3
#define VHD_BM_NOT_CACHED            4
#define VHD_BM_READ_PENDING          5

#define VHD_FLAG_OPEN_RDONLY         1
#define VHD_FLAG_OPEN_NO_CACHE       2
#define VHD_FLAG_OPEN_QUIET          4
#define VHD_FLAG_OPEN_STRICT         8
#define VHD_FLAG_OPEN_QUERY          16
#define VHD_FLAG_OPEN_PREALLOCATE    32

#define VHD_FLAG_BAT_LOCKED          1
#define VHD_FLAG_BAT_WRITE_STARTED   2

#define VHD_FLAG_BM_UPDATE_BAT       1
#define VHD_FLAG_BM_WRITE_PENDING    2
#define VHD_FLAG_BM_READ_PENDING     4
#define VHD_FLAG_BM_LOCKED           8

#define VHD_FLAG_REQ_UPDATE_BAT      1
#define VHD_FLAG_REQ_UPDATE_BITMAP   2
#define VHD_FLAG_REQ_QUEUED          4
#define VHD_FLAG_REQ_FINISHED        8

#define VHD_FLAG_TX_LIVE             1
#define VHD_FLAG_TX_UPDATE_BAT       2

typedef uint8_t vhd_flag_t;

struct vhd_state;
struct vhd_request;

struct vhd_req_list {
	struct vhd_request       *head;
	struct vhd_request       *tail;
};

struct vhd_transaction {
	int                       error;
	int                       closed;
	int                       started;
	int                       finished;
	vhd_flag_t                status;
	struct vhd_req_list       requests;
};

struct vhd_request {
	int                       error;
	uint8_t                   op;
	vhd_flag_t                flags;
	td_request_t              treq;
	struct tiocb              tiocb;
	struct vhd_state         *state;
	struct vhd_request       *next;
	struct vhd_transaction   *tx;
};

struct vhd_bat_state {
	vhd_bat_t                 bat;
	vhd_batmap_t              batmap;
	vhd_flag_t                status;
	uint32_t                  pbw_blk;     /* blk num of pending write */
	uint64_t                  pbw_offset;  /* file offset of same */
	struct vhd_request        req;         /* for writing bat table */
	struct vhd_request        zero_req;    /* for initializing bitmaps */
	char                     *bat_buf;
};

struct vhd_bitmap {
	u32                       blk;
	u64                       seqno;       /* lru sequence number */
	vhd_flag_t                status;

	char                     *map;         /* map should only be modified
					        * in finish_bitmap_write */
	char                     *shadow;      /* in-memory bitmap changes are 
					        * made to shadow and copied to
					        * map only after having been
					        * flushed to disk */
	struct vhd_transaction    tx;          /* transaction data structure
						* encapsulating data, bitmap, 
						* and bat writes */
	struct vhd_req_list       queue;       /* data writes waiting for next
						* transaction */
	struct vhd_req_list       waiting;     /* pending requests that cannot
					        * be serviced until this bitmap
					        * is read from disk */
	struct vhd_request        req;
};

struct vhd_state {
	vhd_flag_t                flags;

        /* VHD stuff */
	vhd_context_t             vhd;
	u32                       spp;         /* sectors per page */
        u32                       spb;         /* sectors per block */
        u64                       next_db;     /* pointer to the next 
						* (unallocated) datablock */

	struct vhd_bat_state      bat;

	u64                       bm_lru;      /* lru sequence number */
	u32                       bm_secs;     /* size of bitmap, in sectors */
	struct vhd_bitmap        *bitmap[VHD_CACHE_SIZE];

	int                       bm_free_count;
	struct vhd_bitmap        *bitmap_free[VHD_CACHE_SIZE];
	struct vhd_bitmap         bitmap_list[VHD_CACHE_SIZE];

	int                       vreq_free_count;
	struct vhd_request       *vreq_free[VHD_REQS_DATA];
	struct vhd_request        vreq_list[VHD_REQS_DATA];

	td_driver_t              *driver;

	uint64_t                  queued;
	uint64_t                  completed;
	uint64_t                  returned;
	uint64_t                  reads;
	uint64_t                  read_size;
	uint64_t                  writes;
	uint64_t                  write_size;
};

#define test_vhd_flag(word, flag)  ((word) & (flag))
#define set_vhd_flag(word, flag)   ((word) |= (flag))
#define clear_vhd_flag(word, flag) ((word) &= ~(flag))

#define bat_entry(s, blk)          ((s)->bat.bat.bat[(blk)])

static void vhd_complete(void *, struct tiocb *, int);
static void finish_data_transaction(struct vhd_state *, struct vhd_bitmap *);

static struct vhd_state  *_vhd_master;
static unsigned long      _vhd_zsize;
static char              *_vhd_zeros;

static int
vhd_initialize(struct vhd_state *s)
{
	if (_vhd_zeros)
		return 0;

	_vhd_zsize = 2 * getpagesize();
	if (test_vhd_flag(s->flags, VHD_FLAG_OPEN_PREALLOCATE))
		_vhd_zsize += VHD_BLOCK_SIZE;

	_vhd_zeros = mmap(0, _vhd_zsize, PROT_READ,
			  MAP_SHARED | MAP_ANONYMOUS, -1, 0);
	if (_vhd_zeros == MAP_FAILED) {
		EPRINTF("vhd_initialize failed: %d\n", -errno);
		_vhd_zeros = NULL;
		_vhd_zsize = 0;
		return -errno;
	}

	_vhd_master = s;
	return 0;
}

static void
vhd_free(struct vhd_state *s)
{
	if (_vhd_master != s || !_vhd_zeros)
		return;

	munmap(_vhd_zeros, _vhd_zsize);
	_vhd_zsize  = 0;
	_vhd_zeros  = NULL;
	_vhd_master = NULL;
}

static char *
_get_vhd_zeros(const char *func, unsigned long size)
{
	if (!_vhd_zeros || _vhd_zsize < size) {
		EPRINTF("invalid zero request from %s: %lu, %lu, %p\n",
			func, size, _vhd_zsize, _vhd_zeros);
		ASSERT(0);
	}

	return _vhd_zeros;
}

#define vhd_zeros(size)	_get_vhd_zeros(__func__, size)

static inline void
set_batmap(struct vhd_state *s, uint32_t blk)
{
	if (s->bat.batmap.map) {
		vhd_batmap_set(&s->vhd, &s->bat.batmap, blk);
		DBG(TLOG_DBG, "block 0x%x completely full\n", blk);
	}
}

static inline int
test_batmap(struct vhd_state *s, uint32_t blk)
{
	if (!s->bat.batmap.map)
		return 0;
	return vhd_batmap_test(&s->vhd, &s->bat.batmap, blk);
}

static int
vhd_kill_footer(struct vhd_state *s)
{
	int err;
	off64_t end;
	char *zeros;

	if (s->vhd.footer.type == HD_TYPE_FIXED)
		return 0;

	err = posix_memalign((void **)&zeros, 512, 512);
	if (err)
		return -err;

	err = 1;
	memset(zeros, 0xc7c7c7c7, 512);

	if ((end = lseek64(s->vhd.fd, 0, SEEK_END)) == -1)
		goto fail;

	if (lseek64(s->vhd.fd, (end - 512), SEEK_SET) == -1)
		goto fail;

	if (write(s->vhd.fd, zeros, 512) != 512)
		goto fail;

	err = 0;

 fail:
	free(zeros);
	if (err)
		return (errno ? -errno : -EIO);
	return 0;
}

static inline int
find_next_free_block(struct vhd_state *s)
{
	int err;
	off64_t eom;
	uint32_t i, entry;

	err = vhd_end_of_headers(&s->vhd, &eom);
	if (err)
		return err;

	s->next_db = secs_round_up(eom);

	for (i = 0; i < s->bat.bat.entries; i++) {
		entry = bat_entry(s, i);
		if (entry != DD_BLK_UNUSED && entry >= s->next_db)
			s->next_db = entry + s->spb + s->bm_secs;
	}

	return 0;
}

static void
vhd_free_bat(struct vhd_state *s)
{
	free(s->bat.bat.bat);
	free(s->bat.batmap.map);
	free(s->bat.bat_buf);
	memset(&s->bat, 0, sizeof(struct vhd_bat));
}

static int
vhd_initialize_bat(struct vhd_state *s)
{
	int err, psize, batmap_required, i;

	memset(&s->bat, 0, sizeof(struct vhd_bat));

	psize = getpagesize();

	err = vhd_read_bat(&s->vhd, &s->bat.bat);
	if (err) {
		EPRINTF("%s: reading bat: %d\n", s->vhd.file, err);
		return err;
	}

	batmap_required = 1;
	if (test_vhd_flag(s->flags, VHD_FLAG_OPEN_RDONLY)) {
		batmap_required = 0;
	} else {
		err = find_next_free_block(s);
		if (err)
			goto fail;
	}

	if (vhd_has_batmap(&s->vhd)) {
		for (i = 0; i < VHD_BATMAP_MAX_RETRIES; i++) {
			err = vhd_read_batmap(&s->vhd, &s->bat.batmap);
			if (err) {
				EPRINTF("%s: reading batmap: %d\n",
						s->vhd.file, err);
				if (batmap_required)
					goto fail;
			} else {
				break;
			}
		}
		if (err)
			EPRINTF("%s: ignoring non-critical batmap error\n",
					s->vhd.file);
	}

	err = posix_memalign((void **)&s->bat.bat_buf,
			     VHD_SECTOR_SIZE, VHD_SECTOR_SIZE);
	if (err) {
		s->bat.bat_buf = NULL;
		goto fail;
	}

	return 0;

fail:
	vhd_free_bat(s);
	return err;
}

static void
vhd_free_bitmap_cache(struct vhd_state *s)
{
	int i;
	struct vhd_bitmap *bm;

	for (i = 0; i < VHD_CACHE_SIZE; i++) {
		bm = s->bitmap_list + i;
		free(bm->map);
		free(bm->shadow);
		s->bitmap_free[i] = NULL;
	}

	memset(s->bitmap_list, 0, sizeof(struct vhd_bitmap) * VHD_CACHE_SIZE);
}

static int
vhd_initialize_bitmap_cache(struct vhd_state *s)
{
	int i, err, map_size;
	struct vhd_bitmap *bm;

	memset(s->bitmap_list, 0, sizeof(struct vhd_bitmap) * VHD_CACHE_SIZE);

	s->bm_lru        = 0;
	map_size         = vhd_sectors_to_bytes(s->bm_secs);
	s->bm_free_count = VHD_CACHE_SIZE;

	for (i = 0; i < VHD_CACHE_SIZE; i++) {
		bm = s->bitmap_list + i;

		err = posix_memalign((void **)&bm->map, 512, map_size);
		if (err) {
			bm->map = NULL;
			goto fail;
		}

		err = posix_memalign((void **)&bm->shadow, 512, map_size);
		if (err) {
			bm->shadow = NULL;
			goto fail;
		}

		memset(bm->map, 0, map_size);
		memset(bm->shadow, 0, map_size);
		s->bitmap_free[i] = bm;
	}

	return 0;

fail:
	vhd_free_bitmap_cache(s);
	return err;
}

static int
vhd_initialize_dynamic_disk(struct vhd_state *s)
{
	int err;

	err = vhd_get_header(&s->vhd);
	if (err) {
		if (!test_vhd_flag(s->flags, VHD_FLAG_OPEN_QUIET))
			EPRINTF("Error reading VHD DD header.\n");
		return err;
	}

	if (s->vhd.header.hdr_ver != 0x00010000) {
		EPRINTF("unsupported header version! (0x%x)\n",
			s->vhd.header.hdr_ver);
		return -EINVAL;
	}

	s->spp     = getpagesize() >> VHD_SECTOR_SHIFT;
	s->spb     = s->vhd.header.block_size >> VHD_SECTOR_SHIFT;
	s->bm_secs = secs_round_up_no_zero(s->spb >> 3);

	if (test_vhd_flag(s->flags, VHD_FLAG_OPEN_NO_CACHE))
		return 0;

	err = vhd_initialize_bat(s);
	if (err)
		return err;

	err = vhd_initialize_bitmap_cache(s);
	if (err) {
		vhd_free_bat(s);
		return err;
	}

	return 0;
}

static int
vhd_check_version(struct vhd_state *s)
{
	if (strncmp(s->vhd.footer.crtr_app, "tap", 3))
		return 0;

	if (s->vhd.footer.crtr_ver > VHD_CURRENT_VERSION) {
		if (!test_vhd_flag(s->flags, VHD_FLAG_OPEN_QUIET))
			EPRINTF("WARNING: %s vhd creator version 0x%08x, "
				"but only versions up to 0x%08x are "
				"supported for IO\n", s->vhd.file,
				s->vhd.footer.crtr_ver, VHD_CURRENT_VERSION);

		return -EINVAL;
	}

	return 0;
}

static void
vhd_log_open(struct vhd_state *s)
{
	char buf[5];
	uint32_t i, allocated, full;

	if (test_vhd_flag(s->flags, VHD_FLAG_OPEN_QUIET))
		return;

	snprintf(buf, sizeof(buf), "%s", s->vhd.footer.crtr_app);
	if (!vhd_type_dynamic(&s->vhd)) {
		DPRINTF("%s version: %s 0x%08x\n",
			s->vhd.file, buf, s->vhd.footer.crtr_ver);
		return;
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美激情插| 99久久国产综合精品女不卡| 国产精品99久久久久| 91国产成人在线| 国产亚洲欧美日韩俺去了| 亚洲最新视频在线播放| 国产乱子轮精品视频| 欧美一区二区日韩| 亚洲夂夂婷婷色拍ww47| eeuss国产一区二区三区| 久久久蜜桃精品| 日本美女视频一区二区| 欧美日韩成人激情| 亚洲永久免费视频| 91在线精品秘密一区二区| 久久麻豆一区二区| 久久精品国产亚洲5555| 91精品国产黑色紧身裤美女| 亚洲美女偷拍久久| 99国产精品久| 亚洲乱码一区二区三区在线观看| 国产精品亚洲视频| 久久综合久久综合久久| 美女精品一区二区| 欧美福利视频导航| 三级久久三级久久| 欧美一区二区三区免费观看视频| 亚洲韩国一区二区三区| 精品1区2区3区| 午夜电影久久久| 欧美一区二区在线播放| 日本v片在线高清不卡在线观看| 欧美色电影在线| 亚洲高清免费在线| 欧美一区二区女人| 久久爱www久久做| 久久精品在线免费观看| 国产一区二区三区综合| 国产网站一区二区三区| 岛国一区二区三区| 亚洲色图制服诱惑| 欧美日韩一区三区四区| 日产欧产美韩系列久久99| 精品美女在线观看| 国产精品自在在线| 国产精品国产自产拍高清av王其| 91亚洲男人天堂| 亚洲午夜在线电影| 日韩精品自拍偷拍| 国产麻豆91精品| 亚洲欧美国产毛片在线| 欧美三级日韩三级| 国产一区视频网站| ...av二区三区久久精品| 欧美性受xxxx黑人xyx| 麻豆精品一区二区三区| 国产片一区二区| 色欧美片视频在线观看在线视频| 天堂久久久久va久久久久| 久久综合精品国产一区二区三区 | 久久久综合九色合综国产精品| 国产风韵犹存在线视精品| 亚洲女女做受ⅹxx高潮| 欧美一区二区免费观在线| 国产成人午夜99999| 亚洲国产精品影院| 久久精品视频在线看| 日本道免费精品一区二区三区| 日本欧美一区二区三区| 国产精品国产自产拍高清av王其| 制服丝袜中文字幕一区| 成人av在线资源| 蜜桃av噜噜一区二区三区小说| 中文字幕第一区综合| 91精品国产91久久久久久一区二区| 国产成人一级电影| 日韩电影免费一区| 日韩美女视频一区二区| 精品日韩欧美在线| 99国产一区二区三精品乱码| 乱一区二区av| 亚洲sss视频在线视频| 国产精品美女久久久久av爽李琼 | 视频一区视频二区中文| 国产精品毛片大码女人| 欧美精品一区二区久久婷婷| 欧美偷拍一区二区| 97se亚洲国产综合自在线| 激情久久五月天| 日韩经典中文字幕一区| 亚洲自拍另类综合| 亚洲蜜臀av乱码久久精品蜜桃| 国产视频在线观看一区二区三区| 在线综合+亚洲+欧美中文字幕| 色婷婷精品久久二区二区蜜臂av | 韩日精品视频一区| 日韩专区一卡二卡| 亚洲一区二区av在线| 亚洲女爱视频在线| 中文字幕欧美一| 国产精品麻豆久久久| 国产日韩欧美精品电影三级在线| 欧美大片顶级少妇| 欧美一三区三区四区免费在线看| 欧美性高清videossexo| 91国产成人在线| 欧洲一区二区三区免费视频| 91免费精品国自产拍在线不卡| 国产超碰在线一区| 国产99久久久久久免费看农村| 韩国理伦片一区二区三区在线播放| 日韩二区三区四区| 免费观看在线综合色| 久久精品国产在热久久| 麻豆精品新av中文字幕| 麻豆精品一区二区三区| 国产一区二区在线看| 国产成人一级电影| 97se亚洲国产综合自在线观| 91丨九色丨蝌蚪富婆spa| 欧美自拍偷拍一区| 欧美一区二区二区| 欧美国产激情二区三区| 国产精品丝袜91| 亚洲人成在线播放网站岛国| 一区二区三区精品在线| 婷婷夜色潮精品综合在线| 蜜桃在线一区二区三区| 国产麻豆精品久久一二三| 99精品视频在线免费观看| 色乱码一区二区三区88| 欧美午夜影院一区| 日韩一级片网址| 国产精品女同一区二区三区| 亚洲人成7777| 免费观看日韩电影| 成av人片一区二区| 欧美日韩久久久一区| 精品999在线播放| 国产精品国产三级国产aⅴ无密码| 亚洲另类色综合网站| 日韩二区三区四区| 国产不卡高清在线观看视频| 91成人免费在线视频| 日韩一级免费观看| 亚洲欧洲av另类| 免费一级片91| 色哟哟在线观看一区二区三区| 欧美一级二级在线观看| 国产精品毛片久久久久久久| 午夜精品免费在线| 国产成人精品免费看| 欧美日韩一级视频| 国产午夜精品一区二区三区嫩草| 夜夜夜精品看看| 粉嫩av一区二区三区在线播放| 欧美日韩一卡二卡| 亚洲欧洲精品一区二区精品久久久| 日韩主播视频在线| 色婷婷综合久久久中文一区二区 | 国产成人免费高清| 欧美日韩黄视频| 亚洲欧洲99久久| 国产一区激情在线| 91福利国产成人精品照片| 久久精品视频一区| 蜜臀久久99精品久久久画质超高清| av一区二区三区黑人| 精品久久久久久久一区二区蜜臀| 亚洲精品乱码久久久久久黑人 | 视频在线观看91| 91色在线porny| 中文字幕欧美三区| 97久久精品人人爽人人爽蜜臀| 日韩免费成人网| 午夜精品久久久久久久99水蜜桃| 91亚洲精品一区二区乱码| 国产欧美一区二区三区鸳鸯浴| 日本不卡的三区四区五区| 91福利国产成人精品照片| 国产精品九色蝌蚪自拍| 国产成人一区在线| 久久蜜臀中文字幕| 国产美女在线精品| 精品成人a区在线观看| 免费观看在线综合色| 这里只有精品99re| 日韩av在线播放中文字幕| 精品婷婷伊人一区三区三| 一区二区三区久久| 欧洲亚洲国产日韩| 一区二区三区四区在线免费观看| 91美女片黄在线| 亚洲欧美一区二区三区极速播放| 成人自拍视频在线| 国产精品传媒在线| 一本大道久久a久久综合婷婷| 自拍偷拍欧美激情| 色综合中文字幕国产 | 婷婷激情综合网|