struct fsnotify_mark *mark,
struct fsnotify_event *event)
{
- struct fsnotify_mark *fsn_mark;
struct inotify_inode_mark *i_mark;
struct inode *to_tell;
struct inotify_event_private_data *event_priv;
to_tell = event->to_tell;
- fsn_mark = fsnotify_find_inode_mark(group, to_tell);
- /* race with watch removal? We already passes should_send */
- if (unlikely(!fsn_mark))
- return 0;
- i_mark = container_of(fsn_mark, struct inotify_inode_mark,
+ i_mark = container_of(mark, struct inotify_inode_mark,
fsn_mark);
wd = i_mark->wd;
ret = PTR_ERR(added_event);
}
- if (fsn_mark->mask & IN_ONESHOT)
- fsnotify_destroy_mark(fsn_mark);
-
- /*
- * If we hold the fsn_mark until after the event is on the queue
- * IN_IGNORED won't be able to pass this event in the queue
- */
- fsnotify_put_mark(fsn_mark);
+ if (mark->mask & IN_ONESHOT)
+ fsnotify_destroy_mark(mark);
return ret;
}
struct vfsmount *mnt, struct fsnotify_mark *mark,
__u32 mask, void *data, int data_type)
{
- struct fsnotify_mark *fsn_mark;
bool send;
pr_debug("%s: group=%p inode=%p mask=%x data=%p data_type=%d\n",
__func__, group, inode, mask, data, data_type);
- fsn_mark = fsnotify_find_inode_mark(group, inode);
- if (!fsn_mark)
- return false;
-
mask = (mask & ~FS_EVENT_ON_CHILD);
- send = (fsn_mark->mask & mask);
+ send = (mark->mask & mask);
- if (send && (fsn_mark->mask & FS_EXCL_UNLINK) &&
+ if (send && (mark->mask & FS_EXCL_UNLINK) &&
(data_type == FSNOTIFY_EVENT_FILE)) {
struct file *file = data;
send = false;
}
- /* find took a reference */
- fsnotify_put_mark(fsn_mark);
-
return send;
}