国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Linux 的文件系統(tǒng)及文件緩存知識(shí)點(diǎn)整理

共 12652字,需瀏覽 26分鐘

 ·

2020-11-03 09:21


點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。

作者:luozhiyun

來(lái)源:https://www.cnblogs.com/luozhiyun/p/13061199.html

Linux的文件系統(tǒng)特點(diǎn)

  • 文件系統(tǒng)要有嚴(yán)格的組織形式,使得文件能夠以塊為單位進(jìn)行存儲(chǔ)。

  • 文件系統(tǒng)中也要有索引區(qū),用來(lái)方便查找一個(gè)文件分成的多個(gè)塊都存放在了什么位置。

  • 如果文件系統(tǒng)中有的文件是熱點(diǎn)文件,近期經(jīng)常被讀取和寫(xiě)入,文件系統(tǒng)應(yīng)該有緩存層。

  • 文件應(yīng)該用文件夾的形式組織起來(lái),方便管理和查詢。

  • Linux內(nèi)核要在自己的內(nèi)存里面維護(hù)一套數(shù)據(jù)結(jié)構(gòu),來(lái)保存哪些文件被哪些進(jìn)程打開(kāi)和使用。

總體來(lái)說(shuō),文件系統(tǒng)的主要功能梳理如下:

ext系列的文件系統(tǒng)的格式

inode與塊的存儲(chǔ)

硬盤(pán)分成相同大小的單元,我們稱為塊(Block)。一塊的大小是扇區(qū)大小的整數(shù)倍,默認(rèn)是4K。在格式化的時(shí)候,這個(gè)值是可以設(shè)定的。

一大塊硬盤(pán)被分成了一個(gè)個(gè)小的塊,用來(lái)存放文件的數(shù)據(jù)部分。這樣一來(lái),如果我們像存放一個(gè)文件,就不用給他分配一塊連續(xù)的空間了。我們可以分散成一個(gè)個(gè)小塊進(jìn)行存放。這樣就靈活得多,也比較容易添加、刪除和插入數(shù)據(jù)。

inode就是文件索引的意思,我們每個(gè)文件都會(huì)對(duì)應(yīng)一個(gè)inode;一個(gè)文件夾就是一個(gè)文件,也對(duì)應(yīng)一個(gè)inode。

inode數(shù)據(jù)結(jié)構(gòu)如下:

struct?ext4_inode?{
????__le16??i_mode;?????/*?File?mode?*/
????__le16??i_uid;??????/*?Low?16?bits?of?Owner?Uid?*/
????__le32??i_size_lo;??/*?Size?in?bytes?*/
????__le32??i_atime;????/*?Access?time?*/
????__le32??i_ctime;????/*?Inode?Change?time?*/
????__le32??i_mtime;????/*?Modification?time?*/
????__le32??i_dtime;????/*?Deletion?Time?*/
????__le16??i_gid;??????/*?Low?16?bits?of?Group?Id?*/
????__le16??i_links_count;??/*?Links?count?*/
????__le32??i_blocks_lo;????/*?Blocks?count?*/
????__le32??i_flags;????/*?File?flags?*/
......
????__le32??i_block[EXT4_N_BLOCKS];/*?Pointers?to?blocks?*/
????__le32??i_generation;???/*?File?version?(for?NFS)?*/
????__le32??i_file_acl_lo;??/*?File?ACL?*/
????__le32??i_size_high;
......
};

inode里面有文件的讀寫(xiě)權(quán)限i_mode,屬于哪個(gè)用戶i_uid,哪個(gè)組i_gid,大小是多少i_size_io,占用多少個(gè)塊i_blocks_io,i_atime是access time,是最近一次訪問(wèn)文件的時(shí)間;i_ctime是change time,是最近一次更改inode的時(shí)間;i_mtime是modify time,是最近一次更改文件的時(shí)間等。

所有的文件都是保存在i_block里面。具體保存規(guī)則由EXT4_N_BLOCKS決定,EXT4_N_BLOCKS有如下的定義:

#define????EXT4_NDIR_BLOCKS????????12
#define????EXT4_IND_BLOCK??????????EXT4_NDIR_BLOCKS
#define????EXT4_DIND_BLOCK?????????(EXT4_IND_BLOCK?+?1)
#define????EXT4_TIND_BLOCK?????????(EXT4_DIND_BLOCK?+?1)
#define????EXT4_N_BLOCKS???????????(EXT4_TIND_BLOCK?+?1)

在ext2和ext3中,其中前12項(xiàng)直接保存了塊的位置,也就是說(shuō),我們可以通過(guò)i_block[0-11],直接得到保存文件內(nèi)容的塊。

但是,如果一個(gè)文件比較大,12塊放不下。當(dāng)我們用到i_block[12]的時(shí)候,就不能直接放數(shù)據(jù)塊的位置了,要不然i_block很快就會(huì)用完了。

那么可以讓i_block[12]指向一個(gè)塊,這個(gè)塊里面不放數(shù)據(jù)塊,而是放數(shù)據(jù)塊的位置,這個(gè)塊我們稱為間接塊。如果文件再大一些,i_block[13]會(huì)指向一個(gè)塊,我們可以用二次間接塊。二次間接塊里面存放了間接塊的位置,間接塊里面存放了數(shù)據(jù)塊的位置,數(shù)據(jù)塊里面存放的是真正的數(shù)據(jù)。如果文件再大點(diǎn),那么i_block[14]同理。

這里面有一個(gè)非常顯著的問(wèn)題,對(duì)于大文件來(lái)講,我們要多次讀取硬盤(pán)才能找到相應(yīng)的塊,這樣訪問(wèn)速度就會(huì)比較慢。

為了解決這個(gè)問(wèn)題,ext4做了一定的改變。它引入了一個(gè)新的概念,叫作Extents。比方說(shuō),一個(gè)文件大小為128M,如果使用4k大小的塊進(jìn)行存儲(chǔ),需要32k個(gè)塊。如果按照ext2或者ext3那樣散著放,數(shù)量太大了。但是Extents可以用于存放連續(xù)的塊,也就是說(shuō),我們可以把128M放在一個(gè)Extents里面。這樣的話,對(duì)大文件的讀寫(xiě)性能提高了,文件碎片也減少了。

Exents是一個(gè)樹(shù)狀結(jié)構(gòu):

每個(gè)節(jié)點(diǎn)都有一個(gè)頭,ext4_extent_header可以用來(lái)描述某個(gè)節(jié)點(diǎn)。

struct?ext4_extent_header?{
????__le16??eh_magic;???/*?probably?will?support?different?formats?*/
????__le16??eh_entries;?/*?number?of?valid?entries?*/
????__le16??eh_max;?????/*?capacity?of?store?in?entries?*/
????__le16??eh_depth;???/*?has?tree?real?underlying?blocks??*/
????__le32??eh_generation;??/*?generation?of?the?tree?*/
};

eh_entries表示這個(gè)節(jié)點(diǎn)里面有多少項(xiàng)。這里的項(xiàng)分兩種,如果是葉子節(jié)點(diǎn),這一項(xiàng)會(huì)直接指向硬盤(pán)上的連續(xù)塊的地址,我們稱為數(shù)據(jù)節(jié)點(diǎn)ext4_extent;如果是分支節(jié)點(diǎn),這一項(xiàng)會(huì)指向下一層的分支節(jié)點(diǎn)或者葉子節(jié)點(diǎn),我們稱為索引節(jié)點(diǎn)ext4_extent_idx。這兩種類型的項(xiàng)的大小都是12個(gè)byte。

/*
?*?This?is?the?extent?on-disk?structure.
?*?It's?used?at?the?bottom?of?the?tree.
?*/

struct?ext4_extent?{
????__le32??ee_block;???/*?first?logical?block?extent?covers?*/
????__le16??ee_len;?????/*?number?of?blocks?covered?by?extent?*/
????__le16??ee_start_hi;????/*?high?16?bits?of?physical?block?*/
????__le32??ee_start_lo;????/*?low?32?bits?of?physical?block?*/
};
/*
?*?This?is?index?on-disk?structure.
?*?It's?used?at?all?the?levels?except?the?bottom.
?*/

struct?ext4_extent_idx?{
????__le32??ei_block;???/*?index?covers?logical?blocks?from?'block'?*/
????__le32??ei_leaf_lo;?/*?pointer?to?the?physical?block?of?the?next?*
?????????????????*?level.?leaf?or?next?index?could?be?there?*/

????__le16??ei_leaf_hi;?/*?high?16?bits?of?physical?block?*/
????__u16???ei_unused;
};

如果文件不大,inode里面的i_block中,可以放得下一個(gè)ext4_extent_header和4項(xiàng)ext4_extent。所以這個(gè)時(shí)候,eh_depth為0,也即inode里面的就是葉子節(jié)點(diǎn),樹(shù)高度為0。

如果文件比較大,4個(gè)extent放不下,就要分裂成為一棵樹(shù),eh_depth>0的節(jié)點(diǎn)就是索引節(jié)點(diǎn),其中根節(jié)點(diǎn)深度最大,在inode中。最底層eh_depth=0的是葉子節(jié)點(diǎn)。

除了根節(jié)點(diǎn),其他的節(jié)點(diǎn)都保存在一個(gè)塊4k里面,4k扣除ext4_extent_header的12個(gè)byte,剩下的能夠放340項(xiàng),每個(gè)extent最大能表示128MB的數(shù)據(jù),340個(gè)extent會(huì)使你的表示的文件達(dá)到42.5GB。

inode位圖和塊位圖

inode的位圖大小為4k,每一位對(duì)應(yīng)一個(gè)inode。如果是1,表示這個(gè)inode已經(jīng)被用了;如果是0,則表示沒(méi)被用。block的位圖同理。

在Linux操作系統(tǒng)里面,想要?jiǎng)?chuàng)建一個(gè)新文件,會(huì)調(diào)用open函數(shù),并且參數(shù)會(huì)有O_CREAT。這表示當(dāng)文件找不到的時(shí)候,我們就需要?jiǎng)?chuàng)建一個(gè)。那么open函數(shù)的調(diào)用過(guò)程大致是:要打開(kāi)一個(gè)文件,先要根據(jù)路徑找到文件夾。如果發(fā)現(xiàn)文件夾下面沒(méi)有這個(gè)文件,同時(shí)又設(shè)置了O_CREAT,就說(shuō)明我們要在這個(gè)文件夾下面創(chuàng)建一個(gè)文件。

創(chuàng)建一個(gè)文件,那么就需要?jiǎng)?chuàng)建一個(gè)inode,那么就會(huì)從文件系統(tǒng)里面讀取inode位圖,然后找到下一個(gè)為0的inode,就是空閑的inode。對(duì)于block位圖,在寫(xiě)入文件的時(shí)候,也會(huì)有這個(gè)過(guò)程。

文件系統(tǒng)的格式

數(shù)據(jù)塊的位圖是放在一個(gè)塊里面的,共4k。每位表示一個(gè)數(shù)據(jù)塊,共可以表示個(gè)數(shù)據(jù)塊。如果每個(gè)數(shù)據(jù)塊也是按默認(rèn)的4K,最大可以表示空間為個(gè)byte,也就是128M,那么顯然是不夠的。

這個(gè)時(shí)候就需要用到塊組,數(shù)據(jù)結(jié)構(gòu)為ext4_group_desc,這里面對(duì)于一個(gè)塊組里的inode位圖bg_inode_bitmap_lo、塊位圖bg_block_bitmap_lo、inode列表bg_inode_table_lo,都有相應(yīng)的成員變量。

這樣一個(gè)個(gè)塊組,就基本構(gòu)成了我們整個(gè)文件系統(tǒng)的結(jié)構(gòu)。因?yàn)閴K組有多個(gè),塊組描述符也同樣組成一個(gè)列表,我們把這些稱為塊組描述符表。

我們還需要有一個(gè)數(shù)據(jù)結(jié)構(gòu),對(duì)整個(gè)文件系統(tǒng)的情況進(jìn)行描述,這個(gè)就是超級(jí)塊ext4_super_block。里面有整個(gè)文件系統(tǒng)一共有多少inode,s_inodes_count;一共有多少塊,s_blocks_count_lo,每個(gè)塊組有多少inode,s_inodes_per_group,每個(gè)塊組有多少塊,s_blocks_per_group等。這些都是這類的全局信息。

最終,整個(gè)文件系統(tǒng)格式就是下面這個(gè)樣子。

默認(rèn)情況下,超級(jí)塊和塊組描述符表都有副本保存在每一個(gè)塊組里面。防止這些數(shù)據(jù)丟失了,導(dǎo)致整個(gè)文件系統(tǒng)都打不開(kāi)了。

由于如果每個(gè)塊組里面都保存一份完整的塊組描述符表,一方面很浪費(fèi)空間;另一個(gè)方面,由于一個(gè)塊組最大128M,而塊組描述符表里面有多少項(xiàng),這就限制了有多少個(gè)塊組,128M * 塊組的總數(shù)目是整個(gè)文件系統(tǒng)的大小,就被限制住了。

因此引入Meta Block Groups特性。

首先,塊組描述符表不會(huì)保存所有塊組的描述符了,而是將塊組分成多個(gè)組,我們稱為元塊組(Meta Block Group)。每個(gè)元塊組里面的塊組描述符表僅僅包括自己的,一個(gè)元塊組包含64個(gè)塊組,這樣一個(gè)元塊組中的塊組描述符表最多64項(xiàng)。

我們假設(shè)一共有256個(gè)塊組,原來(lái)是一個(gè)整的塊組描述符表,里面有256項(xiàng),要備份就全備份,現(xiàn)在分成4個(gè)元塊組,每個(gè)元塊組里面的塊組描述符表就只有64項(xiàng)了,這就小多了,而且四個(gè)元塊組自己備份自己的。

根據(jù)圖中,每一個(gè)元塊組包含64個(gè)塊組,塊組描述符表也是64項(xiàng),備份三份,在元塊組的第一個(gè),第二個(gè)和最后一個(gè)塊組的開(kāi)始處。

如果開(kāi)啟了sparse_super特性,超級(jí)塊和塊組描述符表的副本只會(huì)保存在塊組索引為0、3、5、7的整數(shù)冪里。所以上圖的超級(jí)塊只在索引為0、3、5、7等的整數(shù)冪里。

目錄的存儲(chǔ)格式

其實(shí)目錄本身也是個(gè)文件,也有inode。inode里面也是指向一些塊。和普通文件不同的是,普通文件的塊里面保存的是文件數(shù)據(jù),而目錄文件的塊里面保存的是目錄里面一項(xiàng)一項(xiàng)的文件信息。這些信息我們稱為ext4_dir_entry。

在目錄文件的塊中,最簡(jiǎn)單的保存格式是列表,每一項(xiàng)都會(huì)保存這個(gè)目錄的下一級(jí)的文件的文件名和對(duì)應(yīng)的inode,通過(guò)這個(gè)inode,就能找到真正的文件。第一項(xiàng)是“.”,表示當(dāng)前目錄,第二項(xiàng)是“…”,表示上一級(jí)目錄,接下來(lái)就是一項(xiàng)一項(xiàng)的文件名和inode。

如果在inode中設(shè)置EXT4_INDEX_FL標(biāo)志,那么就表示根據(jù)索引查找文件。索引項(xiàng)會(huì)維護(hù)一個(gè)文件名的哈希值和數(shù)據(jù)塊的一個(gè)映射關(guān)系。

如果我們要查找一個(gè)目錄下面的文件名,可以通過(guò)名稱取哈希。如果哈希能夠匹配上,就說(shuō)明這個(gè)文件的信息在相應(yīng)的塊里面。然后打開(kāi)這個(gè)塊,如果里面不再是索引,而是索引樹(shù)的葉子節(jié)點(diǎn)的話,那里面還是ext4_dir_entry的列表,我們只要一項(xiàng)一項(xiàng)找文件名就行。通過(guò)索引樹(shù),我們可以將一個(gè)目錄下面的N多的文件分散到很多的塊里面,可以很快地進(jìn)行查找。

Linux中的文件緩存

ext4文件系統(tǒng)層

對(duì)于ext4文件系統(tǒng)來(lái)講,內(nèi)核定義了一個(gè)ext4_file_operations。

const?struct?file_operations?ext4_file_operations?=?{
......
????.read_iter??=?ext4_file_read_iter,
????.write_iter?=?ext4_file_write_iter,
......
}

ext4_file_read_iter會(huì)調(diào)用generic_file_read_iter,ext4_file_write_iter會(huì)調(diào)用__generic_file_write_iter。

ssize_t
generic_file_read_iter(struct?kiocb?*iocb,?struct?iov_iter?*iter)
{
......
????if?(iocb->ki_flags?&?IOCB_DIRECT)?{
......
????????struct?address_space?*mapping?=?file->f_mapping;
......
????????retval?=?mapping->a_ops->direct_IO(iocb,?iter);
????}
......
????retval?=?generic_file_buffered_read(iocb,?iter,?retval);
}


ssize_t?__generic_file_write_iter(struct?kiocb?*iocb,?struct?iov_iter?*from)
{
......
????if?(iocb->ki_flags?&?IOCB_DIRECT)?{
......
????????written?=?generic_file_direct_write(iocb,?from);
......
????}?else?{
......
????????written?=?generic_perform_write(file,?from,?iocb->ki_pos);
......
????}
}

generic_file_read_iter和__generic_file_write_iter有相似的邏輯,就是要區(qū)分是否用緩存。因此,根據(jù)是否使用內(nèi)存做緩存,我們可以把文件的I/O操作分為兩種類型。

第一種類型是緩存I/O。大多數(shù)文件系統(tǒng)的默認(rèn)I/O操作都是緩存I/O。對(duì)于讀操作來(lái)講,操作系統(tǒng)會(huì)先檢查,內(nèi)核的緩沖區(qū)有沒(méi)有需要的數(shù)據(jù)。如果已經(jīng)緩存了,那就直接從緩存中返回;否則從磁盤(pán)中讀取,然后緩存在操作系統(tǒng)的緩存中。對(duì)于寫(xiě)操作來(lái)講,操作系統(tǒng)會(huì)先將數(shù)據(jù)從用戶空間復(fù)制到內(nèi)核空間的緩存中。這時(shí)對(duì)用戶程序來(lái)說(shuō),寫(xiě)操作就已經(jīng)完成。至于什么時(shí)候再寫(xiě)到磁盤(pán)中由操作系統(tǒng)決定,除非顯式地調(diào)用了sync同步命令。

第二種類型是直接IO,就是應(yīng)用程序直接訪問(wèn)磁盤(pán)數(shù)據(jù),而不經(jīng)過(guò)內(nèi)核緩沖區(qū),從而減少了在內(nèi)核緩存和用戶程序之間數(shù)據(jù)復(fù)制。

如果在寫(xiě)的邏輯__generic_file_write_iter里面,發(fā)現(xiàn)設(shè)置了IOCB_DIRECT,則調(diào)用generic_file_direct_write,里面同樣會(huì)調(diào)用address_space的direct_IO的函數(shù),將數(shù)據(jù)直接寫(xiě)入硬盤(pán)。

帶緩存的寫(xiě)入操作

我們先來(lái)看帶緩存寫(xiě)入的函數(shù)generic_perform_write。

ssize_t?generic_perform_write(struct?file?*file,
????????????????struct?iov_iter?*i,?loff_t?pos)
{
????struct?address_space?*mapping?=?file->f_mapping;
????const?struct?address_space_operations?*a_ops?=?mapping->a_ops;
????do?{
????????struct?page?*page;
????????unsigned?long?offset;???/*?Offset?into?pagecache?page?*/
????????unsigned?long?bytes;????/*?Bytes?to?write?to?page?*/
????????status?=?a_ops->write_begin(file,?mapping,?pos,?bytes,?flags,
????????????????????????&page,?&fsdata);
????????copied?=?iov_iter_copy_from_user_atomic(page,?i,?offset,?bytes);
????????flush_dcache_page(page);
????????status?=?a_ops->write_end(file,?mapping,?pos,?bytes,?copied,
????????????????????????page,?fsdata);
????????pos?+=?copied;
????????written?+=?copied;


????????balance_dirty_pages_ratelimited(mapping);
????}?while?(iov_iter_count(i));
}

循環(huán)中主要做了這幾件事:

  • 對(duì)于每一頁(yè),先調(diào)用address_space的write_begin做一些準(zhǔn)備;

  • 調(diào)用iov_iter_copy_from_user_atomic,將寫(xiě)入的內(nèi)容從用戶態(tài)拷貝到內(nèi)核態(tài)的頁(yè)中;

  • 調(diào)用address_space的write_end完成寫(xiě)操作;

  • 調(diào)用balance_dirty_pages_ratelimited,看臟頁(yè)是否太多,需要寫(xiě)回硬盤(pán)。所謂臟頁(yè),就是寫(xiě)入到緩存,但是還沒(méi)有寫(xiě)入到硬盤(pán)的頁(yè)面。

對(duì)于第一步,調(diào)用的是ext4_write_begin來(lái)說(shuō),主要做兩件事:

第一做日志相關(guān)的工作。

ext4是一種日志文件系統(tǒng),是為了防止突然斷電的時(shí)候的數(shù)據(jù)丟失,引入了日志(Journal)模式。日志文件系統(tǒng)比非日志文件系統(tǒng)多了一個(gè)Journal區(qū)域。文件在ext4中分兩部分存儲(chǔ),一部分是文件的元數(shù)據(jù),另一部分是數(shù)據(jù)。元數(shù)據(jù)和數(shù)據(jù)的操作日志Journal也是分開(kāi)管理的。你可以在掛載ext4的時(shí)候,選擇Journal模式。這種模式在將數(shù)據(jù)寫(xiě)入文件系統(tǒng)前,必須等待元數(shù)據(jù)和數(shù)據(jù)的日志已經(jīng)落盤(pán)才能發(fā)揮作用。這樣性能比較差,但是最安全。

另一種模式是order模式。這個(gè)模式不記錄數(shù)據(jù)的日志,只記錄元數(shù)據(jù)的日志,但是在寫(xiě)元數(shù)據(jù)的日志前,必須先確保數(shù)據(jù)已經(jīng)落盤(pán)。這個(gè)折中,是默認(rèn)模式。

還有一種模式是writeback,不記錄數(shù)據(jù)的日志,僅記錄元數(shù)據(jù)的日志,并且不保證數(shù)據(jù)比元數(shù)據(jù)先落盤(pán)。這個(gè)性能最好,但是最不安全。

第二調(diào)用grab_cache_page_write_begin來(lái),得到應(yīng)該寫(xiě)入的緩存頁(yè)。

struct?page?*grab_cache_page_write_begin(struct?address_space?*mapping,
????????????????????pgoff_t?index,?unsigned?flags)

{
????struct?page?*page;
????int?fgp_flags?=?FGP_LOCK|FGP_WRITE|FGP_CREAT;
????page?=?pagecache_get_page(mapping,?index,?fgp_flags,
????????????mapping_gfp_mask(mapping));
????if?(page)
????????wait_for_stable_page(page);
????return?page;
}

在內(nèi)核中,緩存以頁(yè)為單位放在內(nèi)存里面,每一個(gè)打開(kāi)的文件都有一個(gè)struct file結(jié)構(gòu),每個(gè)struct file結(jié)構(gòu)都有一個(gè)struct address_space用于關(guān)聯(lián)文件和內(nèi)存,就是在這個(gè)結(jié)構(gòu)里面,有一棵樹(shù),用于保存所有與這個(gè)文件相關(guān)的的緩存頁(yè)。

對(duì)于第二步,調(diào)用iov_iter_copy_from_user_atomic。先將分配好的頁(yè)面調(diào)用kmap_atomic映射到內(nèi)核里面的一個(gè)虛擬地址,然后將用戶態(tài)的數(shù)據(jù)拷貝到內(nèi)核態(tài)的頁(yè)面的虛擬地址中,調(diào)用kunmap_atomic把內(nèi)核里面的映射刪除。

size_t?iov_iter_copy_from_user_atomic(struct?page?*page,
????????struct?iov_iter?*i,?unsigned?long?offset,?size_t?bytes)
{
????char?*kaddr?=?kmap_atomic(page),?*p?=?kaddr?+?offset;
????iterate_all_kinds(i,?bytes,?v,
????????copyin((p?+=?v.iov_len)?-?v.iov_len,?v.iov_base,?v.iov_len),
????????memcpy_from_page((p?+=?v.bv_len)?-?v.bv_len,?v.bv_page,
?????????????????v.bv_offset,?v.bv_len),
????????memcpy((p?+=?v.iov_len)?-?v.iov_len,?v.iov_base,?v.iov_len)
????)
????kunmap_atomic(kaddr);
????return?bytes;
}

第三步中,調(diào)用ext4_write_end完成寫(xiě)入。這里面會(huì)調(diào)用ext4_journal_stop完成日志的寫(xiě)入,會(huì)調(diào)用block_write_end->__block_commit_write->mark_buffer_dirty,將修改過(guò)的緩存標(biāo)記為臟頁(yè)。可以看出,其實(shí)所謂的完成寫(xiě)入,并沒(méi)有真正寫(xiě)入硬盤(pán),僅僅是寫(xiě)入緩存后,標(biāo)記為臟頁(yè)。

第四步,調(diào)用 balance_dirty_pages_ratelimited,是回寫(xiě)臟頁(yè)。

/**
?*?balance_dirty_pages_ratelimited?-?balance?dirty?memory?state
?*?@mapping:?address_space?which?was?dirtied
?*
?*?Processes?which?are?dirtying?memory?should?call?in?here?once?for?each?page
?*?which?was?newly?dirtied.??The?function?will?periodically?check?the?system's
?*?dirty?state?and?will?initiate?writeback?if?needed.
??*/

void?balance_dirty_pages_ratelimited(struct?address_space?*mapping)
{
????struct?inode?*inode?=?mapping->host;
????struct?backing_dev_info?*bdi?=?inode_to_bdi(inode);
????struct?bdi_writeback?*wb?=?NULL;
????int?ratelimit;
......
????if?(unlikely(current->nr_dirtied?>=?ratelimit))
????????balance_dirty_pages(mapping,?wb,?current->nr_dirtied);
......
}

在balance_dirty_pages_ratelimited里面,發(fā)現(xiàn)臟頁(yè)的數(shù)目超過(guò)了規(guī)定的數(shù)目,就調(diào)用balance_dirty_pages->wb_start_background_writeback,啟動(dòng)一個(gè)背后線程開(kāi)始回寫(xiě)。

另外還有幾種場(chǎng)景也會(huì)觸發(fā)回寫(xiě):

  • 用戶主動(dòng)調(diào)用sync,將緩存刷到硬盤(pán)上去,最終會(huì)調(diào)用wakeup_flusher_threads,同步臟頁(yè);

  • 當(dāng)內(nèi)存十分緊張,以至于無(wú)法分配頁(yè)面的時(shí)候,會(huì)調(diào)用free_more_memory,最終會(huì)調(diào)用wakeup_flusher_threads,釋放臟頁(yè);

  • 臟頁(yè)已經(jīng)更新了較長(zhǎng)時(shí)間,時(shí)間上超過(guò)了設(shè)定時(shí)間,需要及時(shí)回寫(xiě),保持內(nèi)存和磁盤(pán)上數(shù)據(jù)一致性。

帶緩存的讀操作

看帶緩存的讀,對(duì)應(yīng)的是函數(shù)generic_file_buffered_read。

static?ssize_t?generic_file_buffered_read(struct?kiocb?*iocb,
????????struct?iov_iter?*iter,?ssize_t?written)

{
????struct?file?*filp?=?iocb->ki_filp;
????struct?address_space?*mapping?=?filp->f_mapping;
????struct?inode?*inode?=?mapping->host;
????for?(;;)?{
????????struct?page?*page;
????????pgoff_t?end_index;
????????loff_t?isize;
????????page?=?find_get_page(mapping,?index);
????????if?(!page)?{
????????????if?(iocb->ki_flags?&?IOCB_NOWAIT)
????????????????goto?would_block;
????????????page_cache_sync_readahead(mapping,
????????????????????ra,?filp,
????????????????????index,?last_index?-?index);
????????????page?=?find_get_page(mapping,?index);
????????????if?(unlikely(page?==?NULL))
????????????????goto?no_cached_page;
????????}
????????if?(PageReadahead(page))?{
????????????page_cache_async_readahead(mapping,
????????????????????ra,?filp,?page,
????????????????????index,?last_index?-?index);
????????}
????????/*
?????????*?Ok,?we?have?the?page,?and?it's?up-to-date,?so
?????????*?now?we?can?copy?it?to?user?space...
?????????*/

????????ret?=?copy_page_to_iter(page,?offset,?nr,?iter);
????}
}

在generic_file_buffered_read函數(shù)中,我們需要先找到page cache里面是否有緩存頁(yè)。如果沒(méi)有找到,不但讀取這一頁(yè),還要進(jìn)行預(yù)讀,這需要在page_cache_sync_readahead函數(shù)中實(shí)現(xiàn)。預(yù)讀完了以后,再試一把查找緩存頁(yè)。

如果第一次找緩存頁(yè)就找到了,我們還是要判斷,是不是應(yīng)該繼續(xù)預(yù)讀;如果需要,就調(diào)用page_cache_async_readahead發(fā)起一個(gè)異步預(yù)讀。

最后,copy_page_to_iter會(huì)將內(nèi)容從內(nèi)核緩存頁(yè)拷貝到用戶內(nèi)存空間。

良許個(gè)人微信


添加良許個(gè)人微信即送3套程序員必讀資料


→ 精選技術(shù)資料共享

→ 高手如云交流社群





本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲??!

推薦閱讀:

優(yōu)麒麟20.10終極預(yù)告,界面比較養(yǎng)眼

世界上最難的5種編程語(yǔ)言

吳恩達(dá)給 74 歲老父親發(fā)證了!8 年完成 146 門(mén)課程!


5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲?。?!


瀏覽 39
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩在线高清视频| 国产插穴| 免费国产成人看片在线| 69AV网站| 一级a片在线| 无码秘蜜桃一区二区| 99久久精品国产一区色| 97人妻人人揉人人躁人人| 亚洲人操逼视频| h网站在线看| 超碰在线播| 国产喷潮| 亚洲不卡| 狠久久| 亚洲激情综合网| 一区二区三区四区视频在线| 超碰人人网| 国产无码AV成在线| 激情五月天激情网| 欧美久色| 精品人妻中文字幕视频| 色婷婷天天操天天干| 农村A片婬片AAA毛片| 午夜免费视频1000| 日韩色综合| 97天天干| 黄色精品网站| 日本在线一区| 国产精品日韩高清北条麻衣| 亚洲性爱小说网址| 国产激情综合在线| 香蕉国产精品| 成人视频高清无码| 日日干天天日| 国产叼嘿视频| 木牛AV| 日韩一级片| 17.3c一起起草| 无码一二三区| 欧美日韩一级视频| 色片视频| 丁香五月社区| 口爆吞精在线| 亚洲国产黄色视频| 天天日夜夜草| 一级性爽A√毛片| 日韩欧美成人在线观看| 97国产精品久久| 一级a免一级a做免费线看内裤| 麻豆熟妇乱妇熟色A片在线看| 欧美性爱在线网站| 人人妻人人做| 中文字幕在线播放AV| 精品国产免费观看久久久_久久天天 | 资源av| 爱爱爱网址| 国产高清AV在线| a亚洲a| 一级片AA| 亚洲网站免费在线观看| 免费观看的av| 免费的a片| 婷婷在线观看免费| 无码人妻免费视频| 青青草视频免费在线观看| 欧美喷水视频| 日韩AV无码专区亚洲AV紧身裤 | 五月六月丁香激情视频| 亚洲AV无码一区毛片AV| 天天视频狠狠狠狠| 国产成人高清在线| 影音先锋成人视频| 久久6热| 新狠狠干| 农村一级婬片A片| 高清操逼| 日本高清中文字幕| 美女在线扣穴| 亚洲最新无码视频| 欧美色图亚洲另类| 久操B| 婷婷五月六月| 99久久亚洲精品日本无码| 走光无码一区二区三区| 91久久人澡人妻人人澡人人爽 | 日本黄色免费网站| 日逼片| 日本AI高清无码在线观看网址| 亚洲无码高清视频| 极品美女援交在线| 亚洲天堂2014| 一道本视频在线| 免费观看黄色成人网站| 亚洲国产精| 伊人三级片| xxxxx无码| 色操逼网| 99久久婷婷国产综合| 蜜桃人妻无码| 91在线无码精品在线看| 天天日天天操天天摸天天干天日射天天插 | 超碰九九热| 国产无码AV成在线| 国内精品内射| 男人的天堂在线播放| 一二三四区视频| 99视频这里有精品| 欧美久久精品| 午夜A区| 亚洲操片| 日韩AV无码电影| 亚洲成人一区二区三区| 国产成人精品视频| 91大神免费在线观看| 亚洲婷婷小说| 日本操屄视频| 91高潮久久久久久久| 伊人久久成人| 99热这里只有精品7| 久久精品视频网站| 色婷婷在线无码精品秘人口传媒 | 五月婷婷色| 翔田千里被躁120分钟| 午夜精品久久久久久久久无码99热 | 韩国色情中文字幕| 特级特黄A级高潮播放| 亚洲欧洲久久| 青青操日日干| 无码AV网| 一本道视频在线| 超碰天天爱| 国产精品国产成人国产三级| 久久er| 大香蕉av一区二区三区在线观看 | 一级黄色蜜芽视频| 黄片91| 黄页网站视频| 2018中文字幕第一页| 国产videos| 久久久蜜桃| 激情视频在线免费观看| 逼网站| 中文字幕在线第一页| 阿宾MD0165麻豆沈娜娜| 亚洲精品A片| 三须三级久久三级久久18| 超碰青青青| 国产综合一区二区| 亚洲AV无码成人精品区大猫| 国产视频你懂的| 人人看人人摸人人操| 五月天青青草超碰免费公开在线观看| 日韩va亚洲va欧美va高清| 午夜成人精品一区二区三区| 亚洲成a人| 超碰人人网| 中文字幕不卡一区| 久热在线| 无码任你躁久久久久| 久久午夜鲁丝| 88色色| 国产嫩苞又嫩又紧AV在线| 中文字幕五月久久| 強姧伦一区二区三区在线播放| 大香蕉在线观看视频| 国产精品久久久无码专区| 久久婷婷热| 中文字幕日本成人| 亚洲无码在线视频观看| 亚洲高清无码中文字幕| 色妹子综合| 久久久精品电影91| 欧美成人69| 日韩精品一区在线| 亚洲av免费看| 亚洲无码在线播放| 中文字幕观看av| 色婷婷激情在线| 国产乱子伦一区二区三区免看| 国产精品一级a毛一级a| 国产三级片在线免费观看| a片在线免费观看| 91国产福利| 日韩做爱网站| www.五月丁香| 刘玥91精一区二区三区| 亚洲一区二区在线| 99精品一区二区| 免费无码毛片一区二区A片| 狠狠躁18三区二区一区免费人| 在线黄| 欧美三级片网站| 日本少妇激情视频| 狠狠操2019| 99久久99久久| 黄色视频网站免费| 亚洲中文字幕播放| 婷婷开心色四房播播在线| 国产麻豆精品ThePorn| 天堂网中文字幕| 日韩人妻丝袜中文字幕| 午夜AV无码| 最近日韩中文字幕中文翻译歌词| 开心色播五月天| 久久天天拍| 婷婷五月AV| 大香蕉超碰| 欧美婷婷五月| 爱就色色网| av在线直播| 欧美视频免费| 69AV视频网站| 天天天天天天天操| 黄片一区二区三区| 操操影院| 日韩欧美日韩| 欧洲美一区二区三区亚洲| 国产成人av网站| 国产精品黄色| 亚洲天堂在线免费观看视频| 亚洲小视频在线播放| sesese999| 99性视频| 国产av中文| 亚洲AV成人无码精品直播在线| 日逼视频免费看| 中国毛片网站| 色欲网址| 小處女末发育嫩苞AV| 国产欧美在线综合| 久久久久久久9999| 久久免费国产视频| 成人三区| 国产日韩欧美成人| 先锋影音av资源站| 欧美丰满人妻免费视频人| 欧美日韩四区| 欧日韩在线| 毛片视频网站| 成人色播播| 免费视频99| 热热AV| 国产三级在线观看| 亚洲天堂一| 爱爱视频h| 成人A片视频| 超碰2021| 99re免费视频| 人妻人人操| 竹菊av一区二区三区四区五区| 喷潮视频| 国内老熟妇对白XXXXHD| 五月丁香人妻| 日韩怡春院| 尤物视频在线播放| 久久久国产AV| 午夜精品电影| 中文字幕永久在线| 色色五月丁香| 中文字幕人妻互换av久久| 兔子先生和優奈玩游戲脫衣服,運氣報表優奈輸到脫精光 | 精品多人P群无码视频| 欧美人妻日韩精品| 午夜激情在线观看| 伊人啪啪| 2022黄片| 一级黄片免费看| 一级黄片免费视频| 热久久精品| 韩国色情中文字幕| 色国产在线视频| 亚洲欧美在线播放| 69视频在线免费观看| 91精品国产一区二区| 特级西西WWW888| 精品一区二| 国产精品午夜福利视频| 黄色无码视频| 91爱搞在线| 日韩精品三级片| 国产色黄视频| 伊人精品在线| 亚洲AV免费在线观看| 国产乱色精品成人免费视频| 婷婷六月综合| 被男友内S~高H文| 色小说在线| 无码av网站| 日韩18在线| 亚洲高清无码一区二区三区| 大香蕉av一区二区三区在线观看 | 无码人妻一区二区三一区免费n狂飙 | www.激情| 大鸡吧成人视频| 久久熟女| 久久久亚洲无码| 免费国产黄色视频网站| 性爱二区| 国产成人毛片18女人18精品| 亚洲无码手机在线观看| 国产欧美一区二区三区视频| 少妇av| 91探花足浴店少妇在线| 蝌蚪窝在线视频观看| 三级视频网| 91麻豆精品91久久久久同性| 无码专区在线观看| 免费无码视频| 无码人妻一区二区三区在线视频不卡| 波多野结衣av无码| 亚洲AV电影在线| 北条麻妃网站| 日韩在线高清视频| 国产娇小13videos糟蹋| 久久成人三级| 五月天高清无码| 欧美日韩视频在线| 88无码| 日本黄色三级片| 九九成人精品| 国产成人免费在线| www.操B| 黄色视频一级| free性欧美| 国产精品久久久精品cos| 色卻A| 丰满的人妻一区二区10| 日韩三级AV| 亚洲中文在线观看| 亚洲精品乱码久久久久久久| 日韩高清无码中文字幕| 久草网在线观看| 91精品国产麻豆国产自产在线 | 亚洲性爱影院| 欧美黄片免费视频| 老熟女91| 日韩成人精品| 乱伦AV片| www.bbbb| 成人福利电影| 爱爱毛片| 潮喷AV| 国产午夜在线观看| 亚洲精品秘一区二区三区蜜桃久 | 成人高清无码视频| 美女啪啪网站| 激情丁香六月| 丰满少妇一级片| 久久国内| 久久A√一区二区| 日韩操操操| 欧美福利电影| 99热99在线| 91国产人妻| 午夜无码精品一区二区三区99午| 久草三级片| 久操视频在线免费观看| www.无码视频| 日韩色网站| 免费看污网站| 特级特黄AAAAAAAA片| 91无码精品国产AⅤ| 无码高清一区二区| 免费在线观看一区| 亚洲精品久久久久中文字幕二区| 欧美日韩一区二区三区四区| 先锋影音资源站| 亚洲男人的天堂视频网在线观看+720P | 看90后操B| 有码一区二区三区| 国产精品无码一区二区三| 免费无人区一码二码乱码怎么办 | 欧美aⅴ| 五月婷婷六月丁香| 黄视频在线观看免费| 午夜精品久久久久久久久久久久| 国产精品免费一区二区三区都可以| 中文字幕资源站| 热久久中文字幕| 欧美XX888做受| 2017人人操| xxxxxbbbbb| 国产xxxx| 日韩欧美一级视频| 97热| 欧美日韩中文字幕| 欧美成人综合一区| 成人网视频| 人人看人人摸人人草| 国产激倩都市一区二区三区欧美 | 国产麻豆| 亚洲无码AV片| av色站| av片在线免费观看| 欧美日韩a片| 在线观看黄色小视频| 亚洲无码专区视频| 长泽梓黑人初解禁BDD07| 日韩A∨视频| www.91超碰在线| 成人免费无码婬片在线观看免费 | 18禁看网站| 国产精品揄拍一区二区| 91首页| 九九九热精品| 99精品人妻| 成人综合娱乐网| 午夜操一操| 九九久久99| 一级a一级a爱片兔兔软件| 人人妻人人澡人人爽人人DVD| 成人免费视频一区二区三区| 国产无码av| 国产精品免费一区二区三区都可以| 欧美精品操逼| 一级A片免费观看| 亚洲精品视频免费在线观看| 天天日天天操天天| 国产精彩视频| 亚洲.www| 91国黄色毛片在线观看| 爱逼av| 中文字幕一区二区三区人妻电影| 天天插天天干| 91久久成人| 大黑逼AV| 一级免费黄片| 黄色电影A| 中文字幕资源站| 日韩在线综合| 免费看黄色视频的网站| 怡春院熟女精品AV| 在线免费观看毛片| 国产性色AV| 影音先锋中文字幕资源| 极品人妻疯狂3p超刺激| 青娱乐成人电影| 中文字幕观看av| 成人做爰黄AA片免费看三区| 成人小说亚洲一区二区三区| 大香蕉一级红色片青青河边草| 亚洲综合天堂| 日韩精品一区二区亚洲AV观看| 东方美美高清无码一区| 91久久香蕉囯产熟女线看蜜桃| 色色五月丁香| 特黄AAAAAAAA片视频| 日本A片免费看| 欧美性生交18XXXXX无码| 久久久3| 日韩综合久久| 麻豆精品无码| 亚洲AV无码日韩AV无码导航| A级网站| 日韩欧美成人在线观看| 日韩一区二区三区在线视频| 国产a视频| 北条麻妃在线中文字幕| 人人操夜夜爽| 91欧美黑人| 日韩激情无码一区二区| 蜜桃视频com.www| 日韩一区二区三免费高清在线观看| 亚洲三级片在线视频| 97精品欧美91久久久久久久| 国产91黄色| 免费无码国产在线53| 各国熟女HD合集| 91人妻人人澡人人爽人人DVD| 性感91影院| 美女自慰网站在线观看| 日本在线无码| 人操人人人操| 亚洲AV成人片无码网站| 成人h视频| 日韩一区二区三区无码电影| 国产黄片自拍| 欧美a视频| 三级片中文| 一级a免费| 日韩中字无码黄片| 在线观看日本vs欧洲vs美洲| 人妻无码中文字幕蜜桃| 丁香婷婷色五月激情综合三级三级片欧美日韩国 | 久久久久黄色| 人人操美女| 免费无遮挡视频网站视频| 人人做人人爱人人做人人乐的意思| 欧美黄色网址| 国产亚洲精品成人a| 丰满少妇一级片| 亚洲久久无码| 超碰2025| 青青草性爱| 欧一美一伦一A片| 一本道无码在线观看| 日韩午夜福利| 麻豆精品传媒2021md| 伊人激情影院| 欧美日韩成人| 国产欧美综合视频| 免费在线观看无码视频| 亚洲AV无码黑人专区| 靠比免费| 婷婷五月综合网| 欧一美一色一伦一A片| 日韩福利一区| 亚洲视频综合网| 国产福利视频在线观看| 99精品免费| 新版欧美内射大全| 先锋AV资源在线| 日日免费视频| 国产三级在线播放| 成人国产精品在线看| 久久天堂AV综合合色蜜桃网| 黄色A片网址| 最新97色黄色精品高清网站| 伊人网在线视频观看| 日本99热| 亚洲AV无码秘翔田| 三级片网页| 中文字幕在线观看福利视频| 99热欧美| 欧美在线小视频| 可以免费看的黄色| 国产亚洲网| 日本黄A级A片国产免费| 操操操操操操| 波多野结衣成人在线| 亚洲综合干| 69人人| 精品女同一区二区三区四区外站在线| 91视频免费观看| 特级无码| 婷婷五月久久| www.豆花视频成人版| 91吴梦梦无码一区二区| 欧美aⅤ| 久草黄色电影在线观看| 免费视频a| 国产一区二区成人久久919色| 最新中文字幕av| 北条麻妃中文字幕旡码| 精品国产成人| 68久久久| 国产三级片网址| 亚洲成人网在线观看| 91无码秘蜜桃一区二区三区-百度| 91吴梦梦无码一区二区| 国产特级毛片AAAAAA| 欧美爆操视频| 久久久麻豆| 成人电影一区| 看黄色一级片| 亚州视频在线| 五月天婷婷网站| 91视频电影| 伊人操逼网| 亚洲小电影| 超碰在线中文字幕| 日本高清一区| 成全在线观看高清的| 日韩性爱A片| 国产亚洲99久久精品熟女| a片在线免费| 欧美亚洲三级片| 天天澡天天爽日日AV| 日韩成人中文字幕| 青草国产| 亚洲色在线观看| 日韩无码精品一区二区三区| 手机看片国产| 日韩综合区| 九九天堂网| 中文字幕在线观看a| 欧美性爱网址| 成人做爰A片AAA毛真人| 一级色情片| 天天天天日| 丁香五月情| 操B视频免费看| 精品国精品自拍自在线| 五月丁香亚洲综合| 思思热精品在线| 老司机永久免费91| 99热1| 亚洲无码电影网| 久久无码一区二区三区| 91成人电影在线| 日韩精品人妻中文字幕第4区| 欧美在线无码| 国产精品不卡在线| 在线免费中文字幕| 日韩加勒比在线| 午夜无码福利视频| 国产成人在线精品| 91国产精品视频在线| 午夜亚洲国产一区视频网站 | 中文字幕亚洲有码| 亚洲国产高清无码| 国产精品国产| 91亚洲一线产区二线产区| 日韩人妻斩| 国产一级A| 蜜臀AV在线播放| 91AV电影网| 性爱小说视频| 老司机午夜视频| 日韩av无码电影| 色婷婷香蕉在线一区二区| 亚洲三级精品| 国产精品毛片一区视频播| 奇米四色秒播| 欧美熟妇精品一二三区| 黄片免费网站| 成人无码在线观看免费视频| 国产强伦轩免费视频在线| 强奷伦奷片91| 亚洲色久| 久草综合视频| 影音先锋AV啪啪资源| 国产精品综合激情| 麻豆免费成人视频| av资源站| 黄色AV免费| 中文字幕不卡视频| 少妇高潮喷水| 操逼网国产| 国产精品免费一区二区三区都可以 | 麻豆精品一区| 99久久99久久久精品棕色圆| 久久久久一区| 欧美色视频一区二区三区在线观看 | 黄色大片中国一级片-免费看特一级片-亚洲黄色AV| 亚洲激情网址| 加勒比在线视频| 另类老妇性bbwbbwbbw| 国产喷水ThePorn| 超碰超爽| 影视先锋成人在线| 久久久久久无码日韩欧美电影 | 人妻中文字幕av| 先锋成人电影| 91探花秘入囗| 免费观看黄片网站| 亚洲国产成人视频| 午夜在线无码| 亚洲成人av在线播放| 一级特黄毛片| 久久波多野结衣一区二区| 国产精品码ls字幕影视| 超碰操一操| 亚洲AV成人无码一区二区三区 | 久久永久免费精品人妻专区| a亚洲天堂| 六月丁香五月| 无码人妻丰满熟妇精品区| 波多野结衣高清av久久直播免 | 高清无码视频在线免费观看| 51午夜| A片在线免费看| 人人草人人草| 插插视频| 天天综合视频| 九九热精品| 黄色内射在线播放| 开心色色五月天| 人妻少妇91精品一区黑人| 天天天天天天天天干| 欧美成人一区二区三区片| 成人亚洲性情网站www在线| 亚洲视频99| 亚洲黄色激情| 在线播放高清无码| 日本午夜无码| 二区三区免费| 成人性爱在线播放| 99精品热视频| 欧美黄色毛片| 日韩在线精品| 丁香五月婷婷色| 午夜激情视频在线观看| 东京热高清无码| 国产熟妇码视频黑料| 中出欧美亚洲| 91人妻一区二区| 大香蕉伊人操| 久久久久成人视频| 丝瓜视频黄| 操逼毛片视频| 亚洲色无码| 亚洲午夜精品视频| 99免费观看视频| 做爱网| 无码人妻一区二区| 高清无码网站| 日韩av三级在线观看| 人妻三级| 影音先锋色色| 无码精品在线观看| 东京热一区二区三区四区| 美日韩一区二区三区| 精品亚洲无码视频| 大伊人久久| 伊人大香蕉久久| 中文字幕在线观看免费| 雾水情缘电影港片| 激情五月天小说网| 精品多人P群无码视频| 成人丁香五月天| 一级看片免费视频| 神马午夜福利影院| 操逼网国产| 四虎黄色网址| 国产视频中文字幕| 色视频在线观看| 波多野结衣成人网站| 99视频免费在线| 91一级片| 91丨九色丨国产在线| 影音先锋天堂网| 99热香蕉| 国产一级AAAAA片免费| 亚洲在线免费观看| 成人无码视频在线| 亚洲免费视频在线看| 污视频网站免费在线观看| 欧一美一婬一伦一区二区三区黑人-亚| 欧美成人福利| 黄片视频在线免费观看| 国产人妖视频| 国产欧美综合视频一区二区在线 | 国产香蕉视频在线观看| 中文字幕精品无码一区二区| 精精品人妻一区二区三区| 久草天堂| 俩小伙3p老熟女露脸| 成人天天爽| 日本黄色视频网| 911国产精品| 欧美一级黄色A片| 电影91久久久| 激情麻豆论坛| 天堂综合网久久| 日韩一级性爱视频| 91丨九色丨熟女新版| 天美精东蜜桃91| 大香蕉综合在线| 国产精品国内自产拍| 日本黄色视频。| 亚洲精品乱码久久久久久久| 午夜无码高清| 中文AV在线播放| 51无码| 亚洲福利天堂| 青青草视频91| 免费Av网站| 天堂综合| 天堂视频在线| 夜夜狠狠躁日日| 北岛玲丝袜办公室高跟| 免费69视频看片| 久久久综合| A片一级片| 欧美AAAAAA视频| 亚洲色香蕉| 成人亚洲欧美| 丁香五月大香蕉| 黑人毛片| 天天撸天天干天天日| 91伊人久热精品| 97精品欧美91久久久久久久| 日本不卡在线视频| 女人毛片| 91人妻人人澡人人爽人人精吕 | 男女做爱网站| 日韩无码A片| 一区二区三区精品| 人妻体体内射精一区二区| www.199麻豆在线观看网站| 色鬼综合| 永久免费一区二区三区| 激情内射| 精品视频免费在线观看| 一二区免费视频| 福利导航网| 国产在线观看免费视频今夜| 亚洲五月六月| 又色又爽| 黑人人妻黑人ThePorn| 91人妻人人澡人人精品| 少妇搡BBBB搡BBB搡毛片| 青青欧美| 大香蕉精品在线视频| 久久久久久av| 人妻无码蜜桃视频| 性色A| 色婷婷一区二区三区久久午夜| 国产AV一级片| www.在线播放| 亚洲精品高清视频| 一区二区三区四区在线播放| 99久久精品国产一区色| 午夜国产精品AV| 国产www视频| 做爰视频毛片下载蜜桃视频。| 最新AV| 欧美性爱一级视频| 日本人妻在线观看| 日本一级大毛片a一| 久色| 波多野结衣高潮| 在线观看视频你懂的| 91好爽| 女人操逼视频| 高清毛片AAAAAAAAA郊外| 国产无码黄片| 2025中文字幕| 天天爽天天做| 国产人妻AV| 久肏| 中文字幕亚洲在线| 激情五月婷婷网| 久久久久麻豆V国产精华液好用吗| 亚洲无码A片在线观看| 一本一道vs波多野结衣| 午夜欧美性爱视频| 亚洲黄片免费在线观看| 婷婷五月天视频| 十八禁网站在线观看| 婷婷激情视频| 久热精品在线观看| brazzers疯狂作爱| 在线免费中文字幕| 日韩麻豆| 日本AI高清无码在线观看网址| 精品人妻在线| 做爰视频毛片蜜桃| 九九热九九| 欧美成人在线免费| 午夜福利视频91| 国产高清无码在线| 思思热在线视频播放| 北京熟妇搡BBBB搡BBBB| av黄色在线观看| 安徽妇搡BBBB搡BBBB,另类老妇 | 香蕉久久a毛片| 久久6热| 国产美女精品视频| 亚洲黄色在线视频| 午夜免费播放观看在线视频| 亚洲精品乱码久久久久久久| 亚洲AV电影网| 四虎无码丰满人妻| 国产91久久婷婷一区二区| 农村少妇久久久久久久| 国产在线欧美在线| 天天草视频| 婷婷五月天成人电影| 狠狠躁夜夜躁人人爽人妻| 激情网站在线| 精品一二区| 操久久久久久| 激情无码精品| 欧美黑吊大战白妞| 337P大胆粉嫩噜噜噜| 亚洲精品秘一区二区三区在线观看| 大香蕉在线网| 欧一美一伦一A片| 91AV在线电影| 一级电影网| AV婷婷在线| 欧美在线网址| 亚洲成人在线播放| 国产www视频| 免费无码进口视频| 欧美精品午夜福利无码| 无码做爱视频| 日逼大片| 九月丁香| 欧美亚洲综合在线| 亚洲AV无码国产精品| 成人网站中文字幕| 亚洲成人性爱网站| 日本伊人在线综合视频| 无码砖区| 成人视频一区二区| jizz免费视频| 亚洲40p| 男人天堂网站| 色吧超碰| 蜜桃秘av一区二区三区安全| 亚洲黄色视频免费| 欧美午夜伦理| 日韩超碰| 人人爱人人操人人干| 丁香五月激情五月| 西西4444www无码精品| 操逼激情网|