fsnotify: allow fsnotify_{peek,remove}_first_event with empty queue
[linux-2.6-microblaze.git] / fs / notify / notification.c
index 75d79d6..001cfe7 100644 (file)
@@ -47,13 +47,6 @@ u32 fsnotify_get_cookie(void)
 }
 EXPORT_SYMBOL_GPL(fsnotify_get_cookie);
 
-/* return true if the notify queue is empty, false otherwise */
-bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group)
-{
-       assert_spin_locked(&group->notification_lock);
-       return list_empty(&group->notification_list) ? true : false;
-}
-
 void fsnotify_destroy_event(struct fsnotify_group *group,
                            struct fsnotify_event *event)
 {
@@ -141,33 +134,36 @@ void fsnotify_remove_queued_event(struct fsnotify_group *group,
 }
 
 /*
- * Remove and return the first event from the notification list.  It is the
- * responsibility of the caller to destroy the obtained event
+ * Return the first event on the notification list without removing it.
+ * Returns NULL if the list is empty.
  */
-struct fsnotify_event *fsnotify_remove_first_event(struct fsnotify_group *group)
+struct fsnotify_event *fsnotify_peek_first_event(struct fsnotify_group *group)
 {
-       struct fsnotify_event *event;
-
        assert_spin_locked(&group->notification_lock);
 
-       pr_debug("%s: group=%p\n", __func__, group);
+       if (fsnotify_notify_queue_is_empty(group))
+               return NULL;
 
-       event = list_first_entry(&group->notification_list,
-                                struct fsnotify_event, list);
-       fsnotify_remove_queued_event(group, event);
-       return event;
+       return list_first_entry(&group->notification_list,
+                               struct fsnotify_event, list);
 }
 
 /*
- * This will not remove the event, that must be done with
- * fsnotify_remove_first_event()
+ * Remove and return the first event from the notification list.  It is the
+ * responsibility of the caller to destroy the obtained event
  */
-struct fsnotify_event *fsnotify_peek_first_event(struct fsnotify_group *group)
+struct fsnotify_event *fsnotify_remove_first_event(struct fsnotify_group *group)
 {
-       assert_spin_locked(&group->notification_lock);
+       struct fsnotify_event *event = fsnotify_peek_first_event(group);
 
-       return list_first_entry(&group->notification_list,
-                               struct fsnotify_event, list);
+       if (!event)
+               return NULL;
+
+       pr_debug("%s: group=%p event=%p\n", __func__, group, event);
+
+       fsnotify_remove_queued_event(group, event);
+
+       return event;
 }
 
 /*