LCOV - code coverage report
Current view: top level - include/linux - fsnotify_backend.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 8 8 100.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 19 22 86.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Filesystem access notification for Linux
       3                 :            :  *
       4                 :            :  *  Copyright (C) 2008 Red Hat, Inc., Eric Paris <eparis@redhat.com>
       5                 :            :  */
       6                 :            : 
       7                 :            : #ifndef __LINUX_FSNOTIFY_BACKEND_H
       8                 :            : #define __LINUX_FSNOTIFY_BACKEND_H
       9                 :            : 
      10                 :            : #ifdef __KERNEL__
      11                 :            : 
      12                 :            : #include <linux/idr.h> /* inotify uses this */
      13                 :            : #include <linux/fs.h> /* struct inode */
      14                 :            : #include <linux/list.h>
      15                 :            : #include <linux/path.h> /* struct path */
      16                 :            : #include <linux/spinlock.h>
      17                 :            : #include <linux/types.h>
      18                 :            : 
      19                 :            : #include <linux/atomic.h>
      20                 :            : 
      21                 :            : /*
      22                 :            :  * IN_* from inotfy.h lines up EXACTLY with FS_*, this is so we can easily
      23                 :            :  * convert between them.  dnotify only needs conversion at watch creation
      24                 :            :  * so no perf loss there.  fanotify isn't defined yet, so it can use the
      25                 :            :  * wholes if it needs more events.
      26                 :            :  */
      27                 :            : #define FS_ACCESS               0x00000001      /* File was accessed */
      28                 :            : #define FS_MODIFY               0x00000002      /* File was modified */
      29                 :            : #define FS_ATTRIB               0x00000004      /* Metadata changed */
      30                 :            : #define FS_CLOSE_WRITE          0x00000008      /* Writtable file was closed */
      31                 :            : #define FS_CLOSE_NOWRITE        0x00000010      /* Unwrittable file closed */
      32                 :            : #define FS_OPEN                 0x00000020      /* File was opened */
      33                 :            : #define FS_MOVED_FROM           0x00000040      /* File was moved from X */
      34                 :            : #define FS_MOVED_TO             0x00000080      /* File was moved to Y */
      35                 :            : #define FS_CREATE               0x00000100      /* Subfile was created */
      36                 :            : #define FS_DELETE               0x00000200      /* Subfile was deleted */
      37                 :            : #define FS_DELETE_SELF          0x00000400      /* Self was deleted */
      38                 :            : #define FS_MOVE_SELF            0x00000800      /* Self was moved */
      39                 :            : 
      40                 :            : #define FS_UNMOUNT              0x00002000      /* inode on umount fs */
      41                 :            : #define FS_Q_OVERFLOW           0x00004000      /* Event queued overflowed */
      42                 :            : #define FS_IN_IGNORED           0x00008000      /* last inotify event here */
      43                 :            : 
      44                 :            : #define FS_OPEN_PERM            0x00010000      /* open event in an permission hook */
      45                 :            : #define FS_ACCESS_PERM          0x00020000      /* access event in a permissions hook */
      46                 :            : 
      47                 :            : #define FS_EXCL_UNLINK          0x04000000      /* do not send events if object is unlinked */
      48                 :            : #define FS_ISDIR                0x40000000      /* event occurred against dir */
      49                 :            : #define FS_IN_ONESHOT           0x80000000      /* only send event once */
      50                 :            : 
      51                 :            : #define FS_DN_RENAME            0x10000000      /* file renamed */
      52                 :            : #define FS_DN_MULTISHOT         0x20000000      /* dnotify multishot */
      53                 :            : 
      54                 :            : /* This inode cares about things that happen to its children.  Always set for
      55                 :            :  * dnotify and inotify. */
      56                 :            : #define FS_EVENT_ON_CHILD       0x08000000
      57                 :            : 
      58                 :            : /* This is a list of all events that may get sent to a parernt based on fs event
      59                 :            :  * happening to inodes inside that directory */
      60                 :            : #define FS_EVENTS_POSS_ON_CHILD   (FS_ACCESS | FS_MODIFY | FS_ATTRIB |\
      61                 :            :                                    FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN |\
      62                 :            :                                    FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE |\
      63                 :            :                                    FS_DELETE | FS_OPEN_PERM | FS_ACCESS_PERM)
      64                 :            : 
      65                 :            : #define FS_MOVE                 (FS_MOVED_FROM | FS_MOVED_TO)
      66                 :            : 
      67                 :            : #define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM)
      68                 :            : 
      69                 :            : #define ALL_FSNOTIFY_EVENTS (FS_ACCESS | FS_MODIFY | FS_ATTRIB | \
      70                 :            :                              FS_CLOSE_WRITE | FS_CLOSE_NOWRITE | FS_OPEN | \
      71                 :            :                              FS_MOVED_FROM | FS_MOVED_TO | FS_CREATE | \
      72                 :            :                              FS_DELETE | FS_DELETE_SELF | FS_MOVE_SELF | \
      73                 :            :                              FS_UNMOUNT | FS_Q_OVERFLOW | FS_IN_IGNORED | \
      74                 :            :                              FS_OPEN_PERM | FS_ACCESS_PERM | FS_EXCL_UNLINK | \
      75                 :            :                              FS_ISDIR | FS_IN_ONESHOT | FS_DN_RENAME | \
      76                 :            :                              FS_DN_MULTISHOT | FS_EVENT_ON_CHILD)
      77                 :            : 
      78                 :            : struct fsnotify_group;
      79                 :            : struct fsnotify_event;
      80                 :            : struct fsnotify_mark;
      81                 :            : struct fsnotify_event_private_data;
      82                 :            : 
      83                 :            : /*
      84                 :            :  * Each group much define these ops.  The fsnotify infrastructure will call
      85                 :            :  * these operations for each relevant group.
      86                 :            :  *
      87                 :            :  * should_send_event - given a group, inode, and mask this function determines
      88                 :            :  *              if the group is interested in this event.
      89                 :            :  * handle_event - main call for a group to handle an fs event
      90                 :            :  * free_group_priv - called when a group refcnt hits 0 to clean up the private union
      91                 :            :  * freeing_mark - called when a mark is being destroyed for some reason.  The group
      92                 :            :  *              MUST be holding a reference on each mark and that reference must be
      93                 :            :  *              dropped in this function.  inotify uses this function to send
      94                 :            :  *              userspace messages that marks have been removed.
      95                 :            :  */
      96                 :            : struct fsnotify_ops {
      97                 :            :         bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode,
      98                 :            :                                   struct fsnotify_mark *inode_mark,
      99                 :            :                                   struct fsnotify_mark *vfsmount_mark,
     100                 :            :                                   __u32 mask, void *data, int data_type);
     101                 :            :         int (*handle_event)(struct fsnotify_group *group,
     102                 :            :                             struct fsnotify_mark *inode_mark,
     103                 :            :                             struct fsnotify_mark *vfsmount_mark,
     104                 :            :                             struct fsnotify_event *event);
     105                 :            :         void (*free_group_priv)(struct fsnotify_group *group);
     106                 :            :         void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
     107                 :            :         void (*free_event_priv)(struct fsnotify_event_private_data *priv);
     108                 :            : };
     109                 :            : 
     110                 :            : /*
     111                 :            :  * A group is a "thing" that wants to receive notification about filesystem
     112                 :            :  * events.  The mask holds the subset of event types this group cares about.
     113                 :            :  * refcnt on a group is up to the implementor and at any moment if it goes 0
     114                 :            :  * everything will be cleaned up.
     115                 :            :  */
     116                 :            : struct fsnotify_group {
     117                 :            :         /*
     118                 :            :          * How the refcnt is used is up to each group.  When the refcnt hits 0
     119                 :            :          * fsnotify will clean up all of the resources associated with this group.
     120                 :            :          * As an example, the dnotify group will always have a refcnt=1 and that
     121                 :            :          * will never change.  Inotify, on the other hand, has a group per
     122                 :            :          * inotify_init() and the refcnt will hit 0 only when that fd has been
     123                 :            :          * closed.
     124                 :            :          */
     125                 :            :         atomic_t refcnt;                /* things with interest in this group */
     126                 :            : 
     127                 :            :         const struct fsnotify_ops *ops; /* how this group handles things */
     128                 :            : 
     129                 :            :         /* needed to send notification to userspace */
     130                 :            :         struct mutex notification_mutex;        /* protect the notification_list */
     131                 :            :         struct list_head notification_list;     /* list of event_holder this group needs to send to userspace */
     132                 :            :         wait_queue_head_t notification_waitq;   /* read() on the notification file blocks on this waitq */
     133                 :            :         unsigned int q_len;                     /* events on the queue */
     134                 :            :         unsigned int max_events;                /* maximum events allowed on the list */
     135                 :            :         /*
     136                 :            :          * Valid fsnotify group priorities.  Events are send in order from highest
     137                 :            :          * priority to lowest priority.  We default to the lowest priority.
     138                 :            :          */
     139                 :            :         #define FS_PRIO_0       0 /* normal notifiers, no permissions */
     140                 :            :         #define FS_PRIO_1       1 /* fanotify content based access control */
     141                 :            :         #define FS_PRIO_2       2 /* fanotify pre-content access */
     142                 :            :         unsigned int priority;
     143                 :            : 
     144                 :            :         /* stores all fastpath marks assoc with this group so they can be cleaned on unregister */
     145                 :            :         struct mutex mark_mutex;        /* protect marks_list */
     146                 :            :         atomic_t num_marks;             /* 1 for each mark and 1 for not being
     147                 :            :                                          * past the point of no return when freeing
     148                 :            :                                          * a group */
     149                 :            :         struct list_head marks_list;    /* all inode marks for this group */
     150                 :            : 
     151                 :            :         struct fasync_struct    *fsn_fa;    /* async notification */
     152                 :            : 
     153                 :            :         /* groups can define private fields here or use the void *private */
     154                 :            :         union {
     155                 :            :                 void *private;
     156                 :            : #ifdef CONFIG_INOTIFY_USER
     157                 :            :                 struct inotify_group_private_data {
     158                 :            :                         spinlock_t      idr_lock;
     159                 :            :                         struct idr      idr;
     160                 :            :                         struct user_struct      *user;
     161                 :            :                 } inotify_data;
     162                 :            : #endif
     163                 :            : #ifdef CONFIG_FANOTIFY
     164                 :            :                 struct fanotify_group_private_data {
     165                 :            : #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
     166                 :            :                         /* allows a group to block waiting for a userspace response */
     167                 :            :                         struct mutex access_mutex;
     168                 :            :                         struct list_head access_list;
     169                 :            :                         wait_queue_head_t access_waitq;
     170                 :            :                         atomic_t bypass_perm;
     171                 :            : #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */
     172                 :            :                         int f_flags;
     173                 :            :                         unsigned int max_marks;
     174                 :            :                         struct user_struct *user;
     175                 :            :                 } fanotify_data;
     176                 :            : #endif /* CONFIG_FANOTIFY */
     177                 :            :         };
     178                 :            : };
     179                 :            : 
     180                 :            : /*
     181                 :            :  * A single event can be queued in multiple group->notification_lists.
     182                 :            :  *
     183                 :            :  * each group->notification_list will point to an event_holder which in turns points
     184                 :            :  * to the actual event that needs to be sent to userspace.
     185                 :            :  *
     186                 :            :  * Seemed cheaper to create a refcnt'd event and a small holder for every group
     187                 :            :  * than create a different event for every group
     188                 :            :  *
     189                 :            :  */
     190                 :            : struct fsnotify_event_holder {
     191                 :            :         struct fsnotify_event *event;
     192                 :            :         struct list_head event_list;
     193                 :            : };
     194                 :            : 
     195                 :            : /*
     196                 :            :  * Inotify needs to tack data onto an event.  This struct lets us later find the
     197                 :            :  * correct private data of the correct group.
     198                 :            :  */
     199                 :            : struct fsnotify_event_private_data {
     200                 :            :         struct fsnotify_group *group;
     201                 :            :         struct list_head event_list;
     202                 :            : };
     203                 :            : 
     204                 :            : /*
     205                 :            :  * all of the information about the original object we want to now send to
     206                 :            :  * a group.  If you want to carry more info from the accessing task to the
     207                 :            :  * listener this structure is where you need to be adding fields.
     208                 :            :  */
     209                 :            : struct fsnotify_event {
     210                 :            :         /*
     211                 :            :          * If we create an event we are also likely going to need a holder
     212                 :            :          * to link to a group.  So embed one holder in the event.  Means only
     213                 :            :          * one allocation for the common case where we only have one group
     214                 :            :          */
     215                 :            :         struct fsnotify_event_holder holder;
     216                 :            :         spinlock_t lock;        /* protection for the associated event_holder and private_list */
     217                 :            :         /* to_tell may ONLY be dereferenced during handle_event(). */
     218                 :            :         struct inode *to_tell;  /* either the inode the event happened to or its parent */
     219                 :            :         /*
     220                 :            :          * depending on the event type we should have either a path or inode
     221                 :            :          * We hold a reference on path, but NOT on inode.  Since we have the ref on
     222                 :            :          * the path, it may be dereferenced at any point during this object's
     223                 :            :          * lifetime.  That reference is dropped when this object's refcnt hits
     224                 :            :          * 0.  If this event contains an inode instead of a path, the inode may
     225                 :            :          * ONLY be used during handle_event().
     226                 :            :          */
     227                 :            :         union {
     228                 :            :                 struct path path;
     229                 :            :                 struct inode *inode;
     230                 :            :         };
     231                 :            : /* when calling fsnotify tell it if the data is a path or inode */
     232                 :            : #define FSNOTIFY_EVENT_NONE     0
     233                 :            : #define FSNOTIFY_EVENT_PATH     1
     234                 :            : #define FSNOTIFY_EVENT_INODE    2
     235                 :            :         int data_type;          /* which of the above union we have */
     236                 :            :         atomic_t refcnt;        /* how many groups still are using/need to send this event */
     237                 :            :         __u32 mask;             /* the type of access, bitwise OR for FS_* event types */
     238                 :            : 
     239                 :            :         u32 sync_cookie;        /* used to corrolate events, namely inotify mv events */
     240                 :            :         const unsigned char *file_name;
     241                 :            :         size_t name_len;
     242                 :            :         struct pid *tgid;
     243                 :            : 
     244                 :            : #ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
     245                 :            :         __u32 response; /* userspace answer to question */
     246                 :            : #endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */
     247                 :            : 
     248                 :            :         struct list_head private_data_list;     /* groups can store private data here */
     249                 :            : };
     250                 :            : 
     251                 :            : /*
     252                 :            :  * Inode specific fields in an fsnotify_mark
     253                 :            :  */
     254                 :            : struct fsnotify_inode_mark {
     255                 :            :         struct inode *inode;            /* inode this mark is associated with */
     256                 :            :         struct hlist_node i_list;       /* list of marks by inode->i_fsnotify_marks */
     257                 :            :         struct list_head free_i_list;   /* tmp list used when freeing this mark */
     258                 :            : };
     259                 :            : 
     260                 :            : /*
     261                 :            :  * Mount point specific fields in an fsnotify_mark
     262                 :            :  */
     263                 :            : struct fsnotify_vfsmount_mark {
     264                 :            :         struct vfsmount *mnt;           /* vfsmount this mark is associated with */
     265                 :            :         struct hlist_node m_list;       /* list of marks by inode->i_fsnotify_marks */
     266                 :            :         struct list_head free_m_list;   /* tmp list used when freeing this mark */
     267                 :            : };
     268                 :            : 
     269                 :            : /*
     270                 :            :  * a mark is simply an object attached to an in core inode which allows an
     271                 :            :  * fsnotify listener to indicate they are either no longer interested in events
     272                 :            :  * of a type matching mask or only interested in those events.
     273                 :            :  *
     274                 :            :  * these are flushed when an inode is evicted from core and may be flushed
     275                 :            :  * when the inode is modified (as seen by fsnotify_access).  Some fsnotify users
     276                 :            :  * (such as dnotify) will flush these when the open fd is closed and not at
     277                 :            :  * inode eviction or modification.
     278                 :            :  */
     279                 :            : struct fsnotify_mark {
     280                 :            :         __u32 mask;                     /* mask this mark is for */
     281                 :            :         /* we hold ref for each i_list and g_list.  also one ref for each 'thing'
     282                 :            :          * in kernel that found and may be using this mark. */
     283                 :            :         atomic_t refcnt;                /* active things looking at this mark */
     284                 :            :         struct fsnotify_group *group;   /* group this mark is for */
     285                 :            :         struct list_head g_list;        /* list of marks by group->i_fsnotify_marks */
     286                 :            :         spinlock_t lock;                /* protect group and inode */
     287                 :            :         union {
     288                 :            :                 struct fsnotify_inode_mark i;
     289                 :            :                 struct fsnotify_vfsmount_mark m;
     290                 :            :         };
     291                 :            :         __u32 ignored_mask;             /* events types to ignore */
     292                 :            : #define FSNOTIFY_MARK_FLAG_INODE                0x01
     293                 :            : #define FSNOTIFY_MARK_FLAG_VFSMOUNT             0x02
     294                 :            : #define FSNOTIFY_MARK_FLAG_OBJECT_PINNED        0x04
     295                 :            : #define FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY  0x08
     296                 :            : #define FSNOTIFY_MARK_FLAG_ALIVE                0x10
     297                 :            :         unsigned int flags;             /* vfsmount or inode mark? */
     298                 :            :         struct list_head destroy_list;
     299                 :            :         void (*free_mark)(struct fsnotify_mark *mark); /* called on final put+free */
     300                 :            : };
     301                 :            : 
     302                 :            : #ifdef CONFIG_FSNOTIFY
     303                 :            : 
     304                 :            : /* called from the vfs helpers */
     305                 :            : 
     306                 :            : /* main fsnotify call to send events */
     307                 :            : extern int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
     308                 :            :                     const unsigned char *name, u32 cookie);
     309                 :            : extern int __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask);
     310                 :            : extern void __fsnotify_inode_delete(struct inode *inode);
     311                 :            : extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt);
     312                 :            : extern u32 fsnotify_get_cookie(void);
     313                 :            : 
     314                 :            : static inline int fsnotify_inode_watches_children(struct inode *inode)
     315                 :            : {
     316                 :            :         /* FS_EVENT_ON_CHILD is set if the inode may care */
     317 [ +  + ][ +  + ]:    2965451 :         if (!(inode->i_fsnotify_mask & FS_EVENT_ON_CHILD))
         [ +  + ][ +  + ]
     318                 :            :                 return 0;
     319                 :            :         /* this inode might care about child events, does it care about the
     320                 :            :          * specific set of events that can happen on a child? */
     321                 :     729731 :         return inode->i_fsnotify_mask & FS_EVENTS_POSS_ON_CHILD;
     322                 :            : }
     323                 :            : 
     324                 :            : /*
     325                 :            :  * Update the dentry with a flag indicating the interest of its parent to receive
     326                 :            :  * filesystem events when those events happens to this dentry->d_inode.
     327                 :            :  */
     328                 :            : static inline void __fsnotify_update_dcache_flags(struct dentry *dentry)
     329                 :            : {
     330                 :            :         struct dentry *parent;
     331                 :            : 
     332 [ -  + ][ -  + ]:    6388211 :         assert_spin_locked(&dentry->d_lock);
     333                 :            : 
     334                 :            :         /*
     335                 :            :          * Serialisation of setting PARENT_WATCHED on the dentries is provided
     336                 :            :          * by d_lock. If inotify_inode_watched changes after we have taken
     337                 :            :          * d_lock, the following __fsnotify_update_child_dentry_flags call will
     338                 :            :          * find our entry, so it will spin until we complete here, and update
     339                 :            :          * us with the new state.
     340                 :            :          */
     341                 :    2253115 :         parent = dentry->d_parent;
     342 [ +  - ][ +  + ]:    4506155 :         if (parent->d_inode && fsnotify_inode_watches_children(parent->d_inode))
         [ +  + ][ +  + ]
     343                 :      17327 :                 dentry->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED;
     344                 :            :         else
     345                 :    2235788 :                 dentry->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED;
     346                 :            : }
     347                 :            : 
     348                 :            : /*
     349                 :            :  * fsnotify_d_instantiate - instantiate a dentry for inode
     350                 :            :  */
     351                 :            : static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode *inode)
     352                 :            : {
     353         [ +  + ]:    3868709 :         if (!inode)
     354                 :            :                 return;
     355                 :            : 
     356                 :            :         spin_lock(&dentry->d_lock);
     357                 :            :         __fsnotify_update_dcache_flags(dentry);
     358                 :            :         spin_unlock(&dentry->d_lock);
     359                 :            : }
     360                 :            : 
     361                 :            : /* called from fsnotify listeners, such as fanotify or dnotify */
     362                 :            : 
     363                 :            : /* create a new group */
     364                 :            : extern struct fsnotify_group *fsnotify_alloc_group(const struct fsnotify_ops *ops);
     365                 :            : /* get reference to a group */
     366                 :            : extern void fsnotify_get_group(struct fsnotify_group *group);
     367                 :            : /* drop reference on a group from fsnotify_alloc_group */
     368                 :            : extern void fsnotify_put_group(struct fsnotify_group *group);
     369                 :            : /* destroy group */
     370                 :            : extern void fsnotify_destroy_group(struct fsnotify_group *group);
     371                 :            : /* fasync handler function */
     372                 :            : extern int fsnotify_fasync(int fd, struct file *file, int on);
     373                 :            : /* take a reference to an event */
     374                 :            : extern void fsnotify_get_event(struct fsnotify_event *event);
     375                 :            : extern void fsnotify_put_event(struct fsnotify_event *event);
     376                 :            : /* find private data previously attached to an event and unlink it */
     377                 :            : extern struct fsnotify_event_private_data *fsnotify_remove_priv_from_event(struct fsnotify_group *group,
     378                 :            :                                                                            struct fsnotify_event *event);
     379                 :            : 
     380                 :            : /* attach the event to the group notification queue */
     381                 :            : extern struct fsnotify_event *fsnotify_add_notify_event(struct fsnotify_group *group,
     382                 :            :                                                         struct fsnotify_event *event,
     383                 :            :                                                         struct fsnotify_event_private_data *priv,
     384                 :            :                                                         struct fsnotify_event *(*merge)(struct list_head *,
     385                 :            :                                                                                         struct fsnotify_event *));
     386                 :            : /* true if the group notification queue is empty */
     387                 :            : extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group);
     388                 :            : /* return, but do not dequeue the first event on the notification queue */
     389                 :            : extern struct fsnotify_event *fsnotify_peek_notify_event(struct fsnotify_group *group);
     390                 :            : /* return AND dequeue the first event on the notification queue */
     391                 :            : extern struct fsnotify_event *fsnotify_remove_notify_event(struct fsnotify_group *group);
     392                 :            : 
     393                 :            : /* functions used to manipulate the marks attached to inodes */
     394                 :            : 
     395                 :            : /* run all marks associated with a vfsmount and update mnt->mnt_fsnotify_mask */
     396                 :            : extern void fsnotify_recalc_vfsmount_mask(struct vfsmount *mnt);
     397                 :            : /* run all marks associated with an inode and update inode->i_fsnotify_mask */
     398                 :            : extern void fsnotify_recalc_inode_mask(struct inode *inode);
     399                 :            : extern void fsnotify_init_mark(struct fsnotify_mark *mark, void (*free_mark)(struct fsnotify_mark *mark));
     400                 :            : /* find (and take a reference) to a mark associated with group and inode */
     401                 :            : extern struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *group, struct inode *inode);
     402                 :            : /* find (and take a reference) to a mark associated with group and vfsmount */
     403                 :            : extern struct fsnotify_mark *fsnotify_find_vfsmount_mark(struct fsnotify_group *group, struct vfsmount *mnt);
     404                 :            : /* copy the values from old into new */
     405                 :            : extern void fsnotify_duplicate_mark(struct fsnotify_mark *new, struct fsnotify_mark *old);
     406                 :            : /* set the ignored_mask of a mark */
     407                 :            : extern void fsnotify_set_mark_ignored_mask_locked(struct fsnotify_mark *mark, __u32 mask);
     408                 :            : /* set the mask of a mark (might pin the object into memory */
     409                 :            : extern void fsnotify_set_mark_mask_locked(struct fsnotify_mark *mark, __u32 mask);
     410                 :            : /* attach the mark to both the group and the inode */
     411                 :            : extern int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group,
     412                 :            :                              struct inode *inode, struct vfsmount *mnt, int allow_dups);
     413                 :            : extern int fsnotify_add_mark_locked(struct fsnotify_mark *mark, struct fsnotify_group *group,
     414                 :            :                                     struct inode *inode, struct vfsmount *mnt, int allow_dups);
     415                 :            : /* given a group and a mark, flag mark to be freed when all references are dropped */
     416                 :            : extern void fsnotify_destroy_mark(struct fsnotify_mark *mark,
     417                 :            :                                   struct fsnotify_group *group);
     418                 :            : extern void fsnotify_destroy_mark_locked(struct fsnotify_mark *mark,
     419                 :            :                                          struct fsnotify_group *group);
     420                 :            : /* run all the marks in a group, and clear all of the vfsmount marks */
     421                 :            : extern void fsnotify_clear_vfsmount_marks_by_group(struct fsnotify_group *group);
     422                 :            : /* run all the marks in a group, and clear all of the inode marks */
     423                 :            : extern void fsnotify_clear_inode_marks_by_group(struct fsnotify_group *group);
     424                 :            : /* run all the marks in a group, and clear all of the marks where mark->flags & flags is true*/
     425                 :            : extern void fsnotify_clear_marks_by_group_flags(struct fsnotify_group *group, unsigned int flags);
     426                 :            : /* run all the marks in a group, and flag them to be freed */
     427                 :            : extern void fsnotify_clear_marks_by_group(struct fsnotify_group *group);
     428                 :            : extern void fsnotify_get_mark(struct fsnotify_mark *mark);
     429                 :            : extern void fsnotify_put_mark(struct fsnotify_mark *mark);
     430                 :            : extern void fsnotify_unmount_inodes(struct list_head *list);
     431                 :            : 
     432                 :            : /* put here because inotify does some weird stuff when destroying watches */
     433                 :            : extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask,
     434                 :            :                                                     void *data, int data_is,
     435                 :            :                                                     const unsigned char *name,
     436                 :            :                                                     u32 cookie, gfp_t gfp);
     437                 :            : 
     438                 :            : /* fanotify likes to change events after they are on lists... */
     439                 :            : extern struct fsnotify_event *fsnotify_clone_event(struct fsnotify_event *old_event);
     440                 :            : extern int fsnotify_replace_event(struct fsnotify_event_holder *old_holder,
     441                 :            :                                   struct fsnotify_event *new_event);
     442                 :            : 
     443                 :            : #else
     444                 :            : 
     445                 :            : static inline int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
     446                 :            :                            const unsigned char *name, u32 cookie)
     447                 :            : {
     448                 :            :         return 0;
     449                 :            : }
     450                 :            : 
     451                 :            : static inline int __fsnotify_parent(struct path *path, struct dentry *dentry, __u32 mask)
     452                 :            : {
     453                 :            :         return 0;
     454                 :            : }
     455                 :            : 
     456                 :            : static inline void __fsnotify_inode_delete(struct inode *inode)
     457                 :            : {}
     458                 :            : 
     459                 :            : static inline void __fsnotify_vfsmount_delete(struct vfsmount *mnt)
     460                 :            : {}
     461                 :            : 
     462                 :            : static inline void __fsnotify_update_dcache_flags(struct dentry *dentry)
     463                 :            : {}
     464                 :            : 
     465                 :            : static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode *inode)
     466                 :            : {}
     467                 :            : 
     468                 :            : static inline u32 fsnotify_get_cookie(void)
     469                 :            : {
     470                 :            :         return 0;
     471                 :            : }
     472                 :            : 
     473                 :            : static inline void fsnotify_unmount_inodes(struct list_head *list)
     474                 :            : {}
     475                 :            : 
     476                 :            : #endif  /* CONFIG_FSNOTIFY */
     477                 :            : 
     478                 :            : #endif  /* __KERNEL __ */
     479                 :            : 
     480                 :            : #endif  /* __LINUX_FSNOTIFY_BACKEND_H */

Generated by: LCOV version 1.9