1/*
2 * Directory notification for Linux
3 *
4 * Copyright (C) 2000,2002 Stephen Rothwell
5 */
6
7struct dnotify_struct {
8	struct dnotify_struct *	dn_next;
9	unsigned long		dn_mask;	/* Events to be notified
10						   see linux/fcntl.h */
11	int			dn_fd;
12	struct file *		dn_filp;
13	fl_owner_t		dn_owner;
14};
15
16extern void __inode_dir_notify(struct inode *, unsigned long);
17extern void dnotify_flush(struct file *filp, fl_owner_t id);
18extern int fcntl_dirnotify(int, struct file *, unsigned long);
19
20static inline void inode_dir_notify(struct inode *inode, unsigned long event)
21{
22	if ((inode)->i_dnotify_mask & (event))
23		__inode_dir_notify(inode, event);
24}
25
26/*
27 * This is hopelessly wrong, but unfixable without API changes.  At
28 * least it doesn't oops the kernel...
29 */
30static inline void dnotify_parent(struct dentry *dentry, unsigned long event)
31{
32	struct dentry *parent;
33	spin_lock(&dcache_lock);
34	parent = dentry->d_parent;
35	if (parent->d_inode->i_dnotify_mask & event) {
36		dget(parent);
37		spin_unlock(&dcache_lock);
38		__inode_dir_notify(parent->d_inode, event);
39		dput(parent);
40	} else
41		spin_unlock(&dcache_lock);
42}
43