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

国产精品一区二区免费在线观看| 欧美日本啪啪无遮挡网站| 国产免费黄视频| 亚洲欧美综合一区二区| 国产精品美女久久久浪潮软件| 亚洲第一视频网| r级无码视频在线观看| 人妻精品无码一区二区| 国产精品美女久久久浪潮软件| 亚洲另类欧美自拍| 91福利免费观看| 97超碰人人模人人爽人人看| 天天干天天操天天干天天操| 99国产精品久久久久久久成人| 中文字幕一区二区三区乱码图片| 一区在线影院| 另类欧美日韩国产在线| 久久久国产精品免费| avtt中文字幕| 男人皇宫亚洲男人2020| 国产精品剧情在线亚洲| 91精品国产一区二区三区动漫| 欧美三日本三级少妇99| 日韩久久精品| 亚洲а∨天堂久久精品喷水| 国产亚洲欧美激情| 亚洲天堂网站在线观看视频| 中日韩av在线播放| 丰乳肥臀在线| 国产欧美精品一区二区色综合| 成人黄在线观看| a v视频在线观看| 91精品在线观看国产| 日韩国产欧美精品一区二区三区| 国产精品视频中文字幕| 91九色在线看| 亚洲视频一二三| 欧美一区2区三区4区公司二百| 国产人妖一区二区三区| 免费日韩av片| 欧美黑人性猛交| 青青操在线播放| 亚洲人成网www| 精品国产伦理网| 亚洲欧美日韩一二三区| 一二区成人影院电影网| 午夜电影一区二区三区| 91麻豆天美传媒在线| 超碰国产在线观看| www.亚洲在线| 亚洲影院在线观看| 国内不卡一区二区三区| 中文字幕 国产精品| 久久国产精品久久久久久电车| 精品国产乱码久久久久久婷婷| 日韩在线观看精品| 一级片视频免费看| 日本欧美高清| 91欧美大片| 亚洲综合在线第一页| 欧美精品二区三区四区免费看视频| 国精品人妻无码一区二区三区喝尿| 国产主播一区二区三区| 亚洲aa在线观看| 中文字幕在线观看第二页| 日韩电影在线观看一区| 青青草成人在线| 一级黄色在线视频| 午夜在线视频一区二区区别| 久久久天堂国产精品女人| 极品颜值美女露脸啪啪| 中文乱码免费一区二区三区下载| 日韩亚洲一区二区| 老司机福利在线观看| 日韩精品丝袜美腿| 亚洲嫩模很污视频| 成人免费看aa片| 成久久久网站| 最新国产精品拍自在线播放| www亚洲色图| 欧美h版在线| 免费99精品国产自在在线| 亚洲精品在线观看av| 亚洲区一区二| 日本精品久久中文字幕佐佐木| 一本一道无码中文字幕精品热| 午夜亚洲精品| 国产欧美日韩免费| 国产精品一级二级| 国产69精品久久99不卡| 精品国产免费一区二区三区 | 亚洲一区av在线| 国产精品12345| 超碰一区二区| 欧美色综合影院| 古装做爰无遮挡三级聊斋艳谭| 中文字幕一区二区三区四区久久| 精品久久一区二区三区| 懂色av粉嫩av蜜乳av| 视频精品在线观看| 日韩在线观看免费| 国产第一页第二页| 天堂在线一区二区| 一区二区黄色| 日本高清不卡aⅴ免费网站| 欧美亚洲日本在线观看| 99久久综合国产精品二区| 欧美疯狂做受xxxx富婆| 亚洲摸摸操操av| 99se婷婷在线视频观看| 天堂在线资源网| 国产三级欧美三级| 日本一本a高清免费不卡| 午夜肉伦伦影院| 欧美艳星kaydenkross| 在线电影一区二区三区| 久久中文字幕在线视频| 两女双腿交缠激烈磨豆腐 | 97免费视频在线| 中文人妻熟女乱又乱精品| 国产成人在线色| 久久riav二区三区| 午夜伦理在线| 亚洲3atv精品一区二区三区| 免费日韩视频在线观看| 色综合天天色| 日韩av在线网| 永久免费看黄网站| 久久精品国内一区二区三区| 国产综合第一页| 后进极品白嫩翘臀在线播放| 欧美性大战xxxxx久久久| 日韩综合第一页| 911久久香蕉国产线看观看| 97视频国产在线| 国产视频aaa| 国内一区二区三区| 国产精品国产三级在线观看| 久草成色在线| 韩国av免费在线观看| 国产a级黄色片| 国产91在线亚洲| 91久久爱成人| 日韩在线视频观看| 欧美日韩精品电影| 欧美大片一区二区三区| 全黄性性激高免费视频| 欧美大胆a人体大胆做受| 91精品国产欧美一区二区18| xxxx日本黄色| 同性恋视频一区| 视频一区二区三区入口| 青草成人免费视频| 狠狠综合久久av一区二区| 一区在线观看视频| 九九九在线观看视频| 日本一区二区三区精品| 国内综合精品午夜久久资源| 国产欧美一区二区三区在线 | 欧美视频观看一区| 日本大片在线播放| 欧美成人video| 草视频在线观看| 国产一区二区三区国产| 国产日本欧美在线| 国产剧情一区二区在线观看| 神马久久久久久| 在线观看毛片av| 国产精品人妖ts系列视频| 日韩一级片播放| 精品国产123区| 国产极品jizzhd欧美| 天堂在线中文资源| 欧美老女人另类| 久久网站最新地址| 欧美aaa在线观看| www.久久热| 久久国产精品亚洲| 国产白浆在线观看| 亚洲一区免费在线观看| 在线播放av网址| 亚洲视频大全| 免费不卡亚洲欧美| www.成人爱| 亚洲片av在线| 91 中文字幕| 亚洲精品国产无天堂网2021| 国产无套精品一区二区三区| 日韩天天综合| 欧美日韩国产三区| 久久99国产精品二区高清软件| 色青青草原桃花久久综合| 99国产精品久久久久99打野战| 亚洲综合偷拍欧美一区色| 老司机免费视频| 久久免费国产| 欧美 日韩 国产 在线观看| 成人av影音| 欧洲成人免费aa| 日本中文字幕伦在线观看| 日韩一级成人av| 国产免费av一区二区| 国产精品水嫩水嫩| 曰本三级日本三级日本三级| 国产日韩一区二区三区在线播放| 日韩精品无码一区二区三区| 99精品美女视频在线观看热舞| 国产成人免费xxxxxxxx| 欧美一区1区三区3区公司| 成人国产一区二区三区精品麻豆| 久久综合免费视频| 日本久久一级片| 欧美日韩一区视频| 久久精品亚洲无码| 中文av一区二区| 人妻av一区二区| 精品写真视频在线观看| 成年人网站免费视频| 999国产精品999久久久久久| 精品久久久久久综合日本 | 91香蕉视频在线| 在线观看高清免费视频| 欧美国产综合| 日韩片电影在线免费观看| 久久精品一级| 国产精品444| heyzo一区| 波霸ol色综合久久| 精品久久久免费视频| 亚洲日产av中文字幕| 日本精品va在线观看| 黄av在线播放| 亚洲图片欧美日产| 肉大捧一出免费观看网站在线播放| 国精产品一区一区三区mba下载| 亚洲色图15p| 日本黄色免费视频| 欧美一区二区三区日韩| 高潮无码精品色欲av午夜福利| 亚洲高清中文字幕| 成人免费黄色小视频| 国产欧美一区二区在线| 日韩Av无码精品| 国产精品系列在线观看| 黄色一级片免费的| 亚欧美中日韩视频| 国产人妻777人伦精品hd| 天天揉久久久久亚洲精品| 日韩av电影免费在线| 校花撩起jk露出白色内裤国产精品| 97超碰人人模人人爽人人看| 日韩精品第二页| 国产精品高清在线| jizz内谢中国亚洲jizz| 欧美在线一级va免费观看| 91色在线看| 久久久噜噜噜久久久| 午夜伦理大片视频在线观看| 大胆欧美人体视频| 免费超碰在线| 日韩视频一区在线| av在线天堂| 正在播放国产一区| 成人高清免费在线播放| 在线观看欧美日韩| av在线之家电影网站| 原创国产精品91| 99久久综合网| 亚洲三级网站| 无码专区aaaaaa免费视频| 在线一区欧美| 91看片就是不一样| 亚洲欧美日韩一区在线观看| aⅴ在线免费观看| 日本不卡123| 国产一伦一伦一伦| 国产又黄又大久久| 少妇丰满尤物大尺度写真| 国产成人精品免费在线| 亚洲国产成人在线播放| 亚洲爆乳无码一区二区三区| 精品久久久久久久久久久院品网 | 羞羞电影在线观看www| 欧美成人在线免费| 国产剧情av在线播放| 成人黄页毛片网站| 制服丝袜中文字幕一区| 国产精欧美一区二区三区| av免费观看网| 九九热久久免费视频| www.黄色国产| 亚洲人挤奶视频| 国产欧美视频在线观看| 日韩精品国内| 99久久精品网站| 黄色特一级视频| 国产精品社区| 天美星空大象mv在线观看视频| 精品一区二区三区视频在线观看| 人妻巨大乳一二三区| 99久久精品国产一区二区三区 | 亚洲国产天堂网精品网站| 亚洲AV成人无码一二三区在线| 国产一区二区三区在线观看视频 | 好看的亚洲午夜视频在线| 欧美国产视频一区| 久久久久99| 亚洲自拍另类欧美丝袜| 一级黄色在线视频| 欧美疯狂性受xxxxx喷水图片| 国产一区二区三区中文字幕| 精品国产露脸精彩对白| 免费成人av电影| 久久亚洲影音av资源网| 松下纱荣子在线观看| 成人有码在线视频| 日韩高清一级| 国产三级中文字幕| 老司机精品视频网站| 久久久久国产免费| 亚洲国产精品精华液ab| 日韩伦理在线视频| 欧美疯狂性受xxxxx喷水图片| 日本天堂在线| 欧美日韩第一视频| 懂色aⅴ精品一区二区三区| 国产精品免费一区二区三区观看| 嫩草在线视频| 精品视频一区二区不卡| а√天堂资源在线| 亚洲欧洲xxxx| 二区三区四区高清视频在线观看| 久久久久久久久久亚洲| 亚洲青青一区| 色涩成人影视在线播放| 91精品啪在线观看国产81旧版| 久久无码高潮喷水| 成人av免费在线观看| 一区视频免费观看| 欧美日韩色一区| 亚州av在线播放| 九九热精品在线| 日韩国产大片| 亚洲精品第一区二区三区| 黄网在线免费看| 最近2019年日本中文免费字幕| 羞羞的视频在线看| 成人观看高清在线观看免费| 国产激情在线观看| 欧美色播在线播放| www.久久伊人| 欧美麻豆久久久久久中文| 日韩大陆av| 一区二区三区国| 捆绑调教美女网站视频一区| 国产精品久久免费观看| 欧美亚洲动漫另类| 成年人在线免费观看| 国产精品久久久久7777婷婷| 亚洲精品亚洲人成在线观看| 黄色一级在线视频| 99久久伊人网影院| 色婷婷av国产精品| 亚洲精品久久久久中文字幕二区 | 精品国产鲁一鲁****| 亚洲欧美国产不卡| 麻豆一区二区在线| 国产在线观看免费视频软件| 欧美群妇大交群中文字幕| 日韩精品黄色| 91亚洲va在线va天堂va国| 九九视频免费观看视频精品| 国产在线精品91| 2020国产成人综合网| 日韩在线视频不卡| 亚洲人a成www在线影院| 国产v综合v| 日韩精品在在线一区二区中文| 视频一区欧美精品| 免费成人深夜夜行p站| 激情av一区二区| 天天干天天草天天射| 国产91露脸中文字幕在线| 精品久久一区| 一级网站在线观看| 五月婷婷综合在线| 国产中文字幕在线视频| 国产精品一区专区欧美日韩| 国产精品成人av| 欧美日韩中文不卡| 国产成人高清视频| 大片在线观看网站免费收看| 国产美女精品人人做人人爽| 免费在线视频一区二区| 日韩成人在线视频观看| 伊人成年综合网| 成人sese在线| 国产中文字幕视频| 久久99久久久久久久噜噜| 亚洲a级精品|