精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

littlefs原理分析—文件讀寫(五)

系統(tǒng) OpenHarmony
本文介紹了littlefs中的文件讀寫機制,到這里littlefs大部分的操作就都已經(jīng)做了分析了。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

前言

上一篇文章介紹了littlefs中的目錄操作,這一篇文章則將介紹littlefs中的文件讀寫操作。

本文會根據(jù)文件的存儲類型進(jìn)行介紹,即inline文件和outline文件,其讀寫過程也有差別。另外還會介紹inline文件到outline文件的轉(zhuǎn)換,以及l(fā)ittlefs底層的讀寫API。

1、inline文件讀寫

因為inline文件數(shù)據(jù)存儲于其父目錄的元數(shù)據(jù)中,inline文件的讀寫實際上通過commit機制實現(xiàn)。讀是通過遍歷tag,寫則是通過commit一個INLINESTRUCT類型的tag。

對于inline文件的數(shù)據(jù)讀取,實際上就是從其父目錄的元數(shù)據(jù)中進(jìn)行讀取,其過程已在commit機制中描述。

對于inline文件的寫入,即commit一個INLINESTRUCT類型的tag,大致過程如下:

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

2、inline文件轉(zhuǎn)outline文件

當(dāng)文件大小超過1/8 block_size、或超過文件cache大小時,inline文件會轉(zhuǎn)為outline文件,該轉(zhuǎn)換過程在文件寫入過程中觸發(fā)。inline文件轉(zhuǎn)為outline文件之后就不會再轉(zhuǎn)回inline文件,即使對文件進(jìn)行truncate操作。

轉(zhuǎn)換過程步驟如下:

  1. 為文件重分配塊,將inline數(shù)據(jù)寫入塊中。
  2. commit一個新的CTZSTRUCT類型的tag。

commit過程如下圖:

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

其中,CTZSTRUCT類型的tag中包含了新分配的文件跳表頭節(jié)點的塊指針。當(dāng)讀取文件,遍歷tag時,檢測到CTZSTRUCT,就會從其中文件跳表頭節(jié)點的塊指針讀取文件數(shù)據(jù)。具體跳表中讀寫文件的過程在下小節(jié)中說明。

3、outline文件讀寫

回顧outline文件的存儲結(jié)構(gòu),其數(shù)據(jù)是用一個跳表進(jìn)行存儲的:

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

outline文件的讀寫通過跳表的機制完成,commit時只需要commit帶有更新后的跳表頭的CTZSTRUCT tag。下面進(jìn)行具體說明。

(1)outline文件讀操作

讀取數(shù)據(jù)的步驟如下:

  1. 調(diào)用lfs_ctz_find找到目標(biāo)數(shù)據(jù)所在的塊。
  2. 調(diào)用lfs_bd_read進(jìn)行讀取,該函數(shù)在后文進(jìn)行分析。

其中,lfs_ctz_find函數(shù)從頭節(jié)點開始,通過塊頭處儲存的跳表節(jié)點塊指針進(jìn)行遍歷、尋找目標(biāo)塊位置。

跳表中塊指針按固定規(guī)律分布:對block n,如果n可以被2^x整除,那么該block就含有一個指向block n-2^x的塊指針。以block 4為例:

  • 4可以被2^0整除,則block 4含有4-2^0即block 3的塊指針。
  • 4可以被2^1整除,則block 4含有4-2^1即block 2的塊指針。
  • 4可以被2^2整除,則block 4含有4-2^2即block 0的塊指針。

由此規(guī)律,又因為塊的大小是固定的,那么只要知道文件的偏移位置,就可以獲取該偏移位置所在block在跳表中的序號、該塊上有幾個塊指針等信息。lfs_ctz_find函數(shù)就是根據(jù)此規(guī)律進(jìn)行查找:

  • 獲取跳表中塊序號:根據(jù)文件偏移和塊大小計算,相關(guān)函數(shù)為lfs_ctz_index
  • 獲取塊頭部塊指針數(shù)量:用ctz指令,ctz(塊序號)

(2)outline文件寫操作

outline文件寫入數(shù)據(jù)時又分為兩種情況,其寫入步驟也不同:

  • 如果寫入數(shù)據(jù)后不超過當(dāng)前塊,則調(diào)用lfs_bd_prog進(jìn)行寫入。該步驟相對簡單。
  • 如果寫入數(shù)據(jù)后超過當(dāng)前塊:
  1. 調(diào)用lfs_ctz_find找到寫入位置所在的塊。
  2. 調(diào)用lfs_ctz_extend在寫入位置插入新的頭節(jié)點。
  3. 最后當(dāng)調(diào)用lfs_file_sync或lfs_file_close時進(jìn)行commit,實際將更新后的CTZSTRUCT tag寫入元數(shù)據(jù)。

當(dāng)數(shù)據(jù)寫入后超過當(dāng)前塊時,會涉及到跳表的更新,下面著重對這種情況進(jìn)行說明。

lfs_ctz_extend

lfs_ctz_extend函數(shù)的作用是在文件寫入的位置插入新的頭節(jié)點。其步驟如下:

  1. 分配一個新塊作為新的頭節(jié)點,并調(diào)用lfs_bd_prog將原頭節(jié)點塊中的數(shù)據(jù)復(fù)制到新塊中。下圖中,調(diào)用lfs_bd_prog傳入的pcache參數(shù)為file->cache,lfs_bd_prog會先將數(shù)據(jù)寫入到file->cache中,等到需要進(jìn)行flush操作時才將數(shù)據(jù)實際寫回block。

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

  1. 將新的頭節(jié)點與左邊的后繼結(jié)點鏈接,右邊的舊的前繼節(jié)點被舍棄(但塊中內(nèi)容不會被立即擦除):

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

注:如果文件寫入位置位于文件末尾,則圖示中ctz block即為舊頭節(jié)點。調(diào)用lfs_file_seek函數(shù)可改變文件寫入位置。

commit后會寫入新的CTZSTRUCT tag,其過程如下:

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

COW策略

outline文件寫入數(shù)據(jù)時是COW(copy-on-write)策略,lfs_ctz_extend函數(shù)插入新的頭節(jié)點時并不會將舊頭節(jié)點與后繼節(jié)點的鏈接斷掉。只有當(dāng)最后將新的CTZSTRUCT tag寫入其父目錄的元數(shù)據(jù)中后,新的CTZSTRUCT tag中所包含的outline文件跳表頭節(jié)點才更新成功。

因此,如果發(fā)生掉電等異常情況導(dǎo)致outline文件的寫入操作未能完成時,其原有的數(shù)據(jù)也不會被丟棄。

如下圖,outline文件插入新的節(jié)點時不會去破壞原有的塊的數(shù)據(jù)。只有commit完成后,才會將新的頭節(jié)點寫入父目錄的元數(shù)據(jù)中,將原來的頭節(jié)點覆蓋。

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

4、block device讀寫

littlefs中block device相關(guān)的讀寫操作是其他各種上層讀寫操作的基礎(chǔ),前文中提到的文件讀寫等操作均由block device相關(guān)的讀寫操作完成。block device相關(guān)讀寫操作是直接對具體的塊進(jìn)行操作。文件讀寫、元數(shù)據(jù)commit過程中都是通過調(diào)用了block device相關(guān)的讀寫操作完成的。主要的相關(guān)函數(shù)為:

  • lfs_bd_read:從源塊或cache中讀取數(shù)據(jù)。
  • lfs_bd_prog:寫入數(shù)據(jù)到目標(biāo)塊或cache。
  • lfs_bd_flush:把cache中數(shù)據(jù)寫入到塊中。文件寫入后,只有當(dāng)進(jìn)行文件flush、sync或關(guān)閉操作時,才會調(diào)用lfs_bd_flush將數(shù)據(jù)實際寫入塊中,并將所有的更改進(jìn)行commit。

以上函數(shù)利用cache或直接從塊中進(jìn)行讀寫。

當(dāng)直接從塊中進(jìn)行讀寫時,是調(diào)用了用戶配置中提供的相關(guān)讀寫函數(shù):

// Configuration provided during initialization of the littlefs
struct lfs_config {
...
// Read a region in a block. Negative error codes are propogated
// to the user.
int (*read)(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, void *buffer, lfs_size_t size);
// Program a region in a block. The block must have previously
// been erased. Negative error codes are propogated to the user.
// May return LFS_ERR_CORRUPT if the block should be considered bad.
int (*prog)(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, const void *buffer, lfs_size_t size);
// Erase a block. A block must be erased before being programmed.
// The state of an erased block is undefined. Negative error codes
// are propogated to the user.
// May return LFS_ERR_CORRUPT if the block should be considered bad.
int (*erase)(const struct lfs_config *c, lfs_block_t block);
// Sync the state of the underlying block device. Negative error codes
// are propogated to the user.
int (*sync)(const struct lfs_config *c);
...
};

(1)cache

block device讀寫函數(shù)均接受兩個cache,即rcache和pcache作為參數(shù),用作讀緩存和寫緩存。具體作用見后面分析。

littlefs中cache共有以下幾種:

  • 全局rcache,lfs->rcache。用作rcache參數(shù)。
  • 全局pcache,lfs->pcache。讀寫元數(shù)據(jù)時用作pcache參數(shù)。
  • 文件的cache,file->cache。當(dāng)對文件進(jìn)行讀寫操作時用作pcache參數(shù)。

(2)block device讀操作

lfs_bd_read將源塊中數(shù)據(jù)讀到目標(biāo)buffer中。讀取過程中,根據(jù)數(shù)據(jù)是否在緩存中,分為以下幾種情況:

  1. 在pcache或rcache中:直接從cache中復(fù)制。

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

  1. 不在pcache和rcache中,且所需讀取大小小于一次能加載到cache中數(shù)據(jù)的大小:將源塊中數(shù)據(jù)加載到rcache,以便后面從rcache中讀。

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

  1. 不在pcache和rcache中,且所需讀取大小不小于一次能加載到cache中數(shù)據(jù)的大小:直接從源塊中讀。

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

相關(guān)函數(shù):

lfs_bd_read(lfs_t *lfs,
| const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint,
| lfs_block_t block, lfs_off_t off,
| void *buffer, lfs_size_t size)
| // 1. 檢查是否已讀完,未讀完則繼續(xù)步驟,否則結(jié)束
|-> while (size > 0) ...
|
| // 2. 如果pcache中有緩存對應(yīng)數(shù)據(jù),則從pcache中讀
|-> if (pcache && block == pcache->block &&
| off < pcache->off + pcache->size) {
| if (off >= pcache->off) {
| // is already in pcache?
| diff = lfs_min(diff, pcache->size - (off-pcache->off));
| memcpy(data, &pcache->buffer[off-pcache->off], diff);
|
| data += diff;
| off += diff;
| size -= diff;
| continue;
| }
| // pcache takes priority
| diff = lfs_min(diff, pcache->off-off);
| }
|
| // 3. 如果rcache中有緩存對應(yīng)數(shù)據(jù),則從rcache中讀
|-> if (block == rcache->block &&
| off < rcache->off + rcache->size) {
| if (off >= rcache->off) {
| // is already in rcache?
| diff = lfs_min(diff, rcache->size - (off-rcache->off));
| memcpy(data, &rcache->buffer[off-rcache->off], diff);
|
| data += diff;
| off += diff;
| size -= diff;
| continue;
| }
| // rcache takes priority
| diff = lfs_min(diff, rcache->off-off);
| }
|
| // 4. 如果未命中cache且size大于等于read_size,
| // 則讀取內(nèi)容大小超過cache一次加載的大小,此時從塊中讀
|-> if (size >= hint && off % lfs->cfg->read_size == 0 &&
| size >= lfs->cfg->read_size) {
| // bypass cache?
| diff = lfs_aligndown(diff, lfs->cfg->read_size);
| lfs->cfg->read(lfs->cfg, block, off, data, diff);
|
| data += diff;
| off += diff;
| size -= diff;
| continue;
| }
|
| // 5. 如果未命中cache且size小于read_size,則將塊數(shù)據(jù)加載到rcache
|-> rcache->block = block;
| rcache->off = lfs_aligndown(off, lfs->cfg->read_size);
| rcache->size = lfs_min(
| lfs_min(
| lfs_alignup(off + hint, lfs->cfg->read_size),
| lfs->cfg->block_size)
| - rcache->off,
| lfs->cfg->cache_size);
| int err = lfs->cfg->read(lfs->cfg, rcache->block,
| rcache->off, rcache->buffer, rcache->size);

(3)block device寫操作

lfs_bd_prog的作用是將源數(shù)據(jù)寫入到目標(biāo)塊中。但實際上沒有立即將數(shù)據(jù)寫入的目標(biāo)塊,而是先將數(shù)據(jù)復(fù)制到pcache中,等到flush操作時才將pcache中的數(shù)據(jù)寫到塊中:

littlefs原理分析#[五]文件讀寫-開源基礎(chǔ)軟件社區(qū)

相關(guān)函數(shù):

lfs_bd_prog(lfs_t *lfs,
| lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate,
| lfs_block_t block, lfs_off_t off,
| const void *buffer, lfs_size_t size)
| // 1. 檢查是否已寫完,未寫完則繼續(xù)步驟,否則結(jié)束
|-> while (size > 0) ...
|
| // 2. 如果pcache已準(zhǔn)備好,則將數(shù)據(jù)復(fù)制到pcache中
|-> if (block == pcache->block &&
| off >= pcache->off &&
| off < pcache->off + lfs->cfg->cache_size) {
| // already fits in pcache?
| lfs_size_t diff = lfs_min(size,
| lfs->cfg->cache_size - (off-pcache->off));
| memcpy(&pcache->buffer[off-pcache->off], data, diff);
|
| data += diff;
| off += diff;
| size -= diff;
|
| // 2.1 如果pcache已滿,則進(jìn)行flush
|-> if (pcache->size == lfs->cfg->cache_size) {
| // eagerly flush out pcache if we fill up
| lfs_bd_flush(lfs, pcache, rcache, validate);
| continue;
| }
|
| // 3. 如果pcache未準(zhǔn)備好,則準(zhǔn)備pcache
|-> pcache->block = block;
| pcache->off = lfs_aligndown(off, lfs->cfg->prog_size);
| pcache->size = 0;

總結(jié)

本文介紹了littlefs中的文件讀寫機制,到這里littlefs大部分的操作就都已經(jīng)做了分析了。下一篇文章將會介紹littlefs中的磨損均衡相關(guān)策略。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??。

責(zé)任編輯:jianghua 來源: 51CTO開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2022-11-07 15:27:07

LittlefsFetch操作

2022-11-22 15:21:55

littlefs磨損均衡

2022-11-02 15:56:45

littlefscommit機制

2022-11-09 08:52:57

littlefs目錄操作

2022-10-27 16:07:24

littlefs存儲結(jié)構(gòu)

2009-12-18 09:27:23

Ruby讀寫excel

2013-06-09 11:31:13

Android開發(fā)XML讀寫XML解析

2009-11-02 10:53:34

VB.NET INI文

2010-03-10 15:54:33

Python讀寫文件

2021-02-26 20:55:56

JavaNIO隨機

2021-08-05 10:00:02

Python編程語言

2023-01-04 13:43:24

讀寫鎖AQS共享模式

2009-07-06 17:47:44

2009-10-14 10:25:52

VB.NET讀寫文本文

2010-11-19 11:32:25

Oracle存儲過程

2010-07-16 09:06:57

Perl文件

2013-05-27 10:58:10

propertiesJava語言

2021-04-02 06:35:49

Bash讀寫文件Linux

2025-01-24 08:38:47

2017-03-01 16:40:12

Linux驅(qū)動技術(shù)設(shè)備阻塞
點贊
收藏

51CTO技術(shù)棧公眾號

国产超碰在线播放| 精品国产福利| 放荡的美妇在线播放| 成人自拍在线| 色呦呦国产精品| 制服丝袜综合日韩欧美| 色一情一乱一乱一区91av| 老司机一区二区三区| 久久久91精品国产| 你懂得在线视频| 91九色综合| 亚洲成人在线网站| 亚洲精品不卡| 色香蕉在线视频| 精品一区二区三区欧美| 98精品国产自产在线观看| 少妇愉情理伦三级| 国产精品久av福利在线观看| 欧美日韩在线播| 欧美乱妇15p| 国产视色精品亚洲一区二区| 中国一区二区视频| 伊人久久亚洲热| av一区二区三区黑人| 国产性色一区二区| 亚洲字幕在线观看| 久久久久国产精品夜夜夜夜夜| 97se亚洲| 7777精品伊人久久久大香线蕉| 国产99久久九九精品无码| 51xtv成人影院| 亚洲国产精品激情在线观看| 极品尤物一区二区三区| 亚洲精品福利网站| 国产另类ts人妖一区二区| 国产精品久久久久久久7电影| 国产中文字幕免费| 欧美aa国产视频| 国产一区二区欧美日韩| 波多野结衣视频播放| 日本免费一区二区三区视频| 欧美日韩亚洲国产综合| 色婷婷综合久久久久中文字幕| 色婷婷视频在线观看| 18成人在线观看| 亚洲精品人成| melody高清在线观看| 久久网站最新地址| 麻豆传媒一区| 三区在线观看| 2017欧美狠狠色| 国产专区一区二区三区| 免费观看黄色一级视频| 国产99久久久国产精品潘金| 成人午夜电影免费在线观看| 国产成人麻豆精品午夜在线| 国产一区二区视频在线播放| 国产裸体写真av一区二区| 精品视频一二三区| 玖玖玖国产精品| 高清在线视频日韩欧美| jizz国产免费| 亚洲人妖在线| 欧美一区二区色| 欧美亚洲精品天堂| 噜噜噜躁狠狠躁狠狠精品视频 | 五级黄高潮片90分钟视频| 黄色美女久久久| 亚洲精品电影在线观看| 久久丫精品国产亚洲av不卡| 奇米色欧美一区二区三区| 中文字幕日韩精品在线| 成人18视频免费69| 欧美大片专区| 性欧美在线看片a免费观看| 欧美三级午夜理伦| 日一区二区三区| 国产精品自拍视频| 国产黄色大片网站| 成人aaaa免费全部观看| 欧美日韩精品综合| av免费在线一区二区三区| 国产精品国产三级国产aⅴ入口 | 羞羞网站在线看| 亚洲一区二区三区小说| 日韩中文字幕三区| 看片一区二区| 日韩免费看网站| 黄色av网址在线观看| 精品在线观看入口| 久久精品视频导航| 好吊操这里只有精品| 日日欢夜夜爽一区| 91成人理论电影| 天堂网在线播放| 国产欧美日本一区二区三区| 日本老太婆做爰视频| 色多多在线观看| 欧美日本乱大交xxxxx| 亚洲视频 中文字幕| 欧洲福利电影| 欧美极品少妇与黑人| 亚洲 欧美 日韩 在线| 精品一区二区成人精品| 精品在线视频一区二区| 日本视频在线| 欧美性猛交xxxx免费看| 在线a免费观看| 欧美日韩播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品午夜影院| 国产精品一区二区免费不卡| 免费一区二区三区在在线视频| 欧美a在线看| 日韩欧美国产激情| 国产成人精品一区二区三区在线观看 | 污污视频网站在线免费观看| 亚洲国产导航| 成人伊人精品色xxxx视频| 三级在线观看网站| 亚洲精选在线视频| 久久99999| 免费看成人吃奶视频在线| 久久91精品国产91久久跳| 国产乡下妇女三片| 99久久99精品久久久久久| 国产精品一二三在线观看| 91大神在线观看线路一区| 亚洲精品美女在线观看| 免费看一级一片| 精品在线一区二区三区| 日韩免费电影一区二区| 涩涩网在线视频| 日韩免费一区二区| 黄页网站免费观看| 韩国视频一区二区| 一区二区三区在线视频111| 午夜精品成人av| 亚洲免费精彩视频| 国产三级精品三级在线观看| 99久久久精品| 欧美精品久久久久久久自慰 | 免费精品视频在线| 欧美日韩在线一区二区三区| 国产美女高潮在线观看| 亚洲成人av在线| 国产一级av毛片| 国产91在线观看丝袜| 中文字幕精品在线播放| 久久久久久久久成人| 日韩三级成人av网| 国产又粗又黄又爽| 自拍偷拍欧美精品| 污免费在线观看| 欧美日韩1区2区3区| 国产高清一区视频| av在线最新| 亚洲成人久久一区| 国产免费观看av| 91免费观看视频| 99热成人精品热久久66| 国产成人一区二区三区影院| 国产999精品视频| 草草影院在线观看| 精品视频在线免费观看| 91精品少妇一区二区三区蜜桃臀| 国产在线视频一区二区| 国产内射老熟女aaaa| 日韩中文字幕在线一区| 久久久久久久久网站| 日韩有码电影| 欧美三级在线视频| 青青草原免费观看| va亚洲va日韩不卡在线观看| 日韩欧美精品在线观看视频| 激情综合网站| 91在线观看免费网站| 黑人玩欧美人三根一起进| 亚洲美女av网站| 一区二区三区免费在线| 亚洲一区二三区| 丰满圆润老女人hd| 精品在线你懂的| 成人免费观看cn| 成人一区二区| 成人欧美一区二区| 精品三区视频| 欧美另类高清videos| 天天摸天天干天天操| 欧美无乱码久久久免费午夜一区| 动漫性做爰视频| 91蝌蚪国产九色| 做a视频在线观看| 在线国产日韩| 亚洲一区二区在线免费观看| 99国产精品免费网站| 国产成人a亚洲精品| 成人影欧美片| 亚洲欧洲在线视频| www.xxxx国产| 欧美色综合网站| 国产无遮挡aaa片爽爽| 国产精品久久看| 水蜜桃av无码| 国产在线一区二区| 一级特黄性色生活片| 国模吧视频一区| 亚洲高清视频一区| 牛牛影视久久网| 成人两性免费视频| 欧美xnxx| 91国产精品91| 牛牛精品在线视频| 日韩中文字幕亚洲| 青青青草原在线| 日韩一级在线观看| 伊人网av在线| 日韩欧美在线一区| 国产一级一片免费播放| 亚洲天堂精品在线观看| 麻豆精品免费视频| 成人av电影在线网| 在线观看av免费观看| 日韩二区在线观看| heyzo国产| 黄色在线成人| 一级特黄妇女高潮| 久久香蕉国产| 日韩欧美99| 亚洲精品白浆高清| 狠狠色综合网站久久久久久久| 精品久久亚洲| 91免费观看网站| 成人一级视频| 国产精品久久久久久超碰| 欧美gay视频| 2019亚洲日韩新视频| 91美女主播在线视频| 久久久久久高潮国产精品视| 日本高清在线观看| 另类专区欧美制服同性| 老司机在线视频二区| x99av成人免费| 日本三级视频在线播放| 色偷偷888欧美精品久久久 | 久久av资源网站| 国产美女在线观看| 美女999久久久精品视频| 欧美成人精品一区二区男人看| 最近中文字幕mv在线一区二区三区四区| 免费在线视频一级不卡| 亚洲欧美国产va在线影院| 国产在线黄色| 中文字幕亚洲一区二区三区五十路 | 国产精一区二区三区| 18禁一区二区三区| 成人黄色在线网站| 在线观看国产免费视频| 91麻豆国产自产在线观看| a毛片毛片av永久免费| 久久久噜噜噜久噜久久综合| 摸摸摸bbb毛毛毛片| 国产精品少妇自拍| 欧美卡一卡二卡三| 亚洲午夜电影在线| 啦啦啦免费高清视频在线观看| 日韩欧美亚洲范冰冰与中字| 免费又黄又爽又猛大片午夜| 欧美日韩国产精品成人| 99在线无码精品入口| 欧美va日韩va| 男人的天堂在线| 中文字幕亚洲欧美一区二区三区 | 亚洲国产精品狼友在线观看| www.99精品| 久久久国产一级片| 亚洲免费观看高清完整| 国产网站在线看| 色94色欧美sute亚洲线路二| 国产精品国产三级国产aⅴ | 国产露出视频在线观看| 久久精品国产一区二区三区 | 国产精品情侣自拍| 日本久久伊人| 日本精品一区二区三区不卡无字幕 | 亚洲а∨天堂久久精品9966| 激情小视频在线观看| 久久成人人人人精品欧| 欧产日产国产精品视频| 国产免费一区二区三区在线能观看| 国产在线不卡一区二区三区| 精品一区在线播放| 91精品国产乱码久久久久久久| 日本中文字幕亚洲| 全国精品久久少妇| 日本女人性视频| 国产亚洲一区二区三区在线观看| 91高清免费看| 在线观看亚洲精品视频| 亚洲毛片欧洲毛片国产一品色| 亚洲人成在线播放| 岛国毛片av在线| 国产精品久久视频| 亚洲自拍电影| 亚洲 欧美 综合 另类 中字| 奇米色一区二区三区四区| bl动漫在线观看| 最新久久zyz资源站| 久久久久久久久黄色| 精品久久一区二区三区| 69av亚洲| 日韩av毛片网| 136福利精品导航| 一级做a爰片久久| 美女诱惑黄网站一区| 欧美久久久久久久久久久| 中文字幕一区在线观看视频| 天天操夜夜操视频| 欧美不卡一区二区三区| 免费在线看黄网站| 国产高清在线不卡| 日韩激情网站| 成人午夜精品久久久久久久蜜臀| 激情综合五月婷婷| 三上悠亚影音先锋| 五月综合激情日本mⅴ| 国产成人三级在线播放| 日日噜噜噜夜夜爽亚洲精品 | 亚洲小说区图片| 国产视频福利一区| 大片网站久久| 午夜视频在线瓜伦| 久久久精品tv| 草莓视频18免费观看| 亚洲女人天堂视频| 亚洲色图官网| 久久国产精品 国产精品| 在线欧美日韩| 91传媒理伦片在线观看| 亚洲午夜久久久久久久久久久| 国产成人精品免费看视频| 伦理中文字幕亚洲| 国产美女亚洲精品7777| 色呦呦网站入口| 狠狠色丁香婷婷综合| www.99re6| 制服丝袜国产精品| 超碰在线无需免费| 1区1区3区4区产品乱码芒果精品| 中文字幕亚洲精品乱码| 四虎国产精品永久免费观看视频| 亚洲日韩欧美一区二区在线| 国产又大又长又粗| 久久中文字幕国产| 亚洲视频一起| 自拍日韩亚洲一区在线| 99国产精品国产精品毛片| 日本特级黄色片| 一区二区三欧美| 看片一区二区| 成人在线视频一区二区三区| 成人久久视频在线观看| 青青草成人av| 亚洲女人天堂网| 日韩毛片免费视频一级特黄| 正义之心1992免费观看全集完整版| 卡一卡二国产精品| 深夜福利影院在线观看| 欧美精品一区视频| 成人小电影网站| 亚洲国产高清国产精品| 国产在线视视频有精品| 日韩精品一区二区不卡| 亚洲人成在线免费观看| 国产成人免费视频网站视频社区 | 综合操久久久| 国产91色综合久久免费分享| 五月婷婷亚洲综合| 在线免费观看羞羞视频一区二区| 伊人久久一区| 男女视频网站在线观看| 日本一区二区免费在线观看视频 | 国产欧美自拍视频| 不卡高清视频专区| 中文字幕乱码中文字幕| 欧美福利视频在线| 国产乱码精品一区二区三区四区| 污污动漫在线观看| 亚洲成精国产精品女| 91高清在线| 国产日韩二区| 久久er99热精品一区二区| 国产对白videos麻豆高潮| 中文字幕精品av| 国产精品网址| 99sesese| 欧美色xxxx| 午夜影院免费在线| 品久久久久久久久久96高清| 国产精品白丝jk黑袜喷水|