xref: /openbmc/linux/fs/notify/fsnotify.c (revision 1fa0a7dc)
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);
456