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

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

?? hpfs_fs.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 *  linux/fs/hpfs/hpfs_fs.c
 *  read-only HPFS
 *  version 1.0
 *
 *  Chris Smith 1993
 *
 *  Sources & references:
 *   Duncan, _Design ... of HPFS_, MSJ 4(5)   (C) 1989 Microsoft Corp
 *   linux/fs/minix  Copyright (C) 1991, 1992, 1993  Linus Torvalds
 *   linux/fs/msdos  Written 1992, 1993 by Werner Almesberger
 *   linux/fs/isofs  Copyright (C) 1991  Eric Youngdale
 */

#include <linux/fs.h>
#include <linux/hpfs_fs.h>
#include <linux/errno.h>
#include <linux/malloc.h>
#include <linux/sched.h>
#include <linux/locks.h>
#include <linux/stat.h>
#include <linux/string.h>
#include <asm/bitops.h>
#include <asm/segment.h>

#include "hpfs.h"

/* 
 * HPFS is a mixture of 512-byte blocks and 2048-byte blocks.  The 2k blocks
 * are used for directories and bitmaps.  For bmap to work, we must run the
 * file system with 512-byte blocks.  The 2k blocks are assembled in buffers
 * obtained from kmalloc.
 *
 * For a file's i-number we use the sector number of its fnode, coded.
 * (Directory ino's are even, file ino's are odd, and ino >> 1 is the
 * sector address of the fnode.  This is a hack to allow lookup() to
 * tell read_inode() whether it is necessary to read the fnode.)
 *
 * The map_xxx routines all read something into a buffer and return a
 * pointer somewhere in the buffer.  The caller must do the brelse.
 * The other routines are balanced.
 *
 * For details on the data structures see hpfs.h and the Duncan paper.
 *
 * Overview
 *
 * [ The names of these data structures, except fnode, are not Microsoft's
 * or IBM's.  I don't know what names they use.  The semantics described
 * here are those of this implementation, and any coincidence between it
 * and real HPFS is to be hoped for but not guaranteed by me, and
 * certainly not guaranteed by MS or IBM.  Who know nothing about this. ]
 *
 * [ Also, the following will make little sense if you haven't read the
 * Duncan paper, which is excellent. ]
 *
 * HPFS is a tree.  There are 3 kinds of nodes.  A directory is a tree
 * of dnodes, and a file's allocation info is a tree of sector runs
 * stored in fnodes and anodes.
 *
 * The top pointer is in the super block, it points to the fnode of the
 * root directory.
 *
 * The root directory -- all directories -- gives file names, dates &c,
 * and fnode addresses.  If the directory fits in one dnode, that's it,
 * otherwise the top dnode points to other dnodes, forming a tree.  A
 * dnode tree (one directory) might look like
 *
 *     ((a b c) d (e f g) h (i j) k l (m n o p))
 *
 * The subtrees appear between the files.  Each dir entry contains, along
 * with the name and fnode, a dnode pointer to the subtree that precedes it
 * (if there is one; a flag tells that).  The first entry in every directory
 * is ^A^A, the "." entry for the directory itself.  The last entry in every
 * dnode is \377, a fake entry whose only valid fields are the bit marking
 * it last and the down pointer to the subtree preceding it, if any.
 *
 * The "value" field of directory entries is an fnode address.  The fnode
 * tells where the sectors of the file are.  The fnode for a subdirectory
 * contains one pointer, to the root dnode of the subdirectory.  The fnode
 * for a data file contains, in effect, a tiny anode.  (Most of the space
 * in fnodes is for extended attributes.)
 *
 * anodes and the anode part of fnodes are trees of extents.  An extent
 * is a (length, disk address) pair, labeled with the file address being
 * mapped.  E.g.,
 *
 *     (0: 3@1000  3: 1@2000  4: 2@10)
 *
 * means the file:disk sector map (0:1000 1:1001 2:1002 3:2000 4:10 5:11).
 *
 * There is space for 8 file:len@disk triples in an fnode, or for 40 in an
 * anode.  If this is insufficient, subtrees are used, as in
 *
 *  (6: (0: 3@1000  3: 1@2000  4: 2@10)  12: (6: 3@8000  9: 1@9000  10: 2@20))
 *
 * The label on a subtree is the first address *after* that tree.  The
 * subtrees are always anodes.  The label:subtree pairs require only
 * two words each, so non-leaf subtrees have a different format; there
 * is room for 12 label:subtree pairs in an fnode, or 60 in an anode.
 *
 * Within a directory, each dnode contains a pointer up to its parent
 * dnode.  The root dnode points up to the directory's fnode.
 *
 * Each fnode contains a pointer to the directory that contains it
 * (to the fnode of the directory).  So this pointer in a directory
 * fnode is "..".
 *
 * On the disk, dnodes are all together in the center of the partition,
 * and HPFS even manages to put all the dnodes for a single directory
 * together, generally.  fnodes are out with the data.  anodes are seldom
 * seen -- in fact noncontiguous files are seldom seen.  I think this is
 * partly the open() call that lets programs specify the length of an
 * output file when they know it, and partly because HPFS.IFS really is
 * very good at resisting fragmentation. 
 */

/* notation */

#define little_ushort(x) (*(unsigned short *) &(x))
typedef void nonconst;

/* super block ops */

static void hpfs_read_inode(struct inode *);
static void hpfs_put_super(struct super_block *);
static void hpfs_statfs(struct super_block *, struct statfs *);
static int hpfs_remount_fs(struct super_block *, int *, char *);

static const struct super_operations hpfs_sops =
{
	hpfs_read_inode,		/* read_inode */
	NULL,				/* notify_change */
	NULL,				/* write_inode */
	NULL,				/* put_inode */
	hpfs_put_super,			/* put_super */
	NULL,				/* write_super */
	hpfs_statfs,			/* statfs */
	hpfs_remount_fs,		/* remount_fs */
};

/* file ops */

static int hpfs_file_read(struct inode *, struct file *, char *, int);
static secno hpfs_bmap(struct inode *, unsigned);

static const struct file_operations hpfs_file_ops =
{
	NULL,				/* lseek - default */
	hpfs_file_read,			/* read */
	NULL,				/* write */
	NULL,				/* readdir - bad */
	NULL,				/* select - default */
	NULL,				/* ioctl - default */
	generic_mmap,			/* mmap */
	NULL,				/* no special open is needed */
	NULL,				/* release */
	file_fsync,			/* fsync */
};

static const struct inode_operations hpfs_file_iops =
{
	(nonconst *) & hpfs_file_ops,	/* default file operations */
	NULL,				/* create */
	NULL,				/* lookup */
	NULL,				/* link */
	NULL,				/* unlink */
	NULL,				/* symlink */
	NULL,				/* mkdir */
	NULL,				/* rmdir */
	NULL,				/* mknod */
	NULL,				/* rename */
	NULL,				/* readlink */
	NULL,				/* follow_link */
	(int (*)(struct inode *, int))
	&hpfs_bmap,			/* bmap */
	NULL,				/* truncate */
	NULL,				/* permission */
};

/* directory ops */

static int hpfs_dir_read(struct inode *inode, struct file *filp,
			 char *buf, int count);
static int hpfs_readdir(struct inode *inode, struct file *filp,
			struct dirent *dirent, int count);
static int hpfs_lookup(struct inode *, const char *, int, struct inode **);

static const struct file_operations hpfs_dir_ops =
{
	NULL,				/* lseek - default */
	hpfs_dir_read,			/* read */
	NULL,				/* write - bad */
	hpfs_readdir,			/* readdir */
	NULL,				/* select - default */
	NULL,				/* ioctl - default */
	NULL,				/* mmap */
	NULL,				/* no special open code */
	NULL,				/* no special release code */
	file_fsync,			/* fsync */
};

static const struct inode_operations hpfs_dir_iops =
{
	(nonconst *) & hpfs_dir_ops,	/* default directory file ops */
	NULL,				/* create */
	hpfs_lookup,			/* lookup */
	NULL,				/* link */
	NULL,				/* unlink */
	NULL,				/* symlink */
	NULL,				/* mkdir */
	NULL,				/* rmdir */
	NULL,				/* mknod */
	NULL,				/* rename */
	NULL,				/* readlink */
	NULL,				/* follow_link */
	NULL,				/* bmap */
	NULL,				/* truncate */
	NULL,				/* permission */
};

/* Four 512-byte buffers and the 2k block obtained by concatenating them */

struct quad_buffer_head {
	struct buffer_head *bh[4];
	void *data;
};

/* forwards */

static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask,
		      int *lowercase, int *conv);
static int check_warn(int not_ok,
		      const char *p1, const char *p2, const char *p3);
static int zerop(void *addr, unsigned len);
static void count_dnodes(struct inode *inode, dnode_secno dno,
			 unsigned *n_dnodes, unsigned *n_subdirs);
static unsigned count_bitmap(struct super_block *s);
static unsigned count_one_bitmap(dev_t dev, secno secno);
static secno bplus_lookup(struct inode *inode, struct bplus_header *b,
			  secno file_secno, struct buffer_head **bhp);
static struct hpfs_dirent *map_dirent(struct inode *inode, dnode_secno dno,
				    const unsigned char *name, unsigned len,
				      struct quad_buffer_head *qbh);
static struct hpfs_dirent *map_pos_dirent(struct inode *inode, off_t *posp,
					  struct quad_buffer_head *qbh);
static void write_one_dirent(struct dirent *dirent, const unsigned char *name,
			     unsigned namelen, ino_t ino, int lowercase);
static dnode_secno dir_subdno(struct inode *inode, unsigned pos);
static struct hpfs_dirent *map_nth_dirent(dev_t dev, dnode_secno dno,
					  int n,
					  struct quad_buffer_head *qbh);
static unsigned choose_conv(unsigned char *p, unsigned len);
static unsigned convcpy_tofs(unsigned char *out, unsigned char *in,
			     unsigned len);
static dnode_secno fnode_dno(dev_t dev, ino_t ino);
static struct fnode *map_fnode(dev_t dev, ino_t ino,
			       struct buffer_head **bhp);
static struct anode *map_anode(dev_t dev, unsigned secno,
			       struct buffer_head **bhp);
static struct dnode *map_dnode(dev_t dev, unsigned secno,
			       struct quad_buffer_head *qbh);
static void *map_sector(dev_t dev, unsigned secno, struct buffer_head **bhp);
static void *map_4sectors(dev_t dev, unsigned secno,
			  struct quad_buffer_head *qbh);
static void brelse4(struct quad_buffer_head *qbh);

/*
 * make inode number for a file
 */

static inline ino_t file_ino(fnode_secno secno)
{
	return secno << 1 | 1;
}

/*
 * make inode number for a directory
 */

static inline ino_t dir_ino(fnode_secno secno)
{
	return secno << 1;
}

/*
 * get fnode address from an inode number
 */

static inline fnode_secno ino_secno(ino_t ino)
{
	return ino >> 1;
}

/*
 * test for directory's inode number 
 */

static inline int ino_is_dir(ino_t ino)
{
	return (ino & 1) == 0;
}

/*
 * conv= options
 */

#define CONV_BINARY 0			/* no conversion */
#define CONV_TEXT 1			/* crlf->newline */
#define CONV_AUTO 2			/* decide based on file contents */

/*
 * local time (HPFS) to GMT (Unix)
 */

static inline time_t local_to_gmt(time_t t)
{
	extern struct timezone sys_tz;
	return t + sys_tz.tz_minuteswest * 60;
}

/* super block ops */

/*
 * mount.  This gets one thing, the root directory inode.  It does a
 * bunch of guessed-at consistency checks.
 */

struct super_block *hpfs_read_super(struct super_block *s,
				    void *options, int silent)
{
	struct hpfs_boot_block *bootblock;
	struct hpfs_super_block *superblock;
	struct hpfs_spare_block *spareblock;
	struct hpfs_dirent *de;
	struct buffer_head *bh0, *bh1, *bh2;
	struct quad_buffer_head qbh;
	dnode_secno root_dno;
	dev_t dev;
	uid_t uid;
	gid_t gid;
	umode_t umask;
	int lowercase;
	int conv;
	int dubious;

	/*
	 * Get the mount options
	 */

	if (!parse_opts(options, &uid, &gid, &umask, &lowercase, &conv)) {
		printk("HPFS: syntax error in mount options.  Not mounted.\n");
		s->s_dev = 0;
		return 0;
	}

	/*
	 * Fill in the super block struct
	 */

	lock_super(s);
	dev = s->s_dev;
	set_blocksize(dev, 512);

	/*
	 * fetch sectors 0, 16, 17
	 */

	bootblock = map_sector(dev, 0, &bh0);
	if (!bootblock)
		goto bail;

	superblock = map_sector(dev, 16, &bh1);
	if (!superblock)
		goto bail0;

	spareblock = map_sector(dev, 17, &bh2);
	if (!spareblock)
		goto bail1;

	/*
	 * Check that this fs looks enough like a known one that we can find
	 * and read the root directory.
	 */

	if (bootblock->magic != 0xaa55
	    || superblock->magic != SB_MAGIC
	    || spareblock->magic != SP_MAGIC
	    || bootblock->sig_28h != 0x28
	    || memcmp(&bootblock->sig_hpfs, "HPFS    ", 8)
	    || little_ushort(bootblock->bytes_per_sector) != 512) {
		printk("HPFS: hpfs_read_super: Not HPFS\n");
		goto bail2;
	}

	/*
	 * Check for inconsistencies -- possibly wrong guesses here, possibly
	 * filesystem problems.
	 */

	dubious = 0;

	dubious |= check_warn(spareblock->dirty != 0,
		       "`Improperly stopped'", "flag is set", "run CHKDSK");
	dubious |= check_warn(spareblock->n_spares_used != 0,
			      "Spare blocks", "may be in use", "run CHKDSK");

	/*
	 * Above errors mean we could get wrong answers if we proceed,
	 * so don't
	 */

	if (dubious)
		goto bail2;

	dubious |= check_warn((spareblock->n_dnode_spares !=
			       spareblock->n_dnode_spares_free),
			      "Spare dnodes", "may be in use", "run CHKDSK");
	dubious |= check_warn(superblock->zero1 != 0,
			      "#1", "unknown word nonzero", "investigate");
	dubious |= check_warn(superblock->zero3 != 0,
			      "#3", "unknown word nonzero", "investigate");
	dubious |= check_warn(superblock->zero4 != 0,
			      "#4", "unknown word nonzero", "investigate");
	dubious |= check_warn(!zerop(superblock->zero5,
				     sizeof superblock->zero5),
			      "#5", "unknown word nonzero", "investigate");
	dubious |= check_warn(!zerop(superblock->zero6,
				     sizeof superblock->zero6),
			      "#6", "unknown word nonzero", "investigate");

	if (dubious)
		printk("HPFS: Proceeding, but operation may be unreliable\n");

	/*
	 * set fs read only
	 */

	s->s_flags |= MS_RDONLY;

	/*
	 * fill in standard stuff
	 */

	s->s_magic = HPFS_SUPER_MAGIC;
	s->s_blocksize = 512;
	s->s_blocksize_bits = 9;
	s->s_op = (struct super_operations *) &hpfs_sops;

	/*
	 * fill in hpfs stuff
	 */

	s->s_hpfs_root = dir_ino(superblock->root);
	s->s_hpfs_fs_size = superblock->n_sectors;
	s->s_hpfs_dirband_size = superblock->n_dir_band / 4;
	s->s_hpfs_dmap = superblock->dir_band_bitmap;
	s->s_hpfs_bitmaps = superblock->bitmaps;
	s->s_hpfs_uid = uid;
	s->s_hpfs_gid = gid;
	s->s_hpfs_mode = 0777 & ~umask;
	s->s_hpfs_n_free = -1;
	s->s_hpfs_n_free_dnodes = -1;
	s->s_hpfs_lowercase = lowercase;
	s->s_hpfs_conv = conv;

	/*
	 * done with the low blocks
	 */

	brelse(bh2);
	brelse(bh1);
	brelse(bh0);

	/*
	 * all set.  try it out.
	 */

	s->s_mounted = iget(s, s->s_hpfs_root);
	unlock_super(s);

	if (!s->s_mounted) {
		printk("HPFS: hpfs_read_super: inode get failed\n");
		s->s_dev = 0;
		return 0;
	}

	/*
	 * find the root directory's . pointer & finish filling in the inode
	 */

	root_dno = fnode_dno(dev, s->s_hpfs_root);
	if (root_dno)
		de = map_dirent(s->s_mounted, root_dno, "\001\001", 2, &qbh);
	if (!root_dno || !de) {
		printk("HPFS: "
		       "hpfs_read_super: root dir isn't in the root dir\n");
		s->s_dev = 0;
		return 0;
	}

	s->s_mounted->i_atime = local_to_gmt(de->read_date);
	s->s_mounted->i_mtime = local_to_gmt(de->write_date);
	s->s_mounted->i_ctime = local_to_gmt(de->creation_date);

	brelse4(&qbh);
	return s;

 bail2:
	brelse(bh2);
 bail1:
	brelse(bh1);
 bail0:
	brelse(bh0);
 bail:
	s->s_dev = 0;
	unlock_super(s);
	return 0;
}

static int check_warn(int not_ok,
		      const char *p1, const char *p2, const char *p3)
{
	if (not_ok)
		printk("HPFS: %s %s. Please %s\n", p1, p2, p3);
	return not_ok;
}

static int zerop(void *addr, unsigned len)
{
	unsigned char *p = addr;
	return p[0] == 0 && memcmp(p, p + 1, len - 1) == 0;
}

/*
 * A tiny parser for option strings, stolen from dosfs.
 */

static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask,
		      int *lowercase, int *conv)
{
	char *p, *rhs;

	*uid = current->uid;
	*gid = current->gid;
	*umask = current->umask;
	*lowercase = 1;
	*conv = CONV_BINARY;

	if (!opts)
		return 1;

	for (p = strtok(opts, ","); p != 0; p = strtok(0, ",")) {
		if ((rhs = strchr(p, '=')) != 0)
			*rhs++ = '\0';
		if (!strcmp(p, "uid")) {
			if (!rhs || !*rhs)
				return 0;
			*uid = simple_strtoul(rhs, &rhs, 0);
			if (*rhs)
				return 0;
		}
		else if (!strcmp(p, "gid")) {
			if (!rhs || !*rhs)
				return 0;
			*gid = simple_strtoul(rhs, &rhs, 0);
			if (*rhs)
				return 0;
		}
		else if (!strcmp(p, "umask")) {
			if (!rhs || !*rhs)
				return 0;
			*umask = simple_strtoul(rhs, &rhs, 8);
			if (*rhs)
				return 0;
		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本高清成人免费播放| 国产精品一区二区久激情瑜伽| 美女脱光内衣内裤视频久久网站| 91激情五月电影| 夜夜精品视频一区二区| 亚洲一区二三区| 亚洲美女视频在线| 一区二区欧美国产| 亚洲一区二区三区四区五区黄 | 国产精品一区在线观看你懂的| 六月丁香婷婷久久| 亚洲制服丝袜在线| 亚洲日本成人在线观看| 欧美国产禁国产网站cc| 久久久av毛片精品| 久久久久久久电影| 日韩你懂的电影在线观看| 色系网站成人免费| 色婷婷综合久久久| 在线视频你懂得一区二区三区| 91亚洲精品乱码久久久久久蜜桃 | 午夜在线成人av| 国产精品嫩草99a| 国产精品的网站| 99精品视频中文字幕| 99久久精品免费| 欧美视频一区二| 日韩美女视频19| www.日韩大片| 亚洲欧美乱综合| 日韩一区二区影院| 一区二区三区精密机械公司| 色婷婷激情久久| 福利一区二区在线| 在线观看国产一区二区| 欧美国产丝袜视频| 欧美精品日韩一本| 亚洲激情五月婷婷| 不卡的电影网站| 久久久久久**毛片大全| 日本v片在线高清不卡在线观看| 欧美一二三四区在线| 国产成人精品亚洲午夜麻豆| 亚洲欧美经典视频| 久久看人人爽人人| 91国产免费观看| 国产馆精品极品| 亚洲精品中文在线观看| 久久久久97国产精华液好用吗| 99久久久精品免费观看国产蜜| 国产精品一区二区在线播放| 久久成人精品无人区| 一本一道久久a久久精品综合蜜臀| 精品三级在线观看| 久久久精品影视| 精品国产乱码久久久久久浪潮| 中文字幕亚洲一区二区av在线 | 亚洲丝袜自拍清纯另类| 欧美在线观看视频在线| 亚洲欧美国产高清| 51精品秘密在线观看| aaa国产一区| 国产成人免费xxxxxxxx| 日韩激情一二三区| 玉足女爽爽91| 欧美一级欧美三级在线观看| 日韩午夜av电影| 欧美视频精品在线观看| 综合亚洲深深色噜噜狠狠网站| 在线不卡中文字幕| 欧美三级日本三级少妇99| 国产·精品毛片| 日韩理论在线观看| 欧美色电影在线| 91香蕉视频mp4| 亚洲在线观看免费| 欧美美女黄视频| 欧美精品久久99久久在免费线| 久久久久久一级片| 精品一区二区日韩| 亚洲美女免费视频| 亚洲欧洲日韩女同| 久久精品综合网| 国产视频911| 精品日韩99亚洲| 在线不卡a资源高清| 日本高清视频一区二区| 不卡欧美aaaaa| 91视视频在线观看入口直接观看www| 国产一区二区三区四区五区入口 | 精品第一国产综合精品aⅴ| 欧美日韩一级视频| 91免费国产视频网站| 国产一区在线不卡| 国产乱对白刺激视频不卡| 欧美色爱综合网| 欧美天天综合网| 日本高清不卡一区| 丁香六月久久综合狠狠色| 青青草国产成人99久久| 石原莉奈在线亚洲二区| 欧美a一区二区| 蜜臀av一级做a爰片久久| 久久精品噜噜噜成人88aⅴ| 免费在线观看精品| 亚洲综合在线免费观看| 偷偷要91色婷婷| 免费成人在线观看视频| 国产一区二区不卡老阿姨| 国产一区二区三区国产| 99国产精品国产精品毛片| 99久久精品99国产精品| 国产91精品一区二区| 在线观看一区日韩| 中文字幕一区二区三区不卡在线| youjizz久久| 色综合中文字幕国产 | 日本aⅴ免费视频一区二区三区 | 91丨porny丨户外露出| 91福利资源站| 91精品国产手机| 国产日韩精品一区二区浪潮av| 国产精品第13页| 一区二区三区四区精品在线视频| 日韩精品免费专区| 韩国毛片一区二区三区| www.欧美精品一二区| 日本韩国一区二区三区| 久久久www成人免费无遮挡大片| 中文字幕一区二区三区在线播放| 亚洲高清视频在线| 国产在线日韩欧美| 欧美一区二区三区四区在线观看| 国产午夜精品久久| 中文字幕一区在线观看| 日韩不卡在线观看日韩不卡视频| 精品亚洲免费视频| 欧美体内she精视频| 精品对白一区国产伦| 亚洲第一激情av| 国产盗摄一区二区| 欧美一级在线观看| 亚洲免费视频成人| 国内一区二区视频| 91麻豆精品国产91久久久资源速度| 国产人久久人人人人爽| 日本vs亚洲vs韩国一区三区| 国产91丝袜在线观看| 久久综合中文字幕| 亚洲一区二区在线免费观看视频| 福利91精品一区二区三区| 欧美日韩免费一区二区三区视频| 国产欧美视频一区二区| 午夜影院在线观看欧美| 成人丝袜18视频在线观看| 久久色视频免费观看| 午夜精品一区在线观看| 色哟哟亚洲精品| 国产日本一区二区| 国内精品写真在线观看| 欧美剧情片在线观看| 一级女性全黄久久生活片免费| 国产精品456露脸| 在线亚洲一区观看| 国产精品不卡在线| 成人午夜视频免费看| 欧美精品一区男女天堂| 久久精品99久久久| 欧美精品日韩一本| 欧美高清性hdvideosex| 亚洲乱码日产精品bd| 蜜臀va亚洲va欧美va天堂 | av不卡免费电影| 国产亚洲一二三区| 国产一区激情在线| 日韩你懂的在线观看| 亚洲一线二线三线视频| 99精品视频在线观看| 国产精品视频你懂的| 国产风韵犹存在线视精品| 精品久久99ma| 成人av在线资源网站| 蜜桃av噜噜一区| 精品国产人成亚洲区| 国产一区免费电影| 久久久天堂av| 成人久久视频在线观看| 国产欧美日韩在线视频| 成人黄色综合网站| 国产精品视频一二| 在线亚洲精品福利网址导航| 亚洲人xxxx| 欧美妇女性影城| 蜜桃91丨九色丨蝌蚪91桃色| 精品国产成人在线影院| 国产精品综合一区二区三区| 中文欧美字幕免费| 91理论电影在线观看| 午夜成人免费电影| 日韩欧美中文字幕精品|