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

littlefs原理分析--目錄操作(四)

系統 OpenHarmony
本文對目錄創建、目錄刪除和目錄移動操作進行了分析,包括目錄操作的過程、操作之后目錄的鏈接方式變化、目錄操作中的一些特殊處理等內容。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

前言

前面的三篇文章中分別介紹了littlefs的整體結構、commit機制和fetch操作。在介紹了 littlefs中元數據的讀取和寫入過程之后,這篇以及接下來的文章將開始對littlefs中的具體文件、目錄操作和策略等進行介紹。

本文主要對目錄的創建、刪除和移動操作進行總結,包括目錄操作的過程、操作之后目錄的鏈接方式變化、目錄操作中的一些特殊處理等。目錄的讀取、寫入和遍歷操作實際上在前面的文章中以及介紹過了,目錄的讀寫實際上就是元數據的讀寫操作,目錄的遍歷實際上就是fetch tail的操作。

一、目錄創建

1、commit過程

目錄創建會進行兩次commit。第一次commit時,是在新創建的目錄元數據中插入指向父目錄中末尾目錄的塊指針;第二次commit時,是在父目錄元數據中插入新創建目錄的塊指針。

目錄創建的過程是原子性的,只有第二次commit完成,父目錄元數據中才會記錄新創建的目錄。

commit過程如下:

  1. 創建新目錄。其中,SOFTTAIL指向父目錄元數據中最后一個有效的SOFTTAIL,如果父目錄中沒有有效的SOFTTAIL,則SOFTTAIL為空。

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

  1. 父目錄插入新目錄。其中,SOFTTAIL指向子目錄。

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

2、鏈接方式變化

創建目錄實際上是在parent->dir tail的單鏈表直接插入新目錄,變成parent->new dir->dir tail。

例如:向目錄C中創建目錄D,大致鏈接方式變化如下:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

注:SOFTTAIL用箭頭進行鏈接,只有SOFTTAIL為目錄最后的TAIL時用實線表示。

用fetch遍歷目錄順序的變化如下:

  • 前:A->C->B
  • 后:A->C->D->B

3、相關函數分析

lfs_mkdir(lfs_t *lfs, const char *path)
|-> lfs_rawmkdir(lfs_t *lfs, const char *path)
| // 1. 查找路徑和父目錄
|-> lfs_dir_find(lfs, &cwd.m, &path, &id);
|
| // 2. 分配新目錄
|-> lfs_dir_alloc(lfs, &dir);
|
| // 3. 在新目錄中進行commit
| // 存儲一個指向父目錄末尾目錄的塊指針
|-> lfs_dir_commit(lfs, &dir, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), pred.tail}));
|
| // 4. 在父目錄中進行commit
| // 將新目錄插入父目錄
|-> lfs_dir_commit(lfs, &cwd.m, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_CREATE, id, 0), NULL},
| {LFS_MKTAG(LFS_TYPE_DIR, id, nlen), path},
| {LFS_MKTAG(LFS_TYPE_DIRSTRUCT, id, 8), dir.pair},
| {LFS_MKTAG_IF(!cwd.m.split,
| LFS_TYPE_SOFTTAIL, 0x3ff, 8), dir.pair}));

二、目錄刪除

1、commit過程

目錄刪除的過程分為兩個步驟:

  1. 在其父目錄中commit一個DELETE類型的tag,表示從父目錄中將目錄刪除。該步驟與文件刪除的過程類似。如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區


2. 在被刪除目錄的前繼目錄(其tail指向被刪除的目錄)中commit新的SOFTTAIL類型的tag,表示斷開與將要刪除目錄的鏈接。新的SOFTTAIL指向被刪除目錄的后繼目錄(被刪除目錄tail指向的目錄)。如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

注:上圖的commit中還有一個MOVESTATE類型的tag,該tag與gstate和orphan目錄有關,見后面目錄刪除和移動操作中異常情況的分析。

2、鏈接方式變化

例如,刪除目錄B,其鏈接方式變化如下:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區


用fetch遍歷目錄順序的變化如下:

  • 前:parent->C->B->A
  • 后:parent->C->A

3、相關函數分析

lfs_remove(lfs_t *lfs, const char *path)
|-> lfs_rawremove(lfs_t *lfs, const char *path)
| // 1. 查找路徑和父目錄
|-> lfs_dir_find(lfs, &cwd, &path, NULL);
|
| // 2. 在父目錄中commit一個DELETE tag
|-> lfs_dir_commit(lfs, &cwd, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(tag), 0), NULL}));
|
| // 3. 找到刪除目錄的前繼目錄
|-> lfs_fs_pred(lfs, dir.m.pair, &cwd);
|
| // 4. 斷開刪除目錄與前繼目錄的鏈接
|-> lfs_dir_drop(lfs, &cwd, &dir.m);

4、orphan目錄

目錄刪除的過程時,有可能因為掉電等原因產生一個中間狀態,即第一次commit成功,而第二次commit失敗。例如,刪除目錄B,但只完成了第一步:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

此時目錄B就成了orphan目錄。

為了解決這個問題,littlefs中采用了gstate機制來進行異常狀態的記錄和檢查。

(1)gstate機制簡介

gstate是littlefs內存中維護的一組全局狀態,同時可作為MOVESTATE tag存儲于磁盤中。簡而言之,gstate機制通過如下方法記錄和檢查異常狀態:

  • 當進行如目錄刪除這樣可能因掉電導致異常狀態的操作時,會將內存中維護的gstate在commit前標記為異常狀態。因為這樣可以使得commit過程中將異常狀態作為MOVESTATE tag寫入磁盤。(lfs_dir_commit函數會檢查內存中的gstate變量,并根據gstate增加寫入MOVESTATE tag)
  • 當讀取磁盤元數據時,根據MOVESTATE tag中的信息,可以知道有無異常情況發生、異常情況是否解決等信息。這樣檢查到異常狀態后,就可以根據具體情況執行修復操作。
    gstate檢查時是通過異或操作計算所有MOVESTATE tag中的值,結果不為0則表示異常。

(2)orphan狀態的記錄和修復

當進行目錄刪除操作時,磁盤中orphan狀態的記錄和修復步驟如下:

  1. 第一次commit,從父目錄中將目錄刪除。此時記錄MOVESTATE tag于父目錄的元數據中。鏈接方式變化如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

  1. 第二次commit,這次即可能發生在第一次commit后,也可能是掉電后通過檢查gstate發現異常后的修復操作。此時記錄MOVESTATE tag于被刪除目錄的前繼目錄的元數據中。該MOVESTATE tag數據與在父目錄元數據中記錄的值相對應,這樣gstate檢查時進行異或計算就可與前面記錄的MOVESTATE tag進行抵消,表示異常已解決。鏈接方式變化如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

當進行目錄刪除操作時,內存gstate中orphan狀態的記錄和恢復步驟如下:

  1. 第一次commit前,標記gstate為orphan狀態。這樣第一次commit時就可以記錄MOVESTATE tag。
  2. 第一次commit后,還原gstate

記錄orphan狀態相關代碼分析如下:

lfs_remove(lfs_t *lfs, const char *path)
|-> lfs_rawremove(lfs_t *lfs, const char *path)
|-> ...
|
| // 在第一次commit前記錄gstate
|-> lfs_fs_preporphans(lfs, +1);
|
| // 第一次commit,會記錄MOVESTATE tag
|-> lfs_dir_commit(lfs, &cwd, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(tag), 0), NULL}));
|
| // 在第一次commit后恢復gstate
|-> lfs_fs_preporphans(lfs, -1);
|
|-> ...

修復orphan狀態相關代碼分析如下:

// 該函數在mount后進行檢查時被調用
lfs_fs_deorphan(lfs_t *lfs)
| // 遍歷文件系統
|-> while (...) {
| // 1. 查找當前orphan目錄的父目錄
|-> lfs_stag_t tag = lfs_fs_parent(lfs, pdir.tail, &parent);
|
| // 2. 如果當前目錄沒有父目錄,則當前目錄為orphan目錄,進行恢復
|-> if (tag == LFS_ERR_NOENT) {
| lfs_dir_drop(lfs, &pdir, &dir);
| // 2.1 檢查目錄中的異常狀態并記錄于gstate
|-> lfs_dir_getgstate(lfs, tail, &lfs->gdelta);
|
| // 2.2 commit新的TAIL類型tag,完成目錄刪除的第二次commit操作
| // 同時寫入MOVESTATE tag
|-> lfs_dir_commit(lfs, dir, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_TAIL + tail->split, 0x3ff, 8), tail->tail}));
| }
| }

三、目錄移動

1、commit過程

littlefs中將目錄或文件從舊的父目錄移動到新的父目錄下主要經過兩個步驟:

  1. 在新父目錄中commit,創建目錄并指向將要移動的目錄。其中,如果新父目錄下已經存在一個同名的文件或目錄,需要先將其刪除。值得注意的是,與創建目錄時不同,這里父目錄下并沒有commit一個SOFTTAIL類型的tag。如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

  1. 在舊父目錄中commit,刪除要移動的目錄。如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

注:上圖的commit中還有一個MOVESTATE類型的tag,該tag與gstate和move狀態有關,見后面move狀態相關分析。

2、鏈接方式變化

在目錄的移動過程中,新父目錄中沒有commit一個新的SOFTTAIL,舊父目錄中也沒有commit一個新的SOFTTAIL覆蓋原來的SOFTTAIL。由于鏈接方式和遍歷順序只與TAIL類型的tag有關,因此目錄移動后,其鏈接方式并沒有變化,只是存儲結構發生了變化,遍歷時目錄的順序仍然不變。

3、相關函數分析

lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath)
|-> lfs_rawrename(lfs_t *lfs, const char *oldpath, const char *newpath)
| // 1. 查找舊路徑和舊父目錄
|-> lfs_stag_t oldtag = lfs_dir_find(lfs, &oldcwd, &oldpath, NULL);
|
| // 2. 查找新路徑和新父目錄
|-> lfs_stag_t prevtag = lfs_dir_find(lfs, &newcwd, &newpath, &newid);
|
| // 3. 在新父目錄中進行commit
| // 3.1 如果新路徑下已經存在一個文件或目錄,則將其刪除
| // 3.2 在新父目錄下創建將要移動的目錄
|-> lfs_dir_commit(lfs, &newcwd, LFS_MKATTRS(
| {LFS_MKTAG_IF(prevtag != LFS_ERR_NOENT,
| LFS_TYPE_DELETE, newid, 0), NULL},
| {LFS_MKTAG(LFS_TYPE_CREATE, newid, 0), NULL},
| {LFS_MKTAG(lfs_tag_type3(oldtag), newid, strlen(newpath)), newpath},
| {LFS_MKTAG(LFS_FROM_MOVE, newid, lfs_tag_id(oldtag)), &oldcwd},
| {LFS_MKTAG_IF(samepair,
| LFS_TYPE_DELETE, newoldid, 0), NULL}));
|
| // 4. 在舊父目錄中刪除被移動目錄
|-> lfs_dir_commit(lfs, &oldcwd, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(oldtag), 0), NULL})

4、move狀態

與目錄刪除過程中類似,在目錄移動的過程中,當第一次commit成功,但第二次commit因為掉電等原因未完成時,也產生一個中間狀態。例如,將目錄C從A移動到B:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區

注:上圖中實線只表示存儲結構關系。

此時目錄B標記為move狀態。同樣的,move狀態也是通過gstate機制進行檢查和修復。

(1)move狀態的記錄和修復

當進行目錄移動操作時,與orphan狀態的記錄和恢復類似,磁盤中orphan狀態的記錄和修復步驟如下:

  1. 第一次commit,在新父目錄下創建目錄,此時記錄MOVESTATE tag于新父目錄的元數據中。存儲結構變化如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區


2. 第二次commit,從舊父目錄中刪除目錄,此時記錄MOVESTATE tag于舊目錄的元數據中。類似的,這次即可能發生在第一次commit后,也可能是掉電后通過檢查gstate發現異常后的修復操作。鏈接方式變化如下圖:

# littlefs原理分析#[四]目錄操作-開源基礎軟件社區


當進行目錄刪除操作時,內存gstate中move狀態的記錄和恢復步驟如下:

  1. 第一次commit前,標記gstate為move狀態。這樣第一次commit時就可以記錄MOVESTATE tag。
  2. 第一次commit后,還原gstate

記錄move狀態相關代碼分析如下:

lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath)
|-> lfs_rawrename(lfs_t *lfs, const char *oldpath, const char *newpath)
|-> ...
|
| // 1. 在第一次commit前記錄move狀態到gstate
|-> lfs_fs_prepmove(lfs, newoldid, oldcwd.pair);
|
| // 2. 在新父目錄中進行commit
|-> lfs_dir_commit(lfs, &newcwd, LFS_MKATTRS(
| {LFS_MKTAG_IF(prevtag != LFS_ERR_NOENT,
| LFS_TYPE_DELETE, newid, 0), NULL},
| {LFS_MKTAG(LFS_TYPE_CREATE, newid, 0), NULL},
| {LFS_MKTAG(lfs_tag_type3(oldtag), newid, strlen(newpath)), newpath},
| {LFS_MKTAG(LFS_FROM_MOVE, newid, lfs_tag_id(oldtag)), &oldcwd},
| {LFS_MKTAG_IF(samepair,
| LFS_TYPE_DELETE, newoldid, 0), NULL}));
|
| // 3. 恢復gstate中的move狀態
|-> lfs_fs_prepmove(lfs, 0x3ff, NULL);
|
| // 4. 在舊父目錄中刪除被移動目錄
|-> lfs_dir_commit(lfs, &oldcwd, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(oldtag), 0), NULL})

修復move狀態相關代碼分析如下:

// 該函數在mount后進行檢查時被調用
lfs_fs_demove(lfs_t *lfs)
|-> ...
|
| // 在新目錄中刪除被移動目錄的id,并恢復gstate
|-> uint16_t moveid = lfs_tag_id(lfs->gdisk.tag);
| lfs_fs_prepmove(lfs, 0x3ff, NULL);
| lfs_dir_commit(lfs, &movedir, LFS_MKATTRS(
| {LFS_MKTAG(LFS_TYPE_DELETE, moveid, 0), NULL}));

總結

本文對目錄創建、目錄刪除和目錄移動操作進行了分析,包括目錄操作的過程、操作之后目錄的鏈接方式變化、目錄操作中的一些特殊處理等內容。接下來的文章將會介紹littlefs系統的文件相關操作。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

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

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-11-07 15:27:07

LittlefsFetch操作

2022-11-15 09:24:16

littlefs文件讀寫

2022-11-02 15:56:45

littlefscommit機制

2022-10-27 16:07:24

littlefs存儲結構

2022-11-22 15:21:55

littlefs磨損均衡

2009-02-27 08:56:30

IIS.Net原理分析

2021-07-12 10:25:03

RocketMQ數據結構kafka

2011-08-18 09:46:40

活動目錄驗證原理

2011-05-31 13:12:15

Android 目錄結構

2009-10-26 15:11:25

VB.NET多媒體編程

2022-04-13 08:23:31

Golang并發

2021-10-12 17:19:17

Random局限性變量

2020-10-13 07:35:22

JUC - Count

2023-04-26 08:39:41

Bitmap元素存儲

2018-04-27 10:59:30

Linux目錄結構lib

2012-12-03 16:57:37

HDFS

2018-09-30 10:18:44

Linux 文件系統目錄

2011-01-11 14:17:29

Linux文件目錄

2010-07-15 14:01:10

Perl目錄句柄

2009-09-24 09:35:47

Hibernate插入
點贊
收藏

51CTO技術棧公眾號

中文字幕人成不卡一区| 日韩精品91亚洲二区在线观看 | 外国电影一区二区| 亚洲国产精品ⅴa在线观看| 91亚洲国产成人久久精品网站| 国产精品爽爽爽| 日本欧美视频在线观看| 日本福利午夜视频在线| 免费久久精品视频| 欧美激情a∨在线视频播放| 国产乱了高清露脸对白| 亚洲欧洲一二区| 激情亚洲一区二区三区四区| 亚洲午夜高清视频| 午夜成人免费影院| 韩国av一区二区三区在线观看| 亚州欧美日韩中文视频| 男人在线观看视频| 外国成人在线视频| 日韩欧美国产高清| 色综合手机在线| 九色porny丨国产首页在线| 国产精品美女久久久久久久| 好吊色欧美一区二区三区视频| 一本久道久久综合无码中文| aa亚洲婷婷| 色综合91久久精品中文字幕| 永久免费av无码网站性色av| 国产精品45p| 欧美一区二区在线观看| 18岁视频在线观看| 岛国av免费在线观看| 亚洲欧美另类在线| 午夜精品一区二区三区四区| 亚洲 精品 综合 精品 自拍| 国产精品亚洲成人| 成人黄色激情网| 久久国产乱子伦精品| 中文一区在线| 久久久噜噜噜久久| 黄色在线观看免费| 亚洲综合中文| 久久伊人91精品综合网站| 大吊一区二区三区| 精品免费在线| 亚洲午夜女主播在线直播| 日韩aaaaa| 国产精品chinese在线观看| 日韩精品综合一本久道在线视频| 亚洲欧美偷拍另类| 狠狠久久伊人中文字幕| 欧美性xxxxxx少妇| 精品久久久噜噜噜噜久久图片| 麻豆国产在线| 欧美视频二区36p| 欧美亚洲一二三区| 桃色av一区二区| 精品国产户外野外| 日本三级免费网站| 高清不卡亚洲| 91黄色在线观看| 国产无套粉嫩白浆内谢的出处| 天天综合av| 欧美三级免费观看| 玩弄japan白嫩少妇hd| 经典三级一区二区| 欧美亚洲动漫制服丝袜| 在线观看日本一区二区| 亚洲网站三级| 欧美成人一区二区三区| 韩国三级hd两男一女| 欧美一区二区三区红桃小说| 国产视频精品xxxx| 成人小视频免费看| 久久久久亚洲| 久久久久久噜噜噜久久久精品| 久久精品99国产精| 亚洲欧美成人| 国产精品女人久久久久久| 一级片在线观看视频| 国产大陆精品国产| 久久久久久欧美精品色一二三四| 国产黄在线观看免费观看不卡| 国产精品乱码妇女bbbb| 青青草视频国产| 伊人网在线播放| 欧美日韩日日摸| 国产精品欧美性爱| 全国精品免费看| 中国人与牲禽动交精品| 91视频免费在线看| 亚洲欧美日本日韩| 成人日韩在线电影| 午夜小视频在线播放| 欧美国产日韩在线观看| 日产精品久久久久久久蜜臀| 一区二区三区短视频| 欧美精品欧美精品系列| 亚洲国产精品热久久| 日韩成人精品视频在线观看| 豆花视频一区二区| 中文字幕av一区二区| 久久久久久福利| 日韩中文字幕区一区有砖一区| 国产欧美日韩中文字幕在线| 少妇精品视频一区二区| 国产精品免费观看视频| 欧日韩免费视频| 欧美大片网站| 亚洲欧美三级伦理| 久久免费公开视频| 蜜桃久久av一区| 国内成+人亚洲| 超碰最新在线| 91成人在线免费观看| 亚洲欧美高清在线| 国产精品久久观看| 浅井舞香一区二区| xxxx国产精品| 国产精品理伦片| 777久久久精品一区二区三区| www.欧美视频| 一区二区亚洲精品国产| 日本在线观看视频网站| 国产一区二区三区香蕉| 婷婷亚洲婷婷综合色香五月| 55av亚洲| 欧美成人欧美edvon| 亚洲不卡在线播放| 免费人成精品欧美精品| 久中文字幕一区| 国产丝袜在线播放| 日韩无一区二区| 亚洲一级二级片| 免费视频一区二区| 日韩影片在线播放| 成人私拍视频| 日韩精品中文字| 五月天婷婷综合网| 成人网男人的天堂| 2021国产视频| 天堂va在线高清一区| xvideos亚洲| 亚洲图片中文字幕| 国产精品丝袜91| 欧美 日韩 激情| 乱亲女h秽乱长久久久| 欧美成人午夜剧场免费观看| 91久久国语露脸精品国产高跟| 国产偷v国产偷v亚洲高清| 国产免费黄视频| 日韩激情啪啪| 欧美在线性爱视频| 欧洲天堂在线观看| 色综合久久综合网| 日韩毛片无码永久免费看| 日韩黄色免费电影| 亚洲精品一区二区三| 成人激情视屏| 色婷婷综合成人| 国产美女www爽爽爽视频| 中文字幕日韩精品一区| 久久aaaa片一区二区| 中文字幕人成人乱码| 91成人免费视频| 岛国片av在线| 亚洲第一在线视频| 国产www在线| 国产人成一区二区三区影院| 一区二区三区 日韩| 99精品全国免费观看视频软件| 91久久嫩草影院一区二区| 羞羞视频在线观看不卡| 亚洲第一视频网| 欧美videossex极品| 国产亚洲污的网站| 第一区免费在线观看| 欧美视频导航| 久久久免费看| 国产福利亚洲| 欧美国产日韩一区二区三区| 亚州av在线播放| 欧美日韩国产大片| 久久久久久久99| 国产三级精品三级在线专区| 国内av一区二区| 亚洲福利免费| 色大师av一区二区三区| 欧美精品影院| 国产91色在线|| 国产美女av在线| 日韩精品极品在线观看播放免费视频| 亚洲精品国产精品乱码视色| 亚洲另类中文字| 中文字幕一二三四区| 精品一区二区三区在线观看| 国产freexxxx性播放麻豆| 激情综合网站| 国产精品一区二区欧美| 在线一区视频观看| 欧美激情视频一区二区| 亚洲 激情 在线| 羞羞答答一区二区| 91美女片黄在线观| 中文字幕成在线观看| 久久久成人精品视频| 视频二区在线观看| 欧美精品视频www在线观看| 久久影院一区二区| 中文字幕不卡的av| 中文字幕人妻一区二区三区| 奇米色一区二区三区四区| 人妻久久久一区二区三区| 欧美电影《睫毛膏》| 精品欧美日韩| 日本精品在线播放| 国产精品免费久久久久久| 波多一区二区| 欧美成年人在线观看| 国产一级免费在线观看| 精品福利视频一区二区三区| 在线观看毛片视频| 色婷婷国产精品久久包臀| 青青草在线观看视频| 中文字幕av一区二区三区| 国产精品一级黄片| 处破女av一区二区| 日韩av在线中文| 久久青草久久| 国产免费黄色av| 亚洲天堂成人| 91精品国产毛片武则天| 国产电影一区二区在线观看| 欧洲一区二区在线| 久久av网址| 久久亚洲一区二区| 全国精品免费看| 精品一卡二卡三卡四卡日本乱码 | 91精品久久久久久久久中文字幕| 六月婷婷综合| 日韩av免费在线看| 成人欧美一区二区三区的电影| 91精品国产高清久久久久久| 波多野结衣中文在线| 欧美激情成人在线视频| 一色桃子av在线| 蜜月aⅴ免费一区二区三区| 黄色免费在线观看| 精品国偷自产在线视频99| 日本韩国在线视频爽| 中文字幕欧美国内| 在线观看免费网站黄| 中文综合在线观看| 麻豆系列在线观看| 久久夜色精品国产| 免费看电影在线| 午夜精品一区二区三区av| caoporn-草棚在线视频最| 久久免费国产精品1| 51精品在线| 国产成+人+综合+亚洲欧美丁香花| 在线成人av观看| 国产精品扒开腿做爽爽爽男男 | 欧美激情精品久久久六区热门| 女女同性女同一区二区三区按摩| 中文字幕一区二区三三| av 日韩 人妻 黑人 综合 无码| 欧美欧美全黄| 久久久久久人妻一区二区三区| 99pao成人国产永久免费视频| 北条麻妃在线视频观看| 日韩黄色在线观看| 中文字幕线观看| 国产成人精品免费视频网站| 看全色黄大色黄女片18| 久久久久亚洲蜜桃| 亚洲色图100p| 亚洲综合一二三区| 亚洲日本视频在线观看| 精品视频在线看| 亚洲精品97久久中文字幕| 亚洲国产精品va在线看黑人动漫| 亚洲 欧美 激情 另类| 一区二区三区视频在线| av网站网址在线观看| 久久久日本电影| 中文在线中文资源| 91精品免费视频| 欧美大奶一区二区| 亚洲一区二区三区免费看| 国产精品国码视频| 777米奇影视第四色| 国内精品伊人久久久久av影院 | 国产精品一线二线三线| 美女精品在线观看| 亚洲成人手机在线观看| 97久久人人超碰| 日本裸体美女视频| 亚洲aⅴ怡春院| 中文字字幕在线中文乱码| 精品成人佐山爱一区二区| 浮生影视网在线观看免费| 久久久久久久久久久成人| 成人涩涩视频| 国产伦精品一区二区三区视频免费 | 亚洲一区在线看| 一级片在线免费播放| 精品欧美一区二区在线观看| 大地资源中文在线观看免费版| 欧美丰满少妇xxxxx做受| 福利一区在线| 久久久久成人精品免费播放动漫| 久久久久久久久丰满| 中国人与牲禽动交精品| 国产区在线视频| 性色av一区二区咪爱| 日本一区二区三区电影免费观看| 欧美亚洲另类久久综合| 国内精品久久久久国产盗摄免费观看完整版| 日韩视频免费在线播放| 成人综合在线观看| avtt天堂在线| 精品污污网站免费看| 狠狠狠综合7777久夜色撩人| 久久人人爽人人| 日韩三级不卡| 桥本有菜av在线| 老牛国产精品一区的观看方式| 欧美熟妇精品一区二区蜜桃视频| 综合精品久久久| 中文字幕第31页| 亚洲香蕉av在线一区二区三区| 123区在线| 国产免费一区二区三区| 欧美一区二区| www.五月天色| 中文字幕五月欧美| 中文字幕免费播放| 亚洲网站视频福利| 久久电影tv| 美日韩精品免费| 一区二区动漫| 五月开心播播网| 欧美日韩国产黄| 色欲av伊人久久大香线蕉影院| 九九热在线精品视频| 99re8精品视频在线观看| 亚洲一区二区精品在线观看| 日av在线不卡| 精品人体无码一区二区三区| 在线观看www91| 成人精品一区二区三区免费| 国产成人精品一区二区三区| 国产尤物久久久| 日本在线一二三区| 国产精品美女视频| 中文字幕日韩第一页| 上原亚衣av一区二区三区| 国产成人福利夜色影视| 在线视频91| 国产精品一区二区在线观看网站| www.99re7| 精品盗摄一区二区三区| 人成在线免费网站| 色爱区成人综合网| 国产专区综合网| 国产精品第72页| 亚洲男女自偷自拍图片另类| 日韩不卡免费高清视频| 一区二区三区四区国产| 国产一区二区三区日韩| 国产无码精品视频| 亚洲欧美成人网| 人人精品久久| www插插插无码免费视频网站| 成人黄色国产精品网站大全在线免费观看 | www.亚洲色图.com| 少妇太紧太爽又黄又硬又爽| 国产亚洲欧美日韩精品| www.欧美视频| 日韩中文字幕在线视频观看| 国产香蕉久久精品综合网| 国产又黄又大又粗的视频| 欧美激情精品久久久久久久变态| 美女网站色精品尤物极品姐弟| 无人在线观看的免费高清视频| 亚洲欧洲在线观看av| 六月丁香综合网| 国产精品黄视频| 欧美午夜国产| 国产高清一区二区三区四区| 3d成人动漫网站| 亚洲第一av| 六月婷婷激情网| 久久久精品人体av艺术| a天堂在线观看视频| 欧洲成人免费aa| 综合天堂久久久久久久| 三上悠亚ssⅰn939无码播放 | 在线观看高清免费视频|