summaryrefslogtreecommitdiffstats
path: root/fs/notify
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2010-07-28 16:18:38 +0200
committerEric Paris <eparis@redhat.com>2010-07-28 16:18:52 +0200
commit7f6b6117e1803777fcf48fe31bd236a7fbf740db (patch)
treee86b8bd3a16155447a215a758960092021006311 /fs/notify
parentfsnotify: send fsnotify_mark to groups in event handling functions (diff)
downloadlinux-7f6b6117e1803777fcf48fe31bd236a7fbf740db.tar.xz
linux-7f6b6117e1803777fcf48fe31bd236a7fbf740db.zip
inotify: use the mark in handler functions
inotify now gets a mark in the should_send_event and handle_event functions. Rather than look up the mark themselves inotify should just use the mark it was handed. Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'fs/notify')
-rw-r--r--fs/notify/inotify/inotify_fsnotify.c29
1 files changed, 5 insertions, 24 deletions
diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c
index dbd76bbb3e21..aa3f93c03e0f 100644
--- a/fs/notify/inotify/inotify_fsnotify.c
+++ b/fs/notify/inotify/inotify_fsnotify.c
@@ -93,7 +93,6 @@ static int inotify_handle_event(struct fsnotify_group *group,
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;
@@ -106,11 +105,7 @@ static int inotify_handle_event(struct fsnotify_group *group,
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;
@@ -132,14 +127,8 @@ static int inotify_handle_event(struct fsnotify_group *group,
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;
}
@@ -153,20 +142,15 @@ static bool inotify_should_send_event(struct fsnotify_group *group, struct inode
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;
@@ -174,9 +158,6 @@ static bool inotify_should_send_event(struct fsnotify_group *group, struct inode
send = false;
}
- /* find took a reference */
- fsnotify_put_mark(fsn_mark);
-
return send;
}