精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

日韩大片免费观看| 亚洲乱码在线观看| 日韩精品久久久久久久电影99爱| 欧美美女直播网站| 免费在线看黄色片| 国家队第一季免费高清在线观看| 激情偷乱视频一区二区三区| 久久久久久网址| www..com.cn蕾丝视频在线观看免费版| 91精品麻豆| 欧美视频精品一区| 一本色道久久综合亚洲二区三区 | 综合久久亚洲| 亚洲精品理论电影| 亚洲一区二区偷拍| 亚洲综合在线电影| 亚洲国产你懂的| 亚洲欧美久久234| 少妇精品视频一区二区| 久久99久久久久| 欧美专区中文字幕| 免费一级片视频| 久久精品国产亚洲夜色av网站| 亚洲第一偷拍网| 一级 黄 色 片一| 欧美黄色三级| 精品国产老师黑色丝袜高跟鞋| 在线国产99| 精品亚洲综合| 97久久精品人人澡人人爽| 成人欧美在线观看| 中文字幕 日韩有码| 一本一道久久综合狠狠老精东影业| 色午夜这里只有精品| 国产伦精品一区二区三区妓女 | 国产精品一区二区三区不卡| 国产精品丝袜黑色高跟鞋| 久久久综合网| 国产91对白在线播放| 免费一级特黄特色大片| 91精品国产乱码久久久久久久| 在线一区二区日韩| a级在线免费观看| 你懂的视频欧美| 精品偷拍各种wc美女嘘嘘| 亚洲精品鲁一鲁一区二区三区| 日韩成人在线一区| 欧美日韩二区三区| 在线观看免费视频高清游戏推荐| 偷拍视频一区二区三区| 色综合天天视频在线观看| 欧美 日韩 国产一区| 九色porny自拍视频在线播放| 亚洲成人手机在线| 男女超爽视频免费播放| 岛国av免费在线观看| 午夜精品一区二区三区三上悠亚 | 久久精品三级| 国产成人在线亚洲欧美| 日本久久综合网| 蜜桃一区二区三区四区| 国产美女扒开尿口久久久| 亚洲一区 中文字幕| 久久99精品久久久久久国产越南| 91在线国产电影| xxxwww在线观看| www.日韩在线| 欧美精品一区二区三区在线四季 | 欧美日本视频在线观看| 一本大道色婷婷在线| 91久久精品一区二区三区| 久久久久国产精品熟女影院| 精品福利在线| 欧美一区二区久久| 95视频在线观看| 私拍精品福利视频在线一区| 亚洲天堂一区二区三区| 中文字幕在线观看2018| 亚洲国产精品第一区二区| 欧美亚洲视频在线看网址| 伊人成年综合网| 精品无人码麻豆乱码1区2区| 97人人模人人爽人人少妇| 色哟哟中文字幕| 久久精品亚洲国产奇米99| 精品久久免费观看| 国产激情在线播放| 欧美老女人在线| 91黄色免费视频| 久久精品不卡| 97碰碰碰免费色视频| 一级久久久久久| 国产精品亚洲视频| 久久久人人爽| 里番在线观看网站| 亚洲最大的成人av| 污视频免费在线观看网站| 日韩中文在线| 国产亚洲欧美一区| 久久一区二区三| 日韩电影一区二区三区四区| 亚洲最大的av网站| 九色在线免费| 亚洲一区二区三区自拍| 国产又大又黄又粗又爽| 精品福利网址导航| 久久手机免费视频| 看黄色一级大片| 懂色av一区二区三区免费看| 日韩欧美一区二区三区久久婷婷| 性国产高清在线观看| 欧美三级欧美一级| 亚洲精品女人久久久| 综合天堂av久久久久久久| 日韩美女中文字幕| 天堂在线视频观看| 亚洲免费观看高清完整版在线观看熊| 92看片淫黄大片一级| 五月亚洲婷婷| 久久精品国产欧美亚洲人人爽| 免费观看成人毛片| 处破女av一区二区| 91嫩草国产丨精品入口麻豆| 成人国产一区| 亚洲欧美三级伦理| 亚洲免费在线视频观看| 成人激情av网| 日本黄大片在线观看| 在线观看欧美| 久久精品99久久久久久久久| 中文字幕av片| 国产欧美一区二区在线观看| 波多野结衣乳巨码无在线| 成人av地址| 欧美精品videossex性护士| www.日韩在线观看| 亚洲日本乱码在线观看| 九九九九九伊人| 99国内精品久久久久久久| 国产精品一区二区三区毛片淫片| 黄网在线免费| 欧美优质美女网站| 日本一级免费视频| 日本vs亚洲vs韩国一区三区二区| 人偷久久久久久久偷女厕| 中国色在线日|韩| 精品亚洲精品福利线在观看| 成人免费区一区二区三区| 不卡av在线网| 国产美女无遮挡网站| 欧美色图婷婷| 日本国产一区二区三区| 韩国三级av在线免费观看| 在线观看www91| 免费91在线观看| 久久99精品国产91久久来源| 可以免费看的黄色网址| 国产精品一区二区三区www| 欧美老肥婆性猛交视频| 性一交一乱一精一晶| 亚洲成a人v欧美综合天堂| 亚洲啪av永久无码精品放毛片| 黄色国产精品| 久久婷婷人人澡人人喊人人爽| 自拍一区在线观看| 在线国产精品播放| 97视频免费在线| 亚洲综合久久av| 亚洲欧美视频在线播放| 日韩在线卡一卡二| 91制片厂免费观看| 国产精品qvod| 国产成人精品优优av| 麻豆传媒视频在线观看免费| 亚洲成人动漫在线播放| 日韩精品一区二区亚洲av| 国产精品亲子乱子伦xxxx裸| 亚洲高清在线不卡| 亚洲九九精品| 亚洲国产欧美不卡在线观看 | 欧美精品一二三| 妺妺窝人体色www婷婷| 久久综合网色—综合色88| 黄大色黄女片18第一次| 亚洲手机视频| 色噜噜狠狠一区二区三区| 亚洲精品观看| 国产精品久久不能| 欧洲性视频在线播放| 亚洲午夜精品久久久久久性色 | 国产日韩影视精品| 超碰人人cao| 久久精品观看| 国产成人一区二区三区别| 夜色77av精品影院| 9a蜜桃久久久久久免费| yiren22亚洲综合| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 亚洲一区中文| 麻豆一区二区三区在线观看| 日本亚洲不卡| 99在线高清视频在线播放| 99re久久| 欧美一级视频在线观看| 91麻豆国产福利在线观看宅福利| 亚洲人a成www在线影院| 亚洲精品18p| 欧美日韩精品一区二区三区 | 欧美日韩精品福利| 亚洲伊人成人网| 一区二区三区毛片| 岛国片在线免费观看| 99re视频这里只有精品| 色欲无码人妻久久精品| 蜜臀av性久久久久av蜜臀妖精 | 不卡福利视频| 韩国v欧美v日本v亚洲| 超碰免费在线播放| 中文字幕国产亚洲2019| 青青草在线免费观看| 亚洲精品一区二区三区蜜桃下载| 亚洲一区中文字幕在线| 欧美亚洲一区二区在线观看| www欧美在线| 午夜天堂影视香蕉久久| 久久免费看少妇高潮v片特黄| 国产精品女同一区二区三区| 欧洲女同同性吃奶| 2020国产精品| 国产精品jizz| 久久夜色精品一区| 欧美高清性xxxx| 91麻豆国产在线观看| 日韩aaaaa| 99精品视频在线观看免费| 精品久久久久久无码人妻| 国产一区二区三区免费| 国产农村妇女精品久久| 精品一区二区成人精品| 黄色小视频免费网站| 麻豆中文一区二区| 美女网站视频黄色| 蜜桃视频一区二区三区在线观看| 国产精品视频黄色| 免费av网站大全久久| 成人免费在线观看视频网站| 麻豆精品在线播放| 最新av免费在线观看| 久久国内精品视频| 日韩不卡的av| 成人亚洲精品久久久久软件| 欧美xxxx×黑人性爽| 99国产精品久| 免费观看a级片| 国产精品对白交换视频 | 亚洲精品二区三区| 日韩欧美视频免费在线观看| 欧美午夜影院| 久久久一本二本三本| 久操手机在线视频| 亚洲电影在线| 黑人粗进入欧美aaaaa| 久久精品国产精品亚洲红杏| 精品人妻一区二区三区免费| 成人精品免费看| 中文字幕一区二区三区人妻不卡| 国产亚洲欧美日韩在线一区| 国产又黄又粗的视频| 亚洲人成网站影音先锋播放| 久久免费精彩视频| 色呦呦日韩精品| 国产男女裸体做爰爽爽| 欧美精品一区二区久久婷婷| 免费在线观看一级毛片| 精品国产拍在线观看| 另类视频在线| 国产精品国产三级国产aⅴ浪潮 | 日韩视频精品| 91精品一区国产高清在线gif| 黄色激情在线视频| 视频一区二区不卡| 欧美体内she精高潮| 91小视频在线免费看| 777777国产7777777| 亚洲18女电影在线观看| 欧美 亚洲 另类 激情 另类| 日韩一级免费一区| 伦理片一区二区三区| 久久国产精品久久精品| gay欧美网站| 亚洲最大福利网站| 精品一区av| 欧美一级视频在线播放| 日本免费新一区视频| 中文字幕天堂av| 国产精品久久免费看| 日韩三级视频在线| 666欧美在线视频| 理论视频在线| 欧美激情手机在线视频| jvid一区二区三区| 鲁鲁视频www一区二区| 中文字幕日韩欧美精品高清在线| 熟女人妇 成熟妇女系列视频| 国产一区二区三区av电影| 成人免费无遮挡无码黄漫视频| 亚洲久本草在线中文字幕| 欧美一级做a爰片免费视频| 精品国产不卡一区二区三区| 四虎久久免费| 浅井舞香一区二区| 久久国产精品免费精品3p| 中文字幕欧美日韩一区二区三区| 视频在线观看一区二区三区| 黑人玩弄人妻一区二区三区| 亚洲乱码国产乱码精品精98午夜| 国产精品成人久久久| 亚洲精品在线看| 大桥未久在线视频| 国产99在线播放| 欧美一区精品| 日日干日日操日日射| 中文字幕的久久| 男操女视频网站| 亚洲欧美日韩综合| 美女日韩欧美| 美女一区视频| 在线亚洲一区| 男男做爰猛烈叫床爽爽小说| 一区二区三区四区av| 国产乱人乱偷精品视频| 神马久久桃色视频| 国产精品第一| 亚洲国产精品www| 视频一区中文字幕| 在线观看国产精品一区| 色综合天天性综合| 国产综合视频一区二区三区免费| 欧美伊久线香蕉线新在线| 婷婷成人综合| 漂亮人妻被中出中文字幕| 26uuu国产电影一区二区| 久久亚洲天堂网| 亚洲欧美第一页| 免费欧美电影| 亚洲精品一卡二卡三卡四卡| 日韩av一级片| 欧美肥妇bbwbbw| 日韩欧美黄色影院| 成年网站在线视频网站| 国内一区二区在线视频观看| 国产日韩一区二区三区在线播放 | 日韩三级精品| 欧美精品与人动性物交免费看| 国产日韩欧美| 免费在线观看污| 欧美色国产精品| 黄色在线免费| caoporen国产精品| 亚洲毛片视频| 女女互磨互喷水高潮les呻吟| 欧美调教femdomvk| 国产在线更新| 国产成人精品福利一区二区三区| 亚洲精品乱码| 一级黄色性视频| 欧美日韩aaaaaa| 性欧美ⅴideo另类hd| 久草一区二区| 日韩黄色在线观看| 91香蕉视频在线播放| 精品国产伦一区二区三区观看方式 | 97久久精品人人做人人爽| 色老头一区二区| 久久久国产视频91| 狼人精品一区二区三区在线 | 亚洲欧美日韩在线高清直播| 国产精品99| 国产精品三级一区二区| 97aⅴ精品视频一二三区| 中文字幕人妻一区二区在线视频| 久久成人在线视频| 亚洲区小说区| 青娱乐精品在线| 欧美视频一二三| 在线看福利影| 欧美一区少妇| 国产suv精品一区二区三区| 9i精品福利一区二区三区| 超碰91人人草人人干| 亚洲制服欧美另类| 国产无套精品一区二区三区| 日韩欧美有码在线| 污污的网站在线免费观看| 欧美激情导航| 成人性生交大片免费看视频在线 | 天堂av免费看| 久久综合色鬼综合色| www男人的天堂| 国产精品一区二区性色av |