| From 4f6676e07edee820c963eb5c457af16c219abd46 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 16 Dec 2019 20:00:48 +0100 |
| Subject: btrfs: separate definition of assertion failure handlers |
| |
| From: David Sterba <dsterba@suse.com> |
| |
| [ Upstream commit 68c467cbb2f389b6c933e235bce0d1756fc8cc34 ] |
| |
| There's a report where objtool detects unreachable instructions, eg.: |
| |
| fs/btrfs/ctree.o: warning: objtool: btrfs_search_slot()+0x2d4: unreachable instruction |
| |
| This seems to be a false positive due to compiler version. The cause is |
| in the ASSERT macro implementation that does the conditional check as |
| IS_DEFINED(CONFIG_BTRFS_ASSERT) and not an #ifdef. |
| |
| To avoid that, use the ifdefs directly. |
| |
| There are still 2 reports that aren't fixed: |
| |
| fs/btrfs/extent_io.o: warning: objtool: __set_extent_bit()+0x71f: unreachable instruction |
| fs/btrfs/relocation.o: warning: objtool: find_data_references()+0x4e0: unreachable instruction |
| |
| Co-developed-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> |
| Reported-by: Randy Dunlap <rdunlap@infradead.org> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/btrfs/ctree.h | 20 ++++++++++++-------- |
| 1 file changed, 12 insertions(+), 8 deletions(-) |
| |
| diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h |
| index 290ca193c6c0f..169075550a5a2 100644 |
| --- a/fs/btrfs/ctree.h |
| +++ b/fs/btrfs/ctree.h |
| @@ -3107,17 +3107,21 @@ do { \ |
| rcu_read_unlock(); \ |
| } while (0) |
| |
| -__cold |
| -static inline void assfail(const char *expr, const char *file, int line) |
| +#ifdef CONFIG_BTRFS_ASSERT |
| +__cold __noreturn |
| +static inline void assertfail(const char *expr, const char *file, int line) |
| { |
| - if (IS_ENABLED(CONFIG_BTRFS_ASSERT)) { |
| - pr_err("assertion failed: %s, in %s:%d\n", expr, file, line); |
| - BUG(); |
| - } |
| + pr_err("assertion failed: %s, in %s:%d\n", expr, file, line); |
| + BUG(); |
| } |
| |
| -#define ASSERT(expr) \ |
| - (likely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) |
| +#define ASSERT(expr) \ |
| + (likely(expr) ? (void)0 : assertfail(#expr, __FILE__, __LINE__)) |
| + |
| +#else |
| +static inline void assertfail(const char *expr, const char* file, int line) { } |
| +#define ASSERT(expr) (void)(expr) |
| +#endif |
| |
| /* |
| * Use that for functions that are conditionally exported for sanity tests but |
| -- |
| 2.20.1 |
| |