OSDN Git Service

ratelimit: fix WARN_ON_RATELIMIT return value
authorJiri Slaby <jslaby@suse.cz>
Tue, 20 Dec 2016 00:23:12 +0000 (16:23 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 20 Dec 2016 17:48:47 +0000 (09:48 -0800)
The macro is to be used similarly as WARN_ON as:

  if (WARN_ON_RATELIMIT(condition, state))
do_something();

One would expect only 'condition' to affect the 'if', but
WARN_ON_RATELIMIT does internally only:

  WARN_ON((condition) && __ratelimit(state))

So the 'if' is affected by the ratelimiting state too.  Fix this by
returning 'condition' in any case.

Note that nobody uses WARN_ON_RATELIMIT yet, so there is nothing to
worry about.  But I was about to use it and was a bit surprised.

Link: http://lkml.kernel.org/r/20161215093224.23126-1-jslaby@suse.cz
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/ratelimit.h

index 57c9e06..56375ed 100644 (file)
@@ -77,8 +77,11 @@ extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
 
 #ifdef CONFIG_PRINTK
 
-#define WARN_ON_RATELIMIT(condition, state)                    \
-               WARN_ON((condition) && __ratelimit(state))
+#define WARN_ON_RATELIMIT(condition, state)    ({              \
+       bool __rtn_cond = !!(condition);                        \
+       WARN_ON(__rtn_cond && __ratelimit(state));              \
+       __rtn_cond;                                             \
+})
 
 #define WARN_RATELIMIT(condition, format, ...)                 \
 ({                                                             \