aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify/notification.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/notify/notification.c')
-rw-r--r--fs/notify/notification.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/fs/notify/notification.c b/fs/notify/notification.c
index 18b3c4427dca..1e58402171a5 100644
--- a/fs/notify/notification.c
+++ b/fs/notify/notification.c
@@ -80,7 +80,8 @@ void fsnotify_destroy_event(struct fsnotify_group *group,
80/* 80/*
81 * Add an event to the group notification queue. The group can later pull this 81 * Add an event to the group notification queue. The group can later pull this
82 * event off the queue to deal with. The function returns 0 if the event was 82 * event off the queue to deal with. The function returns 0 if the event was
83 * added to the queue, 1 if the event was merged with some other queued event. 83 * added to the queue, 1 if the event was merged with some other queued event,
84 * 2 if the queue of events has overflown.
84 */ 85 */
85int fsnotify_add_notify_event(struct fsnotify_group *group, 86int fsnotify_add_notify_event(struct fsnotify_group *group,
86 struct fsnotify_event *event, 87 struct fsnotify_event *event,
@@ -95,10 +96,14 @@ int fsnotify_add_notify_event(struct fsnotify_group *group,
95 mutex_lock(&group->notification_mutex); 96 mutex_lock(&group->notification_mutex);
96 97
97 if (group->q_len >= group->max_events) { 98 if (group->q_len >= group->max_events) {
99 ret = 2;
98 /* Queue overflow event only if it isn't already queued */ 100 /* Queue overflow event only if it isn't already queued */
99 if (list_empty(&group->overflow_event.list)) 101 if (!list_empty(&group->overflow_event->list)) {
100 event = &group->overflow_event; 102 mutex_unlock(&group->notification_mutex);
101 ret = 1; 103 return ret;
104 }
105 event = group->overflow_event;
106 goto queue;
102 } 107 }
103 108
104 if (!list_empty(list) && merge) { 109 if (!list_empty(list) && merge) {
@@ -109,6 +114,7 @@ int fsnotify_add_notify_event(struct fsnotify_group *group,
109 } 114 }
110 } 115 }
111 116
117queue:
112 group->q_len++; 118 group->q_len++;
113 list_add_tail(&event->list, list); 119 list_add_tail(&event->list, list);
114 mutex_unlock(&group->notification_mutex); 120 mutex_unlock(&group->notification_mutex);
@@ -132,7 +138,11 @@ struct fsnotify_event *fsnotify_remove_notify_event(struct fsnotify_group *group
132 138
133 event = list_first_entry(&group->notification_list, 139 event = list_first_entry(&group->notification_list,
134 struct fsnotify_event, list); 140 struct fsnotify_event, list);
135 list_del(&event->list); 141 /*
142 * We need to init list head for the case of overflow event so that
143 * check in fsnotify_add_notify_events() works
144 */
145 list_del_init(&event->list);
136 group->q_len--; 146 group->q_len--;
137 147
138 return event; 148 return event;