From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932264AbbHNNnY (ORCPT ); Fri, 14 Aug 2015 09:43:24 -0400 Received: from mga11.intel.com ([192.55.52.93]:36801 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752753AbbHNNnX (ORCPT ); Fri, 14 Aug 2015 09:43:23 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,678,1432623600"; d="scan'208";a="783700450" From: Andy Shevchenko To: Arnd Bergmann , Casey Schaufler , linux-kernel@vger.kernel.org Cc: Andy Shevchenko Subject: [RFC][PATCH v1 1/1] Add WARN_ONCE_RETURN macro Date: Fri, 14 Aug 2015 16:43:19 +0300 Message-Id: <1439559799-116694-1-git-send-email-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.5.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The rationale is to replace the if (condition) { WARN_ONCE(1, ...); return value; } by WARN_ONCE_RETURN(condition, value, ...); Signed-off-by: Andy Shevchenko --- include/asm-generic/bug.h | 17 +++++++++++++++++ security/smack/smack_lsm.c | 5 +---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index 630dd23..fbf20fd 100644 --- a/include/asm-generic/bug.h +++ b/include/asm-generic/bug.h @@ -126,6 +126,18 @@ extern void warn_slowpath_null(const char *file, const int line); unlikely(__ret_warn_once); \ }) +#define WARN_ONCE_RETURN(condition, value, format...) \ +do { \ + static bool __section(.data.unlikely) __warned; \ + int __ret_warn_once = !!(condition); \ + \ + if (unlikely(__ret_warn_once)) { \ + if (WARN(!__warned, format)) \ + __warned = true; \ + return value; \ + } \ +} while (0) + #define WARN_TAINT_ONCE(condition, taint, format...) ({ \ static bool __section(.data.unlikely) __warned; \ int __ret_warn_once = !!(condition); \ @@ -162,6 +174,11 @@ extern void warn_slowpath_null(const char *file, const int line); #define WARN_ON_ONCE(condition) WARN_ON(condition) #define WARN_ONCE(condition, format...) WARN(condition, format) +#define WARN_ONCE_RETURN(condition, value, format...) \ +do { \ + if (WARN(condition, format)) \ + return value; \ +} while (0) #define WARN_TAINT(condition, taint, format...) WARN(condition, format) #define WARN_TAINT_ONCE(condition, taint, format...) WARN(condition, format) diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 54fb3a1..4160d0e 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -4401,10 +4401,7 @@ static int smack_audit_rule_match(u32 secid, u32 field, u32 op, void *vrule, struct smack_known *skp; char *rule = vrule; - if (unlikely(!rule)) { - WARN_ONCE(1, "Smack: missing rule\n"); - return -ENOENT; - } + WARN_ONCE_RETURN(unlikely(!rule), -ENOENT, "Smack: missing rule\n"); if (field != AUDIT_SUBJ_USER && field != AUDIT_OBJ_USER) return 0; -- 2.5.0