]> asedeno.scripts.mit.edu Git - linux.git/blob - fs/notify/fsnotify.c
Merge tag 'omap-for-v5.1/fixes-rc6' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / fs / notify / fsnotify.c
1 /*
2  *  Copyright (C) 2008 Red Hat, Inc., Eric Paris <eparis@redhat.com>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2, or (at your option)
7  *  any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; see the file COPYING.  If not, write to
16  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #include <linux/dcache.h>
20 #include <linux/fs.h>
21 #include <linux/gfp.h>
22 #include <linux/init.h>
23 #include <linux/module.h>
24 #include <linux/mount.h>
25 #include <linux/srcu.h>
26
27 #include <linux/fsnotify_backend.h>
28 #include "fsnotify.h"
29
30 /*
31  * Clear all of the marks on an inode when it is being evicted from core
32  */
33 void __fsnotify_inode_delete(struct inode *inode)
34 {
35         fsnotify_clear_marks_by_inode(inode);
36 }
37 EXPORT_SYMBOL_GPL(__fsnotify_inode_delete);
38
39 void __fsnotify_vfsmount_delete(struct vfsmount *mnt)
40 {
41         fsnotify_clear_marks_by_mount(mnt);
42 }
43
44 /**
45  * fsnotify_unmount_inodes - an sb is unmounting.  handle any watched inodes.
46  * @sb: superblock being unmounted.
47  *
48  * Called during unmount with no locks held, so needs to be safe against
49  * concurrent modifiers. We temporarily drop sb->s_inode_list_lock and CAN block.
50  */
51 static void fsnotify_unmount_inodes(struct super_block *sb)
52 {
53         struct inode *inode, *iput_inode = NULL;
54
55         spin_lock(&sb->s_inode_list_lock);
56         list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
57                 /*
58                  * We cannot __iget() an inode in state I_FREEING,
59                  * I_WILL_FREE, or I_NEW which is fine because by that point
60                  * the inode cannot have any associated watches.
61                  */
62                 spin_lock(&inode->i_lock);
63                 if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) {
64                         spin_unlock(&inode->i_lock);
65                         continue;
66                 }
67
68                 /*
69                  * If i_count is zero, the inode cannot have any watches and
70                  * doing an __iget/iput with SB_ACTIVE clear would actually
71                  * evict all inodes with zero i_count from icache which is
72                  * unnecessarily violent and may in fact be illegal to do.
73                  */
74                 if (!atomic_read(&inode->i_count)) {
75                         spin_unlock(&inode->i_lock);
76                         continue;
77                 }
78
79                 __iget(inode);
80                 spin_unlock(&inode->i_lock);
81                 spin_unlock(&sb->s_inode_list_lock);
82
83                 if (iput_inode)
84                         iput(iput_inode);
85
86                 /* for each watch, send FS_UNMOUNT and then remove it */
87                 fsnotify(inode, FS_UNMOUNT, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
88
89                 fsnotify_inode_delete(inode);
90
91                 iput_inode = inode;
92
93                 spin_lock(&sb->s_inode_list_lock);
94         }
95         spin_unlock(&sb->s_inode_list_lock);
96
97         if (iput_inode)
98                 iput(iput_inode);
99         /* Wait for outstanding inode references from connectors */
100         wait_var_event(&sb->s_fsnotify_inode_refs,
101                        !atomic_long_read(&sb->s_fsnotify_inode_refs));
102 }
103
104 void fsnotify_sb_delete(struct super_block *sb)
105 {
106         fsnotify_unmount_inodes(sb);
107         fsnotify_clear_marks_by_sb(sb);
108 }
109
110 /*
111  * fsnotify_nameremove - a filename was removed from a directory
112  *
113  * This is mostly called under parent vfs inode lock so name and
114  * dentry->d_parent should be stable. However there are some corner cases where
115  * inode lock is not held. So to be on the safe side and be reselient to future
116  * callers and out of tree users of d_delete(), we do not assume that d_parent
117  * and d_name are stable and we use dget_parent() and
118  * take_dentry_name_snapshot() to grab stable references.
119  */
120 void fsnotify_nameremove(struct dentry *dentry, int isdir)
121 {
122         struct dentry *parent;
123         struct name_snapshot name;
124         __u32 mask = FS_DELETE;
125
126         /* d_delete() of pseudo inode? (e.g. __ns_get_path() playing tricks) */
127         if (IS_ROOT(dentry))
128                 return;
129
130         if (isdir)
131                 mask |= FS_ISDIR;
132
133         parent = dget_parent(dentry);
134         /* Avoid unneeded take_dentry_name_snapshot() */
135         if (!(d_inode(parent)->i_fsnotify_mask & FS_DELETE) &&
136             !(dentry->d_sb->s_fsnotify_mask & FS_DELETE))
137                 goto out_dput;
138
139         take_dentry_name_snapshot(&name, dentry);
140
141         fsnotify(d_inode(parent), mask, d_inode(dentry), FSNOTIFY_EVENT_INODE,
142                  &name.name, 0);
143
144         release_dentry_name_snapshot(&name);
145
146 out_dput:
147         dput(parent);
148 }
149 EXPORT_SYMBOL(fsnotify_nameremove);
150
151 /*
152  * Given an inode, first check if we care what happens to our children.  Inotify
153  * and dnotify both tell their parents about events.  If we care about any event
154  * on a child we run all of our children and set a dentry flag saying that the
155  * parent cares.  Thus when an event happens on a child it can quickly tell if
156  * if there is a need to find a parent and send the event to the parent.
157  */
158 void __fsnotify_update_child_dentry_flags(struct inode *inode)
159 {
160         struct dentry *alias;
161         int watched;
162
163         if (!S_ISDIR(inode->i_mode))
164                 return;
165
166         /* determine if the children should tell inode about their events */
167         watched = fsnotify_inode_watches_children(inode);
168
169         spin_lock(&inode->i_lock);
170         /* run all of the dentries associated with this inode.  Since this is a
171          * directory, there damn well better only be one item on this list */
172         hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
173                 struct dentry *child;
174
175                 /* run all of the children of the original inode and fix their
176                  * d_flags to indicate parental interest (their parent is the
177                  * original inode) */
178                 spin_lock(&alias->d_lock);
179                 list_for_each_entry(child, &alias->d_subdirs, d_child) {
180                         if (!child->d_inode)
181                                 continue;
182
183                         spin_lock_nested(&child->d_lock, DENTRY_D_LOCK_NESTED);
184                         if (watched)
185                                 child->d_flags |= DCACHE_FSNOTIFY_PARENT_WATCHED;
186                         else
187                                 child->d_flags &= ~DCACHE_FSNOTIFY_PARENT_WATCHED;
188                         spin_unlock(&child->d_lock);
189                 }
190                 spin_unlock(&alias->d_lock);
191         }
192         spin_unlock(&inode->i_lock);
193 }
194
195 /* Notify this dentry's parent about a child's events. */
196 int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask)
197 {
198         struct dentry *parent;
199         struct inode *p_inode;
200         int ret = 0;
201
202         if (!dentry)
203                 dentry = path->dentry;
204
205         if (!(dentry->d_flags & DCACHE_FSNOTIFY_PARENT_WATCHED))
206                 return 0;
207
208         parent = dget_parent(dentry);
209         p_inode = parent->d_inode;
210
211         if (unlikely(!fsnotify_inode_watches_children(p_inode))) {
212                 __fsnotify_update_child_dentry_flags(p_inode);
213         } else if (p_inode->i_fsnotify_mask & mask & ALL_FSNOTIFY_EVENTS) {
214                 struct name_snapshot name;
215
216                 /* we are notifying a parent so come up with the new mask which
217                  * specifies these are events which came from a child. */
218                 mask |= FS_EVENT_ON_CHILD;
219
220                 take_dentry_name_snapshot(&name, dentry);
221                 if (path)
222                         ret = fsnotify(p_inode, mask, path, FSNOTIFY_EVENT_PATH,
223                                        &name.name, 0);
224                 else
225                         ret = fsnotify(p_inode, mask, dentry->d_inode, FSNOTIFY_EVENT_INODE,
226                                        &name.name, 0);
227                 release_dentry_name_snapshot(&name);
228         }
229
230         dput(parent);
231
232         return ret;
233 }
234 EXPORT_SYMBOL_GPL(__fsnotify_parent);
235
236 static int send_to_group(struct inode *to_tell,
237                          __u32 mask, const void *data,
238                          int data_is, u32 cookie,
239                          const struct qstr *file_name,
240                          struct fsnotify_iter_info *iter_info)
241 {
242         struct fsnotify_group *group = NULL;
243         __u32 test_mask = (mask & ALL_FSNOTIFY_EVENTS);
244         __u32 marks_mask = 0;
245         __u32 marks_ignored_mask = 0;
246         struct fsnotify_mark *mark;
247         int type;
248
249         if (WARN_ON(!iter_info->report_mask))
250                 return 0;
251
252         /* clear ignored on inode modification */
253         if (mask & FS_MODIFY) {
254                 fsnotify_foreach_obj_type(type) {
255                         if (!fsnotify_iter_should_report_type(iter_info, type))
256                                 continue;
257                         mark = iter_info->marks[type];
258                         if (mark &&
259                             !(mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
260                                 mark->ignored_mask = 0;
261                 }
262         }
263
264         fsnotify_foreach_obj_type(type) {
265                 if (!fsnotify_iter_should_report_type(iter_info, type))
266                         continue;
267                 mark = iter_info->marks[type];
268                 /* does the object mark tell us to do something? */
269                 if (mark) {
270                         group = mark->group;
271                         marks_mask |= mark->mask;
272                         marks_ignored_mask |= mark->ignored_mask;
273                 }
274         }
275
276         pr_debug("%s: group=%p to_tell=%p mask=%x marks_mask=%x marks_ignored_mask=%x"
277                  " data=%p data_is=%d cookie=%d\n",
278                  __func__, group, to_tell, mask, marks_mask, marks_ignored_mask,
279                  data, data_is, cookie);
280
281         if (!(test_mask & marks_mask & ~marks_ignored_mask))
282                 return 0;
283
284         return group->ops->handle_event(group, to_tell, mask, data, data_is,
285                                         file_name, cookie, iter_info);
286 }
287
288 static struct fsnotify_mark *fsnotify_first_mark(struct fsnotify_mark_connector **connp)
289 {
290         struct fsnotify_mark_connector *conn;
291         struct hlist_node *node = NULL;
292
293         conn = srcu_dereference(*connp, &fsnotify_mark_srcu);
294         if (conn)
295                 node = srcu_dereference(conn->list.first, &fsnotify_mark_srcu);
296
297         return hlist_entry_safe(node, struct fsnotify_mark, obj_list);
298 }
299
300 static struct fsnotify_mark *fsnotify_next_mark(struct fsnotify_mark *mark)
301 {
302         struct hlist_node *node = NULL;
303
304         if (mark)
305                 node = srcu_dereference(mark->obj_list.next,
306                                         &fsnotify_mark_srcu);
307
308         return hlist_entry_safe(node, struct fsnotify_mark, obj_list);
309 }
310
311 /*
312  * iter_info is a multi head priority queue of marks.
313  * Pick a subset of marks from queue heads, all with the
314  * same group and set the report_mask for selected subset.
315  * Returns the report_mask of the selected subset.
316  */
317 static unsigned int fsnotify_iter_select_report_types(
318                 struct fsnotify_iter_info *iter_info)
319 {
320         struct fsnotify_group *max_prio_group = NULL;
321         struct fsnotify_mark *mark;
322         int type;
323
324         /* Choose max prio group among groups of all queue heads */
325         fsnotify_foreach_obj_type(type) {
326                 mark = iter_info->marks[type];
327                 if (mark &&
328                     fsnotify_compare_groups(max_prio_group, mark->group) > 0)
329                         max_prio_group = mark->group;
330         }
331
332         if (!max_prio_group)
333                 return 0;
334
335         /* Set the report mask for marks from same group as max prio group */
336         iter_info->report_mask = 0;
337         fsnotify_foreach_obj_type(type) {
338                 mark = iter_info->marks[type];
339                 if (mark &&
340                     fsnotify_compare_groups(max_prio_group, mark->group) == 0)
341                         fsnotify_iter_set_report_type(iter_info, type);
342         }
343
344         return iter_info->report_mask;
345 }
346
347 /*
348  * Pop from iter_info multi head queue, the marks that were iterated in the
349  * current iteration step.
350  */
351 static void fsnotify_iter_next(struct fsnotify_iter_info *iter_info)
352 {
353         int type;
354
355         fsnotify_foreach_obj_type(type) {
356                 if (fsnotify_iter_should_report_type(iter_info, type))
357                         iter_info->marks[type] =
358                                 fsnotify_next_mark(iter_info->marks[type]);
359         }
360 }
361
362 /*
363  * This is the main call to fsnotify.  The VFS calls into hook specific functions
364  * in linux/fsnotify.h.  Those functions then in turn call here.  Here will call
365  * out to all of the registered fsnotify_group.  Those groups can then use the
366  * notification event in whatever means they feel necessary.
367  */
368 int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
369              const struct qstr *file_name, u32 cookie)
370 {
371         struct fsnotify_iter_info iter_info = {};
372         struct super_block *sb = to_tell->i_sb;
373         struct mount *mnt = NULL;
374         __u32 mnt_or_sb_mask = sb->s_fsnotify_mask;
375         int ret = 0;
376         __u32 test_mask = (mask & ALL_FSNOTIFY_EVENTS);
377
378         if (data_is == FSNOTIFY_EVENT_PATH) {
379                 mnt = real_mount(((const struct path *)data)->mnt);
380                 mnt_or_sb_mask |= mnt->mnt_fsnotify_mask;
381         }
382         /* An event "on child" is not intended for a mount/sb mark */
383         if (mask & FS_EVENT_ON_CHILD)
384                 mnt_or_sb_mask = 0;
385
386         /*
387          * Optimization: srcu_read_lock() has a memory barrier which can
388          * be expensive.  It protects walking the *_fsnotify_marks lists.
389          * However, if we do not walk the lists, we do not have to do
390          * SRCU because we have no references to any objects and do not
391          * need SRCU to keep them "alive".
392          */
393         if (!to_tell->i_fsnotify_marks && !sb->s_fsnotify_marks &&
394             (!mnt || !mnt->mnt_fsnotify_marks))
395                 return 0;
396         /*
397          * if this is a modify event we may need to clear the ignored masks
398          * otherwise return if neither the inode nor the vfsmount/sb care about
399          * this type of event.
400          */
401         if (!(mask & FS_MODIFY) &&
402             !(test_mask & (to_tell->i_fsnotify_mask | mnt_or_sb_mask)))
403                 return 0;
404
405         iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu);
406
407         iter_info.marks[FSNOTIFY_OBJ_TYPE_INODE] =
408                 fsnotify_first_mark(&to_tell->i_fsnotify_marks);
409         iter_info.marks[FSNOTIFY_OBJ_TYPE_SB] =
410                 fsnotify_first_mark(&sb->s_fsnotify_marks);
411         if (mnt) {
412                 iter_info.marks[FSNOTIFY_OBJ_TYPE_VFSMOUNT] =
413                         fsnotify_first_mark(&mnt->mnt_fsnotify_marks);
414         }
415
416         /*
417          * We need to merge inode/vfsmount/sb mark lists so that e.g. inode mark
418          * ignore masks are properly reflected for mount/sb mark notifications.
419          * That's why this traversal is so complicated...
420          */
421         while (fsnotify_iter_select_report_types(&iter_info)) {
422                 ret = send_to_group(to_tell, mask, data, data_is, cookie,
423                                     file_name, &iter_info);
424
425                 if (ret && (mask & ALL_FSNOTIFY_PERM_EVENTS))
426                         goto out;
427
428                 fsnotify_iter_next(&iter_info);
429         }
430         ret = 0;
431 out:
432         srcu_read_unlock(&fsnotify_mark_srcu, iter_info.srcu_idx);
433
434         return ret;
435 }
436 EXPORT_SYMBOL_GPL(fsnotify);
437
438 extern struct kmem_cache *fsnotify_mark_connector_cachep;
439
440 static __init int fsnotify_init(void)
441 {
442         int ret;
443
444         BUILD_BUG_ON(HWEIGHT32(ALL_FSNOTIFY_BITS) != 25);
445
446         ret = init_srcu_struct(&fsnotify_mark_srcu);
447         if (ret)
448                 panic("initializing fsnotify_mark_srcu");
449
450         fsnotify_mark_connector_cachep = KMEM_CACHE(fsnotify_mark_connector,
451                                                     SLAB_PANIC);
452
453         return 0;
454 }
455 core_initcall(fsnotify_init);