Merge tag 'amd-drm-next-5.12-2021-01-08' of https://gitlab.freedesktop.org/agd5f...
[linux-2.6-microblaze.git] / fs / notify / inotify / inotify_user.c
index 186722b..59c1770 100644 (file)
 
 #include <asm/ioctls.h>
 
+/*
+ * An inotify watch requires allocating an inotify_inode_mark structure as
+ * well as pinning the watched inode. Doubling the size of a VFS inode
+ * should be more than enough to cover the additional filesystem inode
+ * size increase.
+ */
+#define INOTIFY_WATCH_COST     (sizeof(struct inotify_inode_mark) + \
+                                2 * sizeof(struct inode))
+
 /* configurable via /proc/sys/fs/inotify/ */
 static int inotify_max_queued_events __read_mostly;
 
@@ -486,14 +495,10 @@ void inotify_ignored_and_remove_idr(struct fsnotify_mark *fsn_mark,
                                    struct fsnotify_group *group)
 {
        struct inotify_inode_mark *i_mark;
-       struct fsnotify_iter_info iter_info = { };
-
-       fsnotify_iter_set_report_type_mark(&iter_info, FSNOTIFY_OBJ_TYPE_INODE,
-                                          fsn_mark);
 
        /* Queue ignore event for the watch */
-       inotify_handle_event(group, FS_IN_IGNORED, NULL, FSNOTIFY_EVENT_NONE,
-                            NULL, NULL, 0, &iter_info);
+       inotify_handle_inode_event(fsn_mark, FS_IN_IGNORED, NULL, NULL, NULL,
+                                  0);
 
        i_mark = container_of(fsn_mark, struct inotify_inode_mark, fsn_mark);
        /* remove this mark from the idr */
@@ -801,6 +806,18 @@ out:
  */
 static int __init inotify_user_setup(void)
 {
+       unsigned long watches_max;
+       struct sysinfo si;
+
+       si_meminfo(&si);
+       /*
+        * Allow up to 1% of addressable memory to be allocated for inotify
+        * watches (per user) limited to the range [8192, 1048576].
+        */
+       watches_max = (((si.totalram - si.totalhigh) / 100) << PAGE_SHIFT) /
+                       INOTIFY_WATCH_COST;
+       watches_max = clamp(watches_max, 8192UL, 1048576UL);
+
        BUILD_BUG_ON(IN_ACCESS != FS_ACCESS);
        BUILD_BUG_ON(IN_MODIFY != FS_MODIFY);
        BUILD_BUG_ON(IN_ATTRIB != FS_ATTRIB);
@@ -827,7 +844,7 @@ static int __init inotify_user_setup(void)
 
        inotify_max_queued_events = 16384;
        init_user_ns.ucount_max[UCOUNT_INOTIFY_INSTANCES] = 128;
-       init_user_ns.ucount_max[UCOUNT_INOTIFY_WATCHES] = 8192;
+       init_user_ns.ucount_max[UCOUNT_INOTIFY_WATCHES] = watches_max;
 
        return 0;
 }