if (!group->ops->should_send_event(group, to_tell, mask))
                                continue;
                        if (!event) {
-                               event = fsnotify_create_event(to_tell, mask, data, data_is, file_name, cookie);
+                               event = fsnotify_create_event(to_tell, mask, data,
+                                                             data_is, file_name, cookie,
+                                                             GFP_KERNEL);
                                /* shit, we OOM'd and now we can't tell, maybe
                                 * someday someone else will want to do something
                                 * here */
 
 
 static struct kmem_cache *inotify_inode_mark_cachep __read_mostly;
 struct kmem_cache *event_priv_cachep __read_mostly;
-static struct fsnotify_event *inotify_ignored_event;
 
 /*
  * When inotify registers a new group it increments this and uses that
                                    struct fsnotify_group *group)
 {
        struct inotify_inode_mark_entry *ientry;
+       struct fsnotify_event *ignored_event;
        struct inotify_event_private_data *event_priv;
        struct fsnotify_event_private_data *fsn_event_priv;
 
+       ignored_event = fsnotify_create_event(NULL, FS_IN_IGNORED, NULL,
+                                             FSNOTIFY_EVENT_NONE, NULL, 0,
+                                             GFP_NOFS);
+       if (!ignored_event)
+               return;
+
        ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry);
 
-       event_priv = kmem_cache_alloc(event_priv_cachep, GFP_KERNEL);
+       event_priv = kmem_cache_alloc(event_priv_cachep, GFP_NOFS);
        if (unlikely(!event_priv))
                goto skip_send_ignore;
 
        fsn_event_priv->group = group;
        event_priv->wd = ientry->wd;
 
-       fsnotify_add_notify_event(group, inotify_ignored_event, fsn_event_priv);
+       fsnotify_add_notify_event(group, ignored_event, fsn_event_priv);
 
        /* did the private data get added? */
        if (list_empty(&fsn_event_priv->event_list))
 
 skip_send_ignore:
 
+       /* matches the reference taken when the event was created */
+       fsnotify_put_event(ignored_event);
+
        /* remove this entry from the idr */
        inotify_remove_from_idr(group, ientry);
 
 
        inotify_inode_mark_cachep = KMEM_CACHE(inotify_inode_mark_entry, SLAB_PANIC);
        event_priv_cachep = KMEM_CACHE(inotify_event_private_data, SLAB_PANIC);
-       inotify_ignored_event = fsnotify_create_event(NULL, FS_IN_IGNORED, NULL, FSNOTIFY_EVENT_NONE, NULL, 0);
-       if (!inotify_ignored_event)
-               panic("unable to allocate the inotify ignored event\n");
 
        inotify_max_queued_events = 16384;
        inotify_max_user_instances = 128;
 
                                return true;
                        break;
                case (FSNOTIFY_EVENT_NONE):
-                       return true;
+                       return false;
                };
        }
        return false;
  * @name the filename, if available
  */
 struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, void *data,
-                                            int data_type, const char *name, u32 cookie)
+                                            int data_type, const char *name, u32 cookie,
+                                            gfp_t gfp)
 {
        struct fsnotify_event *event;
 
-       event = kmem_cache_alloc(fsnotify_event_cachep, GFP_KERNEL);
+       event = kmem_cache_alloc(fsnotify_event_cachep, gfp);
        if (!event)
                return NULL;
 
        initialize_event(event);
 
        if (name) {
-               event->file_name = kstrdup(name, GFP_KERNEL);
+               event->file_name = kstrdup(name, gfp);
                if (!event->file_name) {
                        kmem_cache_free(fsnotify_event_cachep, event);
                        return NULL;