};
 #endif /* CONFIG_SYSCTL */
 
-static inline __u32 inotify_arg_to_mask(u32 arg)
+static inline __u32 inotify_arg_to_mask(struct inode *inode, u32 arg)
 {
        __u32 mask;
 
        /*
-        * everything should accept their own ignored, cares about children,
-        * and should receive events when the inode is unmounted
+        * Everything should accept their own ignored and should receive events
+        * when the inode is unmounted.  All directories care about children.
         */
-       mask = (FS_IN_IGNORED | FS_EVENT_ON_CHILD | FS_UNMOUNT);
+       mask = (FS_IN_IGNORED | FS_UNMOUNT);
+       if (S_ISDIR(inode->i_mode))
+               mask |= FS_EVENT_ON_CHILD;
 
        /* mask off the flags used to open the fd */
        mask |= (arg & (IN_ALL_EVENTS | IN_ONESHOT | IN_EXCL_UNLINK));
        int create = (arg & IN_MASK_CREATE);
        int ret;
 
-       mask = inotify_arg_to_mask(arg);
+       mask = inotify_arg_to_mask(inode, arg);
 
        fsn_mark = fsnotify_find_mark(&inode->i_fsnotify_marks, group);
        if (!fsn_mark)
        struct idr *idr = &group->inotify_data.idr;
        spinlock_t *idr_lock = &group->inotify_data.idr_lock;
 
-       mask = inotify_arg_to_mask(arg);
+       mask = inotify_arg_to_mask(inode, arg);
 
        tmp_i_mark = kmem_cache_alloc(inotify_inode_mark_cachep, GFP_KERNEL);
        if (unlikely(!tmp_i_mark))