1 /*
2  * Directory notification for Linux
3  *
4  * Copyright (C) 2000,2002 Stephen Rothwell
5  */
6 
7 struct 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 
16 extern void __inode_dir_notify(struct inode *, unsigned long);
17 extern void dnotify_flush(struct file *filp, fl_owner_t id);
18 extern int fcntl_dirnotify(int, struct file *, unsigned long);
19 
inode_dir_notify(struct inode * inode,unsigned long event)20 static 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  */
dnotify_parent(struct dentry * dentry,unsigned long event)30 static 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