Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 742ae1e3 authored by Dave Chinner's avatar Dave Chinner Committed by Ben Myers
Browse files

xfs: introduce CONFIG_XFS_WARN



Running a CONFIG_XFS_DEBUG kernel in production environments is not
the best idea as it introduces significant overhead, can change
the behaviour of algorithms (such as allocation) to improve test
coverage, and (most importantly) panic the machine on non-fatal
errors.

There are many cases where all we want to do is run a
kernel with more bounds checking enabled, such as is provided by the
ASSERT() statements throughout the code, but without all the
potential overhead and drawbacks.

This patch converts all the ASSERT statements to evaluate as
WARN_ON(1) statements and hence if they fail dump a warning and a
stack trace to the log. This has minimal overhead and does not
change any algorithms, and will allow us to find strange "out of
bounds" problems more easily on production machines.

There are a few places where assert statements contain debug only
code. These are converted to be debug-or-warn only code so that we
still get all the assert checks in the code.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent cab09a81
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -69,6 +69,19 @@ config XFS_RT

	  If unsure, say N.

config XFS_WARN
	bool "XFS Verbose Warnings"
	depends on XFS_FS && !XFS_DEBUG
	help
	  Say Y here to get an XFS build with many additional warnings.
	  It converts ASSERT checks to WARN, so will log any out-of-bounds
	  conditions that occur that would otherwise be missed. It is much
	  lighter weight than XFS_DEBUG and does not modify algorithms and will
	  not cause the kernel to panic on non-fatal errors.

	  However, similar to XFS_DEBUG, it is only advisable to use this if you
	  are debugging a particular problem.

config XFS_DEBUG
	bool "XFS Debugging support"
	depends on XFS_FS
+6 −6
Original line number Diff line number Diff line
@@ -22,12 +22,12 @@

typedef struct {
	struct rw_semaphore	mr_lock;
#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
	int			mr_writer;
#endif
} mrlock_t;

#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
#define mrinit(mrp, name)	\
	do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0)
#else
@@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass)
static inline void mrupdate_nested(mrlock_t *mrp, int subclass)
{
	down_write_nested(&mrp->mr_lock, subclass);
#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
	mrp->mr_writer = 1;
#endif
}
@@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp)
{
	if (!down_write_trylock(&mrp->mr_lock))
		return 0;
#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
	mrp->mr_writer = 1;
#endif
	return 1;
@@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp)

static inline void mrunlock_excl(mrlock_t *mrp)
{
#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
	mrp->mr_writer = 0;
#endif
	up_write(&mrp->mr_lock);
@@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp)

static inline void mrdemote(mrlock_t *mrp)
{
#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
	mrp->mr_writer = 0;
#endif
	downgrade_write(&mrp->mr_lock);
+5 −0
Original line number Diff line number Diff line
@@ -24,6 +24,11 @@
#define XFS_BUF_LOCK_TRACKING 1
#endif

#ifdef CONFIG_XFS_WARN
#define XFS_WARN 1
#endif


#include "xfs_linux.h"

#endif	/* __XFS_H__ */
+2 −2
Original line number Diff line number Diff line
@@ -386,7 +386,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = {
};


#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
STATIC int
xfs_allocbt_keys_inorder(
	struct xfs_btree_cur	*cur,
@@ -442,7 +442,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = {
	.init_ptr_from_cur	= xfs_allocbt_init_ptr_from_cur,
	.key_diff		= xfs_allocbt_key_diff,
	.buf_ops		= &xfs_allocbt_buf_ops,
#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
	.keys_inorder		= xfs_allocbt_keys_inorder,
	.recs_inorder		= xfs_allocbt_recs_inorder,
#endif
+2 −2
Original line number Diff line number Diff line
@@ -813,7 +813,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = {
};


#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
STATIC int
xfs_bmbt_keys_inorder(
	struct xfs_btree_cur	*cur,
@@ -853,7 +853,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = {
	.init_ptr_from_cur	= xfs_bmbt_init_ptr_from_cur,
	.key_diff		= xfs_bmbt_key_diff,
	.buf_ops		= &xfs_bmbt_buf_ops,
#ifdef DEBUG
#if defined(DEBUG) || defined(XFS_WARN)
	.keys_inorder		= xfs_bmbt_keys_inorder,
	.recs_inorder		= xfs_bmbt_recs_inorder,
#endif
Loading