Since FAN_FS_ERROR memory must be pre-allocated, limit a single group from watching too many file systems at once. The current scheme guarantees 1 slot per filesystem, so limit the number of marks with FAN_FS_ERROR per group. Signed-off-by: Gabriel Krisman Bertazi <krisman@xxxxxxxxxxxxx> --- fs/notify/fanotify/fanotify_user.c | 10 ++++++++++ include/linux/fsnotify_backend.h | 1 + 2 files changed, 11 insertions(+) diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index f1cf863d6f9f..5324890500fc 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -959,6 +959,10 @@ static int fanotify_remove_mark(struct fsnotify_group *group, removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags, umask, &destroy_mark); + + if (removed & FAN_FS_ERROR) + group->fanotify_data.error_event_marks--; + if (removed & fsnotify_conn_mask(fsn_mark->connector)) fsnotify_recalc_mask(fsn_mark->connector); if (destroy_mark) @@ -1057,6 +1061,9 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group, static int fanotify_group_init_error_pool(struct fsnotify_group *group) { + if (group->fanotify_data.error_event_marks >= FANOTIFY_DEFAULT_FEE_POOL) + return -ENOMEM; + if (mempool_initialized(&group->fanotify_data.error_events_pool)) return 0; @@ -1098,6 +1105,9 @@ static int fanotify_add_mark(struct fsnotify_group *group, if (added & ~fsnotify_conn_mask(fsn_mark->connector)) fsnotify_recalc_mask(fsn_mark->connector); + if (!(flags & FAN_MARK_IGNORED_MASK) && (mask & FAN_FS_ERROR)) + group->fanotify_data.error_event_marks++; + out: mutex_unlock(&group->mark_mutex); diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h index 9941c06b8c8a..96e1d31394ce 100644 --- a/include/linux/fsnotify_backend.h +++ b/include/linux/fsnotify_backend.h @@ -247,6 +247,7 @@ struct fsnotify_group { int f_flags; /* event_f_flags from fanotify_init() */ struct ucounts *ucounts; mempool_t error_events_pool; + unsigned int error_event_marks; } fanotify_data; #endif /* CONFIG_FANOTIFY */ }; -- 2.33.0