]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - fs/notify/fanotify/fanotify.c
fanotify: do not clone on merge unless needed
[net-next-2.6.git] / fs / notify / fanotify / fanotify.c
index 8e574d6f6a80f9a24de812aacff8a9b0b73328f8..5b0b6b485a9cb8b5aeee89f36e54989bbdde1ef6 100644 (file)
@@ -46,6 +46,16 @@ static int fanotify_merge(struct list_head *list, struct fsnotify_event *event)
                        if (test_event->mask == event->mask)
                                goto out;
 
+                       /*
+                        * if the refcnt == 1 this is the only queue
+                        * for this event and so we can update the mask
+                        * in place.
+                        */
+                       if (atomic_read(&test_event->refcnt) == 1) {
+                               test_event->mask |= event->mask;
+                               goto out;
+                       }
+
                        /* can't allocate memory, merge was no possible */
                        new_event = fsnotify_clone_event(test_event);
                        if (unlikely(!new_event)) {