log: Add filter flag to deny on match
authorSean Anderson <seanga2@gmail.com>
Tue, 27 Oct 2020 23:55:26 +0000 (19:55 -0400)
committerTom Rini <trini@konsulko.com>
Fri, 30 Oct 2020 14:55:26 +0000 (10:55 -0400)
Without this flag, log filters can only explicitly accept messages.
Allowing denial makes it easier to filter certain subsystems. Unlike
allow-ing filters, deny-ing filters are added to the beginning of the
filter list. This should do the Right Thing most of the time, but it's
less-universal than allowing filters to be inserted anywhere. If this
becomes a problem, then perhaps log_filter_add* should take a filter number
to insert before/after.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/log.c
include/log.h

index b7b144f..c1b6b61 100644 (file)
@@ -170,7 +170,11 @@ static bool log_passes_filters(struct log_device *ldev, struct log_rec *rec)
                if (filt->file_list &&
                    !log_has_file(filt->file_list, rec->file))
                        continue;
-               return true;
+
+               if (filt->flags & LOGFF_DENY)
+                       return false;
+               else
+                       return true;
        }
 
        return false;
@@ -284,7 +288,11 @@ int log_add_filter_flags(const char *drv_name, enum log_category_t cat_list[],
                }
        }
        filt->filter_num = ldev->next_filter_num++;
-       list_add_tail(&filt->sibling_node, &ldev->filter_head);
+       /* Add deny filters to the beginning of the list */
+       if (flags & LOGFF_DENY)
+               list_add(&filt->sibling_node, &ldev->filter_head);
+       else
+               list_add_tail(&filt->sibling_node, &ldev->filter_head);
 
        return filt->filter_num;
 
index ee94f14..05833f2 100644 (file)
@@ -361,13 +361,22 @@ enum {
        LOGF_MAX_CATEGORIES = 5,        /* maximum categories per filter */
 };
 
+/**
+ * enum log_filter_flags - Flags which modify a filter
+ */
 enum log_filter_flags {
-       LOGFF_HAS_CAT           = 1 << 0,       /* Filter has a category list */
+       /** @LOGFF_HAS_CAT: Filter has a category list */
+       LOGFF_HAS_CAT   = 1 << 0,
+       /** @LOGFF_DENY: Filter denies matching messages */
+       LOGFF_DENY      = 1 << 1,
 };
 
 /**
  * struct log_filter - criterial to filter out log messages
  *
+ * If a message matches all criteria, then it is allowed. If LOGFF_DENY is set,
+ * then it is denied instead.
+ *
  * @filter_num: Sequence number of this filter.  This is returned when adding a
  *     new filter, and must be provided when removing a previously added
  *     filter.