inotify: use the mark in handler functions
Eric Paris [Wed, 28 Jul 2010 14:18:38 +0000 (10:18 -0400)]
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>

fs/notify/inotify/inotify_fsnotify.c

index dbd76bb..aa3f93c 100644 (file)
@@ -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;
 }