23 #include <linux/module.h>
62 watched = fsnotify_inode_watches_children(inode);
83 spin_unlock(&child->
d_lock);
85 spin_unlock(&alias->
d_lock);
87 spin_unlock(&inode->
i_lock);
94 struct inode *p_inode;
106 if (
unlikely(!fsnotify_inode_watches_children(p_inode)))
108 else if (p_inode->i_fsnotify_mask & mask) {
111 mask |= FS_EVENT_ON_CHILD;
114 ret =
fsnotify(p_inode, mask, path, FSNOTIFY_EVENT_PATH,
127 static int send_to_group(
struct inode *to_tell,
128 struct fsnotify_mark *inode_mark,
129 struct fsnotify_mark *vfsmount_mark,
133 struct fsnotify_event **
event)
136 __u32 inode_test_mask = 0;
137 __u32 vfsmount_test_mask = 0;
139 if (
unlikely(!inode_mark && !vfsmount_mark)) {
145 if (mask & FS_MODIFY) {
147 !(inode_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
148 inode_mark->ignored_mask = 0;
150 !(vfsmount_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
151 vfsmount_mark->ignored_mask = 0;
156 group = inode_mark->group;
157 inode_test_mask = (mask & ~FS_EVENT_ON_CHILD);
158 inode_test_mask &= inode_mark->mask;
159 inode_test_mask &= ~inode_mark->ignored_mask;
164 vfsmount_test_mask = (mask & ~FS_EVENT_ON_CHILD);
165 group = vfsmount_mark->group;
166 vfsmount_test_mask &= vfsmount_mark->mask;
167 vfsmount_test_mask &= ~vfsmount_mark->ignored_mask;
169 vfsmount_test_mask &= ~inode_mark->ignored_mask;
172 pr_debug(
"%s: group=%p to_tell=%p mask=%x inode_mark=%p"
173 " inode_test_mask=%x vfsmount_mark=%p vfsmount_test_mask=%x"
174 " data=%p data_is=%d cookie=%d event=%p\n",
175 __func__, group, to_tell, mask, inode_mark,
176 inode_test_mask, vfsmount_mark, vfsmount_test_mask, data,
177 data_is, cookie, *event);
179 if (!inode_test_mask && !vfsmount_test_mask)
182 if (group->ops->should_send_event(group, to_tell, inode_mark,
183 vfsmount_mark, mask, data,
194 return group->ops->handle_event(group, inode_mark, vfsmount_mark, *event);
204 const unsigned char *file_name,
u32 cookie)
207 struct fsnotify_mark *inode_mark =
NULL, *vfsmount_mark =
NULL;
208 struct fsnotify_group *inode_group, *vfsmount_group;
209 struct fsnotify_event *
event =
NULL;
213 __u32 test_mask = (mask & ~FS_EVENT_ON_CHILD);
215 if (data_is == FSNOTIFY_EVENT_PATH)
216 mnt = real_mount(((
struct path *)data)->mnt);
225 if (!(mask & FS_MODIFY) &&
226 !(test_mask & to_tell->i_fsnotify_mask) &&
227 !(mnt && test_mask & mnt->mnt_fsnotify_mask))
232 if ((mask & FS_MODIFY) ||
233 (test_mask & to_tell->i_fsnotify_mask))
237 if (mnt && ((mask & FS_MODIFY) ||
238 (test_mask & mnt->mnt_fsnotify_mask))) {
245 while (inode_node || vfsmount_node) {
246 inode_group = vfsmount_group =
NULL;
250 struct fsnotify_mark,
i.i_list);
251 inode_group = inode_mark->group;
256 struct fsnotify_mark,
m.m_list);
257 vfsmount_group = vfsmount_mark->group;
260 if (inode_group > vfsmount_group) {
262 ret = send_to_group(to_tell, inode_mark,
NULL, mask, data,
263 data_is, cookie, file_name, &event);
265 vfsmount_group =
NULL;
266 }
else if (vfsmount_group > inode_group) {
267 ret = send_to_group(to_tell,
NULL, vfsmount_mark, mask, data,
268 data_is, cookie, file_name, &event);
271 ret = send_to_group(to_tell, inode_mark, vfsmount_mark,
272 mask, data, data_is, cookie, file_name,
276 if (ret && (mask & ALL_FSNOTIFY_PERM_EVENTS))
300 static __init int fsnotify_init(
void)
308 panic(
"initializing fsnotify_mark_srcu");