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

監聽風云 | Inotify 實現原理

安全 應用安全
當用戶調用 read 或者 write 等系統調用對文件進行讀寫操作時,內核會把事件保存到 inotify_device 對象的事件隊列中,然后喚醒等待 inotify 事件的進程。

[[401919]]

本文轉載自微信公眾號「Linux內核那些事」,作者songsong001。轉載本文請聯系Linux內核那些事公眾號。

重要的數據結構

魯迅先生說過:程序 = 數據結構 + 算法

想想如果讓我們來設計 inotify 應該如何實現呢?下面來分析一下:

  • 我們知道,inotify 是用來監控文件或目錄的變動事件,所以應該定義一個對象來存儲被監聽的文件或目錄列表和它們所發生的事件列表(在內核中定義了 inotify_device 對象來存儲被監聽的文件列表和事件列表)。
  • 另外,當對被監聽的文件或目錄進行讀寫操作時會觸發相應的事件產生。所以,應該在讀寫操作相關的系統調用中嵌入產生事件的動作(在內核中由 inotify_dev_queue_event 函數產生事件)。

在介紹 inotify 的實現前,我們先來了解下其原理。inotify 的原理如下:

當用戶調用 read 或者 write 等系統調用對文件進行讀寫操作時,內核會把事件保存到 inotify_device 對象的事件隊列中,然后喚醒等待 inotify 事件的進程。正所謂一圖勝千言,所以我們通過下圖來描述此過程:

從上圖可知,當應用程序調用 read 函數讀取文件的內容時,最終會調用 inotify_dev_queue_event 函數來觸發事件,調用棧如下:

  1. read() 
  2. └→ sys_read() 
  3.    └→ vfs_read() 
  4.       └→ fsnotify_access() 
  5.          └→ inotify_inode_queue_event() 
  6.             └→ inotify_dev_queue_event() 

inotify_dev_queue_event 函數主要完成兩個工作:

  • 創建一個表示事件的 inotify_kernel_event 對象,并且把其插入到 inotify_device 對象的 events 列表中。
  • 喚醒正在等待 inotify 發生事件的進程,等待的進程放置在 inotify_device 對象的 wq 字段中。

上面主要涉及到兩個對象,inotify_device 和 inotify_kernel_event,我們先來介紹一下這兩個對象的作用。

  • inotify_device:內核使用此對象來描述一個 inotify,是 inotify 的核心對象。
  • intoify_kernel_event:內核使用此對象來描述一個事件。

我們來看看這兩個對象的定義。

1. inotify_device對象

內核使用 inotify_device 來管理 inotify 監聽的對象和發生的事件,其定義如下:

  1. 1struct inotify_device { 
  2. 2    wait_queue_head_t       wq; 
  3. 3    ... 
  4. 4    struct list_head        events; 
  5. 5    ... 
  6. 6    struct inotify_handle   *ih; 
  7. 7    unsigned int            event_count; 
  8. 8    unsigned int            max_events; 
  9. 9}; 

下面我們介紹一下各個字段的作用:

  • wq:正在等待當前 inotify 發生事件的進程列表。
  • events:保存由 inotify 監聽的文件或目錄所發生的事件。
  • ih:內核用來存儲 inotify 監聽的文件或目錄,下面會介紹。
  • event_count:inotify 監聽的文件或目錄所發生的事件數量。
  • max_events:inotify 能夠保存最大的事件數量。

下圖描述了 inotify_device 對象中兩個比較重要的隊列(等待隊列 和 事件隊列):

當事件隊列中有數據時,就可以通過調用 read 函數來讀取這些事件。

2. inotify_kernel_event對象

內核使用 inotify_kernel_event 對象來存儲一個事件,其定義如下:

  1. struct inotify_kernel_event { 
  2.    struct inotify_event    event; 
  3.     struct list_head        list; 
  4.     char                    *name
  5. }; 

可以看出,inotify_kernel_event 對象只是對 inotify_event 對象進行擴展而已,而我們在《監聽風云 - inotify介紹》一文中已經介紹過 inotify_event 對象。

inotify_kernel_event 對象在 inotify_event 對象的基礎上增加了 list 字段和 name 字段:

  • list:用于把所有由 inotify 監聽的文件或目錄所發生的事件連接起來,
  • name:用于記錄發生事件的文件名或目錄名。

3. inotify_handle對象

在 inotify_device 對象中,有個類型為 inotify_handle 的字段 ih,這個字段主要用來存儲 inotify 監聽的文件或目錄。我們來看看 inotify_handle 對象的定義:

  1. struct inotify_handle { 
  2.     struct idr          idr; 
  3.     ... 
  4.     struct list_head    watches; 
  5.     ... 
  6.     const struct inotify_operations *in_ops; 
  7. }; 

下面來介紹一下 inotify_handle 對象的各個字段作用:

  • idr:ID生成器,用于生成被監聽對象(文件或目錄)的ID。
  • watches:inotify 監聽的對象(文件或目錄)列表。
  • in_ops:當事件發生時,被 inotify 回調的函數列表。

4. inotify_watch對象

內核使用 inotify_handle 來存儲被監聽的對象列表,那么被監聽對象是個什么東西呢?內核中使用 inotify_watch 對象來表示一個被監聽的對象。其定義如下:

  1. struct inotify_watch { 
  2.     struct list_head        h_list; 
  3.     struct list_head        i_list; 
  4.     ... 
  5.     struct inotify_handle   *ih; 
  6.     struct inode            *inode; 
  7.     __s32                   wd; 
  8.     __u32                   mask; 
  9. }; 

下面介紹一下 inotify_watch 對象各個字段的作用:

  • h_list:用于把屬于同一個 inotify 監聽的對象連接起來。
  • i_list:由于同一個文件或目錄可以被多個 inotify 監聽,所以使用此字段來把所有監聽同一個文件的 inotify_handle 對象連接起來。
  • ih:指向其所屬的 inotify_handle 對象。
  • inode:由于在 Linux 內核中,每個文件或目錄都由一個 inode 對象來描述,這個字段就是指向被監聽的文件或目錄的 inode 對象。
  • wd:被監聽對象的ID(或稱為描述符)。
  • mask:被監聽的事件類型(在《監聽風云 - inotify介紹》一文中已經介紹)。

現在,我們通過下圖來描述一下 inotify_device、inotify_handle 和 inotify_watch 三者的關系:

inotify功能實現

上面我們把 inotify 功能涉及的所有數據結構都介紹了,有上面的基礎,現在我們可以開始分析 inotify 功能的實現了。

1. inotify_init 函數

在《監聽風云 - inotify介紹》一文中介紹過,要使用 inotify 功能,首先要調用 inotify_init 函數創建一個 inotify 的句柄,而 inotify_init 函數最終會調用內核函數 sys_inotify_init。我們來分析一下 sys_inotify_init 的實現:

  1. long sys_inotify_init(void) 
  2.     struct inotify_device *dev; 
  3.     struct inotify_handle *ih; 
  4.     struct user_struct *user
  5.     struct file *filp; 
  6.     int fd, ret; 
  7.  
  8.     // 1. 獲取一個沒用被占用的文件描述符 
  9.     fd = get_unused_fd(); 
  10.     ... 
  11.     // 2. 獲取一個文件對象 
  12.     filp = get_empty_filp(); 
  13.     ... 
  14.     // 3. 創建一個 inotify_device 對象 
  15.     dev = kmalloc(sizeof(struct inotify_device), GFP_KERNEL); 
  16.     ... 
  17.     // 4. 創建一個 inotify_handle 對象 
  18.     ih = inotify_init(&inotify_user_ops); 
  19.     ... 
  20.     // 5. 把 inotify_handle 對象與 inotify_device 對象進行綁定 
  21.     dev->ih = ih; 
  22.     // 6. 設置文件對象的操作函數列表為:inotify_fops 
  23.     filp->f_op = &inotify_fops; 
  24.     ... 
  25.     // 7. 將 inotify_device 對象綁定到文件對象的 private_data 字段中 
  26.     filp->private_data = dev; 
  27.     ... 
  28.     // 8. 把文件句柄與文件對象進行映射 
  29.     fd_install(fd, filp); 
  30.  
  31.     return fd; 

sys_inotify_init 函數主要完成以下幾個工作:

  • 調用 get_unused_fd 函數從進程中獲取一個沒被使用的文件描述符(句柄)。
  • 調用 get_empty_filp 獲取一個文件對象。
  • 調用 kmalloc 函數申請一個 inotify_device 對象。
  • 調用 inotify_init 函數創建并初始化一個 inotify_handle 對象。
  • 把 inotify_handle 對象與 inotify_device 對象進行綁定。
  • 設置文件對象的操作函數列表為:inotify_fops,主要提供 read 和 poll 等接口的實現。
  • 將 inotify_device 對象綁定到文件對象的 private_data 字段中。
  • 把文件描述符與文件對象進行映射。
  • 返回文件描述符給應用層。

從上面的實現可以看出,sys_inotify_init 函數主要是創建 inotify_device 對象和 inotify_handle 對象,并且將它們與文件對象關聯起來。

另外需要注意的是,在 sys_inotify_init 函數中,還把文件對象的操作函數集設置為 inotify_fops,主要提供了 read 和 poll 等接口的實現,其定義如下:

  1. static const struct file_operations inotify_fops = { 
  2.     .poll           = inotify_poll, 
  3.     .read           = inotify_read, 
  4.     .release        = inotify_release, 
  5.     ... 
  6. }; 

所以,當調用 read 函數讀取 inotify 的句柄時,就會觸發調用 inotify_read 函數讀取 inotify 事件隊列中的事件。

2. inotify_add_watch 函數

當調用 inotify_init 函數創建好 inotify 句柄后,就可以通過調用 inotify_add_watch 函數向 inotify 句柄添加要監控的文件或目錄。inotify_add_watch 函數的實現如下:

 

  1. long sys_inotify_add_watch(int fd, const char __user *path, u32 mask) 
  2.     struct inode *inode; 
  3.     struct inotify_device *dev; 
  4.     struct nameidata nd; 
  5.     struct file *filp; 
  6.     int ret, fput_needed; 
  7.     unsigned flags = 0; 
  8.  
  9.     // 通過文件句柄獲取文件對象 
  10.     filp = fget_light(fd, &fput_needed); 
  11.     ... 
  12.     // 獲取文件或目錄對應的 inode 對象 
  13.     ret = find_inode(path, &nd, flags); 
  14.     ... 
  15.     inode = nd.dentry->d_inode; 
  16.     // 從文件對象的 private_data 字段獲取對應的 inotify_device 對象 
  17.     dev = filp->private_data; 
  18.     ... 
  19.     // 創建一個新的 inotify_watch 對象 
  20.     if (ret == -ENOENT) 
  21.         ret = create_watch(dev, inode, mask); 
  22.     ... 
  23.     return ret; 

sys_inotify_add_watch 函數主要完成以下幾個工作:

  • 調用 fget_light 函數獲取 inotify 句柄對應的文件對象。
  • 調用 find_inode 函數獲取 path 路徑對應的 inode 對象,也就是獲取要監聽的文件或目錄所對應的 inode 對象。
  • 從 inotify 文件對象的 private_data 字段中,獲取對應的 inotify_device 對象。
  • 調用 create_watch 函數創建一個新的 inotify_watch 對象,并且把這個 inotify_watch 對象添加到 inotify_handle 對象的 watches 列表和 inode 對象的 inotify_watches 列表中。

事件通知

到了 inotify 最關鍵的部分,就是 inotify 的事件是怎么產生的。

在本文的第一部分中介紹過,當用戶調用 read 系統調用讀取文件內容時,最終會調用 inotify_dev_queue_event 函數來產生一個事件,我們先來回顧一下 read 系統調用的調用棧:

  1. read() 
  2. └→ sys_read() 
  3.    └→ vfs_read() 
  4.       └→ fsnotify_access() 
  5.          └→ inotify_inode_queue_event() 
  6.             └→ inotify_dev_queue_event() 

下面我們來分析一下 inotify_dev_queue_event 函數的實現:

  1. static void 
  2. inotify_dev_queue_event(struct inotify_watch *w, u32 wd,   
  3.     u32 mask, u32 cookie, const char *name, struct inode *ignored) 
  4.     struct inotify_user_watch *watch; 
  5.     struct inotify_device *dev; 
  6.     struct inotify_kernel_event *kevent, *last
  7.  
  8.     watch = container_of(w, struct inotify_user_watch, wdata); 
  9.    dev = watch->dev; 
  10.    ... 
  11.    // 1. 申請一個 inotify_kernel_event 事件對象 
  12.    if (unlikely(dev->event_count == dev->max_events)) 
  13.        kevent = kernel_event(-1, IN_Q_OVERFLOW, cookie, NULL); 
  14.    else 
  15.        kevent = kernel_event(wd, mask, cookie, name); 
  16.    ... 
  17.    // 2. 增加 inotify 事件隊列的計數器 
  18.    dev->event_count++; 
  19.    // 3. 增加 inotify 事件隊列所占用的內存大小 
  20.    dev->queue_size += sizeof(struct inotify_event) + kevent->event.len; 
  21.  
  22.    // 4. 把事件對象添加到 inotify 的事件隊列中 
  23.    list_add_tail(&kevent->list, &dev->events); 
  24.  
  25.    // 5. 喚醒正在等待讀取事件的進程 
  26.    wake_up_interruptible(&dev->wq); 
  27.    ... 

我們先來介紹一下 inotify_dev_queue_event 函數各個參數的意義:

  • w:被監聽對象,用于描述被監聽的文件或目錄。
  • wd:被監聽對象的ID。
  • mask:發生的事件類型,可以參考《監聽風云 - inotify介紹》一文。
  • cookie:比較少使用,忽略。
  • name:發生事件的文件或目錄名稱。
  • ignored:發生事件的文件或目錄的 inode 對象,在本函數中沒有使用。

inotify_dev_queue_event 函數主要完成以下幾個工作:

  • 通過調用 kernel_event 函數申請一個 inotify_kernel_event 事件對象。
  • 增加 inotify 事件隊列的計數器。
  • 增加 inotify 事件隊列所占用的內存大小。
  • 把第一步創建的事件對象添加到 inotify 的事件隊列中。
  • 喚醒正在等待讀取事件的進程(因為已經有事件發生了)。

從上面的分析可以看出,inotify_dev_queue_event 函數只負責創建一個事件對象,并且添加到 inotify 的事件隊列中。但發生了什么事件是由哪個步驟指定的呢?

我們可以通過分析 read 系統調用的調用棧,會發現在 fsnotify_access 函數中指定了事件的類型,我們來看看 fsnotify_access 函數的實現:

  1. static inline void fsnotify_access(struct dentry *dentry) 
  2.     struct inode *inode = dentry->d_inode; 
  3.     u32 mask = IN_ACCESS; // 指定事件類型為 IN_ACCESS 
  4.  
  5.     if (S_ISDIR(inode->i_mode)) 
  6.         mask |= IN_ISDIR; // 如果是目錄, 增加 IN_ISDIR 標志 
  7.     ... 
  8.     // 創建事件 
  9.     inotify_inode_queue_event(inode, mask, 0, NULLNULL);  

從上面的分析可知,當發生讀事件時,由 fsnotify_access 函數指定事件類型為 IN_ACCESS。在 include/linux/fsnotify.h 文件中還實現了其他事件的觸發函數,有興趣的可以自行查閱此文件 。

總結

inotify 的實現過程總結為以下兩點:

當用戶調用讀寫、創建或刪除文件的系統調用時,內核會注入相應的事件觸發函數來產生一個事件,并且添加到 inotify 的事件隊列中。

喚醒等待讀取事件的進程,當進程被喚醒后,就可以通過調用 read 函數來讀取 inotify 事件隊列中的事件。

 

責任編輯:武曉燕 來源: Linux內核那些事
相關推薦

2021-05-06 05:39:30

Inotify監聽系統

2017-10-11 14:45:58

Linuxinotify功能實現原理

2021-04-30 17:02:52

coredump內核故障

2023-05-05 21:51:47

竊聽信息泄露

2021-08-23 14:36:26

coredump

2011-06-22 10:37:08

rsyncinotify

2010-12-14 18:50:23

微軟

2012-11-30 11:00:54

2009-11-09 10:03:09

WCF通道監聽器

2011-08-19 08:56:34

JavaJava風云

2019-10-28 11:11:52

戴爾

2021-08-04 10:22:27

鴻蒙HarmonyOS應用

2025-05-29 01:00:00

文件監聽函數

2018-10-24 15:53:29

微服務后端JVM

2025-10-20 02:00:00

Lodash后端Node.js

2011-12-13 15:18:14

開放平臺

2017-07-11 13:58:10

WebSocket

2025-04-28 08:10:00

Linuxinotifyrsync

2011-08-25 22:16:31

惠普PC業務暗戰

2009-08-25 17:43:17

C#串口監聽
點贊
收藏

51CTO技術棧公眾號

四虎精品欧美一区二区免费| 欧美国产日韩在线| 国语对白做受xxxxx在线中国 | 亚洲午夜久久久久久久久久久 | 国产精品成人av久久| 高潮久久久久久久久久久久久久| 午夜精品免费在线| 蜜桃传媒视频麻豆第一区免费观看| 国产精品自拍99| 欧美精品羞羞答答| 制服.丝袜.亚洲.另类.中文 | 激情综合自拍| 亚洲色图日韩av| 亚洲va综合va国产va中文| 亚洲精品承认| 国产精品一区免费视频| 18性欧美xxxⅹ性满足| 瑟瑟视频在线观看| 亚洲欧美综合久久久久久v动漫| 亚洲欧美一区二区三区极速播放| 国产传媒一区二区| 在线免费观看av网址| 国产精品成人a在线观看| 欧美哺乳videos| 国产精品免费观看久久| 超鹏97在线| 91毛片在线观看| 日韩免费视频在线观看| 99久久99久久精品国产| 日韩精品丝袜美腿| 538在线一区二区精品国产| 欧美成人高潮一二区在线看| 日本高清中文字幕在线| heyzo一本久久综合| 91精品国产综合久久久久久蜜臀 | 亚洲精品午夜久久久| 久久久久资源| 国产女人高潮时对白| 国产一区白浆| 色狠狠久久aa北条麻妃 | 成人动漫一区二区在线| 国产精品一区二区久久久| 国产极品美女高潮无套嗷嗷叫酒店| 欧美一站二站| 日韩精品免费在线播放| 图片区偷拍区小说区| 黄色欧美视频| 91国偷自产一区二区三区成为亚洲经典 | 爱爱爱免费视频在线观看| 伊人久久大香线蕉综合影院首页| 一区二区三区成人在线视频| 日韩电影大全在线观看| 午夜在线视频免费| 国产一区二区不卡| 国产精品日韩av| 九九热精品视频在线| 好看的日韩av电影| 欧美精品在线免费播放| 天天色天天综合| 欧美日韩国产传媒| 日韩精品在线观看一区二区| 最好看的中文字幕| 久久亚洲资源中文字| 91成人免费在线视频| 精品少妇在线视频| 菠萝菠萝蜜在线观看| 中文字幕在线不卡一区| 亚洲国产一区二区三区在线| 可以在线观看的黄色| 99久久99久久久精品齐齐| 丁香五月网久久综合| 中文字幕人妻一区二区在线视频 | 色婷婷av一区二区三区丝袜美腿| 精品久久国产97色综合| 女同性αv亚洲女同志| 精品视频在线播放一区二区三区 | 97在线公开视频| 美女视频黄 久久| 91精品久久久久久久久不口人| 波多野结衣家庭主妇| 久久久综合网| 国产精品观看在线亚洲人成网| 6080午夜伦理| 日韩精彩视频在线观看| 国产精品久久久久久久久男| 国产成人麻豆免费观看| 免费观看在线综合| 亚洲v日韩v综合v精品v| 精品二区在线观看| 成人性视频网站| 国产超碰91| 殴美一级特黄aaaaaa| 99精品视频在线免费观看| 就去色蜜桃综合| 成年人在线视频免费观看| 国产精品区一区二区三| av电影一区二区三区| 羞羞的视频在线看| 午夜视频在线观看一区二区 | 日韩精品乱码av一区二区| 国产精品视频一| 精品欧美在线观看| 国产精品77777| 久久天天狠狠| 免费黄色在线| 夜夜嗨av一区二区三区网页| 欧美日韩一道本| 懂色aⅴ精品一区二区三区| 4hu四虎永久在线影院成人| 精品无码av一区二区三区不卡| 成人爽a毛片免费啪啪红桃视频| 精品久久久久久久久久久久久久久久久 | 噜噜噜噜噜久久久久久91| 99re在线视频| 亚洲午夜久久久久久久久电影院 | 5566中文字幕一区二区| 黄色一级大片在线免费看国产一| 91视频一区二区| 一区二区冒白浆视频| 电影在线观看一区| 欧美麻豆精品久久久久久| 精品一区二区三区四区五区六区| 欧美日韩性在线观看| 欧美精品久久久久久久免费观看| 91精品国产高清一区二区三密臀| 精品一区二区精品| 好吊妞www.84com只有这里才有精品| jizzjizz在线观看| 亚洲成人动漫在线观看| 老司机午夜性大片| 思热99re视热频这里只精品| 久久国产精品影视| 中文字幕人妻精品一区| av成人动漫在线观看| 国产av不卡一区二区| gay欧美网站| 亚洲国产成人精品女人久久久 | 亚洲欧洲成人精品av97| 成人av一级片| 国产劲爆久久| 另类色图亚洲色图| 中文无码av一区二区三区| 成人午夜电影网站| 韩国黄色一级大片| 国产福利一区二区三区在线播放| 亚洲黄色av女优在线观看| 国产黄在线免费观看| 亚洲黄色av| 亚洲一区中文字幕在线观看| eeuss影院www在线播放| 色综合天天天天做夜夜夜夜做| 岛国精品一区二区三区| 日本久久精品| 国产成人小视频在线观看| 日韩一级中文字幕| 一区二区三区在线视频免费观看| 亚洲免费一级视频| 奇米777国产一区国产二区| 欧美激情2020午夜免费观看| 91免费视频播放| 中文字幕第一区第二区| 国产一二三四在线视频| 国产精品欧美日韩一区| 欧美亚洲国产另类| 亚洲 精品 综合 精品 自拍| 黄色一区二区三区| 欧美成人三级伦在线观看| 激情视频一区| 国外成人在线视频网站| 涩涩涩在线视频| 亚洲女在线观看| 波多野结衣视频免费观看| 国产亚洲综合在线| 国产精品涩涩涩视频网站| 狠狠操综合网| 国产精品一久久香蕉国产线看观看| 国产区av在线| 精品视频在线免费看| а天堂中文在线资源| 国产在线精品一区二区| 性生活免费观看视频| 91成人在线精品视频| 2019中文在线观看| 成人亚洲综合天堂| 在线视频国内自拍亚洲视频| www成人啪啪18软件| 精品一区二区免费视频| 干日本少妇视频| 欧美xxxx在线| 国产精品久久一| 久cao在线| 精品粉嫩aⅴ一区二区三区四区| 精品无码人妻一区二区三| 国产91精品精华液一区二区三区 | 国产精品免费一区二区三区观看| 精品一性一色一乱农村| 日韩av网站电影| 18国产免费视频| 亚洲日本在线天堂| 中文字幕在线播放一区| 青青草国产成人99久久| 91免费版看片| 啪啪亚洲精品| 亚洲va欧美va在线观看| 中文字幕色婷婷在线视频| 日韩视频免费在线| 手机av在线免费观看| 欧美自拍偷拍午夜视频| 男女羞羞免费视频| 99久久国产综合精品女不卡| 在线观看日本一区二区| 欧美午夜电影在线观看| 日韩资源av在线| 国外成人福利视频| 国模视频一区二区| 欧美日本网站| 欧美日韩国产片| 日本污视频在线观看| 欧美极品aⅴ影院| 国产国语老龄妇女a片| 老司机精品导航| 国产一区二区四区| 91麻豆精品国产91久久久平台| 国产乱码精品一区二区三区日韩精品| 91亚洲精品| 2020欧美日韩在线视频| sm国产在线调教视频| 亚洲欧美福利视频| 国内爆初菊对白视频| 欧美怡红院视频| 国产一级特黄视频| 亚洲三级理论片| 在线免费观看视频| 成人激情午夜影院| 亚洲天堂网2018| 久久男女视频| 日本www在线视频| 欧美精品入口| 致1999电视剧免费观看策驰影院| 欧美日韩一本| 亚洲mm色国产网站| 成人在线免费电影网站| 日本亚洲精品在线观看| av在线私库| 欧美日韩国产成人在线| 日本www在线观看视频| 亚洲欧洲视频在线| 性xxxx搡xxxxx搡欧美| 精品久久久久久久久久久院品网 | 日韩亚洲国产精品| wwwwww欧美| 欧美私人啪啪vps| 一区二区三区四区久久| 欧美日中文字幕| 日韩国产伦理| 麻豆成人入口| 国产尤物91| 麻豆国产欧美一区二区三区r| www.久久久| 中文在线免费一区三区| 丁香婷婷久久久综合精品国产| 无人区乱码一区二区三区| 91精品婷婷国产综合久久蝌蚪| 亚洲综合资源| 91免费福利视频| www.成人在线.com| 91免费版网站入口| 日韩在线成人| 国产精品久久久久久久久久直播| 一区二区三区高清在线观看| 国产一区喷水| 国产最新精品| av电影一区二区三区| 亚洲美女视频在线免费观看| 麻豆av免费在线| 国产一区二区三区在线看麻豆| 亚洲日本久久久| 欧美国产激情二区三区 | 亚洲综合色网| 老太脱裤子让老头玩xxxxx| 快she精品国产999| 国产三级精品三级在线| av一区二区久久| 第一次破处视频| 一区av在线播放| 波多野结衣一二区| 日韩一区和二区| 可以在线观看的黄色| 欧美成人合集magnet| 人人视频精品| 成人午夜电影在线播放| 国产精品亚洲片在线播放| 好吊色视频988gao在线观看| 视频一区二区三区在线| 久久无码专区国产精品s| 国产亚洲午夜高清国产拍精品| 欧美又粗又大又长| 欧美在线视频日韩| 欧美 日韩 国产 精品| 日韩中文字幕在线视频播放| 黄视频网站在线观看| 成人激情视频免费在线| 亚洲三级精品| 99久久国产综合精品五月天喷水| 免费av网站大全久久| 四虎永久免费影院| 亚洲永久精品大片| 亚洲中文字幕在线观看| 精品无码久久久久久国产| 日韩少妇视频| 成人黄色在线免费| 日韩电影免费在线观看| 女人天堂av手机在线| 成人午夜视频福利| 免费看特级毛片| 欧美日韩综合不卡| 国产视频福利在线| 欧美洲成人男女午夜视频| 91欧美极品| 国产一级不卡视频| 国产福利91精品| 老女人性淫交视频| 91精品欧美久久久久久动漫| 最近高清中文在线字幕在线观看| 91精品国产沙发| 国产精品一线| 99久久免费观看| 国产精品一区二区三区乱码| 91制片厂在线| 欧美视频在线播放| av资源种子在线观看| 国产精品高精视频免费| 精品国内自产拍在线观看视频| www.com毛片| 99re成人在线| 99热在线观看免费精品| 亚洲激情成人网| 人妻丰满熟妇aⅴ无码| 清纯唯美综合亚洲| 好男人www社区| 国产日韩av一区| 国产日韩在线免费观看| 夜夜嗨av一区二区三区免费区| 原纱央莉成人av片| 欧美大香线蕉线伊人久久国产精品| 亚洲免费黄色| 久久无码人妻精品一区二区三区| 亚洲高清视频的网址| 黄色片网站免费在线观看| 国外成人在线播放| 四虎5151久久欧美毛片| 久草精品在线播放| 国产视频在线观看一区二区三区| 无码视频一区二区三区| 在线视频日本亚洲性| 成人亚洲综合| 亚洲欧洲一二三| 国产资源精品在线观看| 久久久久久久久毛片| 欧美精品一区视频| 亚洲精华液一区二区三区| 欧美一区二区视频在线观看2020| 中文字幕第20页| 色综合天天天天做夜夜夜夜做| 国产精品秘入口| 国产精品永久免费| 一本精品一区二区三区| 中文字幕视频观看| 欧美日韩中文字幕综合视频| 国产剧情在线观看| 91久久嫩草影院一区二区| 亚洲欧美亚洲| 国产麻豆天美果冻无码视频| 欧美自拍丝袜亚洲| a免费在线观看| 久久av二区| 蜜桃av一区二区在线观看| 欧美日韩一级大片| 国产丝袜一区二区| 永久免费观看精品视频| 九九爱精品视频| 国产精品毛片大码女人| 成 人 黄 色 片 在线播放| 57pao成人国产永久免费| 成人亚洲一区二区| 久久性爱视频网站| 在线观看www91| 动漫一区二区| 婷婷久久青草热一区二区| 国产精品88888| 国产免费www| 久久久久久久爱| 日韩欧美字幕| www.日本高清| 91精品国产乱| 香蕉成人av| 国产 日韩 欧美在线| 国产精品久久久久久亚洲伦| 香蕉视频免费看| 亚洲精品欧美日韩专区|