|
@@ -80,7 +80,8 @@ void fsnotify_destroy_event(struct fsnotify_group *group,
|
|
|
/*
|
|
|
* Add an event to the group notification queue. The group can later pull this
|
|
|
* event off the queue to deal with. The function returns 0 if the event was
|
|
|
- * added to the queue, 1 if the event was merged with some other queued event.
|
|
|
+ * added to the queue, 1 if the event was merged with some other queued event,
|
|
|
+ * 2 if the queue of events has overflown.
|
|
|
*/
|
|
|
int fsnotify_add_notify_event(struct fsnotify_group *group,
|
|
|
struct fsnotify_event *event,
|
|
@@ -95,10 +96,14 @@ int fsnotify_add_notify_event(struct fsnotify_group *group,
|
|
|
mutex_lock(&group->notification_mutex);
|
|
|
|
|
|
if (group->q_len >= group->max_events) {
|
|
|
+ ret = 2;
|
|
|
/* Queue overflow event only if it isn't already queued */
|
|
|
- if (list_empty(&group->overflow_event.list))
|
|
|
- event = &group->overflow_event;
|
|
|
- ret = 1;
|
|
|
+ if (!list_empty(&group->overflow_event.list)) {
|
|
|
+ mutex_unlock(&group->notification_mutex);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ event = &group->overflow_event;
|
|
|
+ goto queue;
|
|
|
}
|
|
|
|
|
|
if (!list_empty(list) && merge) {
|
|
@@ -109,6 +114,7 @@ int fsnotify_add_notify_event(struct fsnotify_group *group,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+queue:
|
|
|
group->q_len++;
|
|
|
list_add_tail(&event->list, list);
|
|
|
mutex_unlock(&group->notification_mutex);
|