Commit 8769e078 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-v3.10-rc1-2' of git://oss.sgi.com/xfs/xfs

Pull xfs update (#2) from Ben Myers:

 - add CONFIG_XFS_WARN, a step between zero debugging and
   CONFIG_XFS_DEBUG.

 - fix attrmulti and attrlist to fall back to vmalloc when kmalloc
   fails.

* tag 'for-linus-v3.10-rc1-2' of git://oss.sgi.com/xfs/xfs:
  xfs: fallback to vmalloc for large buffers in xfs_compat_attrlist_by_handle
  xfs: fallback to vmalloc for large buffers in xfs_attrlist_by_handle
  xfs: introduce CONFIG_XFS_WARN
parents 8cbc95ee 7dfbcbef
...@@ -69,6 +69,19 @@ config XFS_RT ...@@ -69,6 +69,19 @@ config XFS_RT
If unsure, say N. 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 config XFS_DEBUG
bool "XFS Debugging support" bool "XFS Debugging support"
depends on XFS_FS depends on XFS_FS
......
...@@ -22,12 +22,12 @@ ...@@ -22,12 +22,12 @@
typedef struct { typedef struct {
struct rw_semaphore mr_lock; struct rw_semaphore mr_lock;
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
int mr_writer; int mr_writer;
#endif #endif
} mrlock_t; } mrlock_t;
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
#define mrinit(mrp, name) \ #define mrinit(mrp, name) \
do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0)
#else #else
...@@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass) ...@@ -46,7 +46,7 @@ static inline void mraccess_nested(mrlock_t *mrp, int subclass)
static inline void mrupdate_nested(mrlock_t *mrp, int subclass) static inline void mrupdate_nested(mrlock_t *mrp, int subclass)
{ {
down_write_nested(&mrp->mr_lock, subclass); down_write_nested(&mrp->mr_lock, subclass);
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
mrp->mr_writer = 1; mrp->mr_writer = 1;
#endif #endif
} }
...@@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp) ...@@ -60,7 +60,7 @@ static inline int mrtryupdate(mrlock_t *mrp)
{ {
if (!down_write_trylock(&mrp->mr_lock)) if (!down_write_trylock(&mrp->mr_lock))
return 0; return 0;
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
mrp->mr_writer = 1; mrp->mr_writer = 1;
#endif #endif
return 1; return 1;
...@@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp) ...@@ -68,7 +68,7 @@ static inline int mrtryupdate(mrlock_t *mrp)
static inline void mrunlock_excl(mrlock_t *mrp) static inline void mrunlock_excl(mrlock_t *mrp)
{ {
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
mrp->mr_writer = 0; mrp->mr_writer = 0;
#endif #endif
up_write(&mrp->mr_lock); up_write(&mrp->mr_lock);
...@@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp) ...@@ -81,7 +81,7 @@ static inline void mrunlock_shared(mrlock_t *mrp)
static inline void mrdemote(mrlock_t *mrp) static inline void mrdemote(mrlock_t *mrp)
{ {
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
mrp->mr_writer = 0; mrp->mr_writer = 0;
#endif #endif
downgrade_write(&mrp->mr_lock); downgrade_write(&mrp->mr_lock);
......
...@@ -24,6 +24,11 @@ ...@@ -24,6 +24,11 @@
#define XFS_BUF_LOCK_TRACKING 1 #define XFS_BUF_LOCK_TRACKING 1
#endif #endif
#ifdef CONFIG_XFS_WARN
#define XFS_WARN 1
#endif
#include "xfs_linux.h" #include "xfs_linux.h"
#endif /* __XFS_H__ */ #endif /* __XFS_H__ */
...@@ -386,7 +386,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { ...@@ -386,7 +386,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = {
}; };
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
STATIC int STATIC int
xfs_allocbt_keys_inorder( xfs_allocbt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
...@@ -442,7 +442,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { ...@@ -442,7 +442,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = {
.init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur,
.key_diff = xfs_allocbt_key_diff, .key_diff = xfs_allocbt_key_diff,
.buf_ops = &xfs_allocbt_buf_ops, .buf_ops = &xfs_allocbt_buf_ops,
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
.keys_inorder = xfs_allocbt_keys_inorder, .keys_inorder = xfs_allocbt_keys_inorder,
.recs_inorder = xfs_allocbt_recs_inorder, .recs_inorder = xfs_allocbt_recs_inorder,
#endif #endif
......
...@@ -813,7 +813,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { ...@@ -813,7 +813,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = {
}; };
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
STATIC int STATIC int
xfs_bmbt_keys_inorder( xfs_bmbt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
...@@ -853,7 +853,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { ...@@ -853,7 +853,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = {
.init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur,
.key_diff = xfs_bmbt_key_diff, .key_diff = xfs_bmbt_key_diff,
.buf_ops = &xfs_bmbt_buf_ops, .buf_ops = &xfs_bmbt_buf_ops,
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
.keys_inorder = xfs_bmbt_keys_inorder, .keys_inorder = xfs_bmbt_keys_inorder,
.recs_inorder = xfs_bmbt_recs_inorder, .recs_inorder = xfs_bmbt_recs_inorder,
#endif #endif
......
...@@ -215,7 +215,7 @@ struct xfs_btree_ops { ...@@ -215,7 +215,7 @@ struct xfs_btree_ops {
const struct xfs_buf_ops *buf_ops; const struct xfs_buf_ops *buf_ops;
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
/* check that k1 is lower than k2 */ /* check that k1 is lower than k2 */
int (*keys_inorder)(struct xfs_btree_cur *cur, int (*keys_inorder)(struct xfs_btree_cur *cur,
union xfs_btree_key *k1, union xfs_btree_key *k1,
......
...@@ -993,7 +993,7 @@ xfs_dir2_leafn_rebalance( ...@@ -993,7 +993,7 @@ xfs_dir2_leafn_rebalance(
xfs_dir2_leaf_t *leaf1; /* first leaf structure */ xfs_dir2_leaf_t *leaf1; /* first leaf structure */
xfs_dir2_leaf_t *leaf2; /* second leaf structure */ xfs_dir2_leaf_t *leaf2; /* second leaf structure */
int mid; /* midpoint leaf index */ int mid; /* midpoint leaf index */
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
int oldstale; /* old count of stale leaves */ int oldstale; /* old count of stale leaves */
#endif #endif
int oldsum; /* old total leaf count */ int oldsum; /* old total leaf count */
...@@ -1022,7 +1022,7 @@ xfs_dir2_leafn_rebalance( ...@@ -1022,7 +1022,7 @@ xfs_dir2_leafn_rebalance(
ents2 = xfs_dir3_leaf_ents_p(leaf2); ents2 = xfs_dir3_leaf_ents_p(leaf2);
oldsum = hdr1.count + hdr2.count; oldsum = hdr1.count + hdr2.count;
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
oldstale = hdr1.stale + hdr2.stale; oldstale = hdr1.stale + hdr2.stale;
#endif #endif
mid = oldsum >> 1; mid = oldsum >> 1;
......
...@@ -272,7 +272,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { ...@@ -272,7 +272,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = {
.verify_write = xfs_inobt_write_verify, .verify_write = xfs_inobt_write_verify,
}; };
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
STATIC int STATIC int
xfs_inobt_keys_inorder( xfs_inobt_keys_inorder(
struct xfs_btree_cur *cur, struct xfs_btree_cur *cur,
...@@ -310,7 +310,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { ...@@ -310,7 +310,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = {
.init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur,
.key_diff = xfs_inobt_key_diff, .key_diff = xfs_inobt_key_diff,
.buf_ops = &xfs_inobt_buf_ops, .buf_ops = &xfs_inobt_buf_ops,
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
.keys_inorder = xfs_inobt_keys_inorder, .keys_inorder = xfs_inobt_keys_inorder,
.recs_inorder = xfs_inobt_recs_inorder, .recs_inorder = xfs_inobt_recs_inorder,
#endif #endif
......
...@@ -287,7 +287,7 @@ xfs_ilock_demote( ...@@ -287,7 +287,7 @@ xfs_ilock_demote(
trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_);
} }
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
int int
xfs_isilocked( xfs_isilocked(
xfs_inode_t *ip, xfs_inode_t *ip,
......
...@@ -422,9 +422,12 @@ xfs_attrlist_by_handle( ...@@ -422,9 +422,12 @@ xfs_attrlist_by_handle(
if (IS_ERR(dentry)) if (IS_ERR(dentry))
return PTR_ERR(dentry); return PTR_ERR(dentry);
kbuf = kzalloc(al_hreq.buflen, GFP_KERNEL); kbuf = kmem_zalloc(al_hreq.buflen, KM_SLEEP | KM_MAYFAIL);
if (!kbuf) if (!kbuf) {
goto out_dput; kbuf = kmem_zalloc_large(al_hreq.buflen);
if (!kbuf)
goto out_dput;
}
cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen, error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen,
...@@ -436,7 +439,10 @@ xfs_attrlist_by_handle( ...@@ -436,7 +439,10 @@ xfs_attrlist_by_handle(
error = -EFAULT; error = -EFAULT;
out_kfree: out_kfree:
kfree(kbuf); if (is_vmalloc_addr(kbuf))
kmem_free_large(kbuf);
else
kmem_free(kbuf);
out_dput: out_dput:
dput(dentry); dput(dentry);
return error; return error;
......
...@@ -373,9 +373,12 @@ xfs_compat_attrlist_by_handle( ...@@ -373,9 +373,12 @@ xfs_compat_attrlist_by_handle(
return PTR_ERR(dentry); return PTR_ERR(dentry);
error = -ENOMEM; error = -ENOMEM;
kbuf = kmalloc(al_hreq.buflen, GFP_KERNEL); kbuf = kmem_zalloc(al_hreq.buflen, KM_SLEEP | KM_MAYFAIL);
if (!kbuf) if (!kbuf) {
goto out_dput; kbuf = kmem_zalloc_large(al_hreq.buflen);
if (!kbuf)
goto out_dput;
}
cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; cursor = (attrlist_cursor_kern_t *)&al_hreq.pos;
error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen, error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen,
...@@ -387,7 +390,10 @@ xfs_compat_attrlist_by_handle( ...@@ -387,7 +390,10 @@ xfs_compat_attrlist_by_handle(
error = -EFAULT; error = -EFAULT;
out_kfree: out_kfree:
kfree(kbuf); if (is_vmalloc_addr(kbuf))
kmem_free_large(kbuf);
else
kmem_free(kbuf);
out_dput: out_dput:
dput(dentry); dput(dentry);
return error; return error;
......
...@@ -293,22 +293,34 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) ...@@ -293,22 +293,34 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y)
#define ASSERT_ALWAYS(expr) \ #define ASSERT_ALWAYS(expr) \
(unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) (unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
#ifndef DEBUG #ifdef DEBUG
#define ASSERT(expr) ((void)0) #define ASSERT(expr) \
(unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
#ifndef STATIC #ifndef STATIC
# define STATIC static noinline # define STATIC noinline
#endif #endif
#else /* DEBUG */ #else /* !DEBUG */
#ifdef XFS_WARN
#define ASSERT(expr) \ #define ASSERT(expr) \
(unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__)) (unlikely(expr) ? (void)0 : asswarn(#expr, __FILE__, __LINE__))
#ifndef STATIC #ifndef STATIC
# define STATIC noinline # define STATIC static noinline
#endif
#else /* !DEBUG && !XFS_WARN */
#define ASSERT(expr) ((void)0)
#ifndef STATIC
# define STATIC static noinline
#endif #endif
#endif /* XFS_WARN */
#endif /* DEBUG */ #endif /* DEBUG */
#endif /* __XFS_LINUX__ */ #endif /* __XFS_LINUX__ */
...@@ -92,6 +92,14 @@ xfs_alert_tag( ...@@ -92,6 +92,14 @@ xfs_alert_tag(
BUG_ON(do_panic); BUG_ON(do_panic);
} }
void
asswarn(char *expr, char *file, int line)
{
xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d",
expr, file, line);
WARN_ON(1);
}
void void
assfail(char *expr, char *file, int line) assfail(char *expr, char *file, int line)
{ {
......
...@@ -57,6 +57,7 @@ do { \ ...@@ -57,6 +57,7 @@ do { \
xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__) xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__)
extern void assfail(char *expr, char *f, int l); extern void assfail(char *expr, char *f, int l);
extern void asswarn(char *expr, char *f, int l);
extern void xfs_hex_dump(void *p, int length); extern void xfs_hex_dump(void *p, int length);
......
...@@ -405,7 +405,7 @@ typedef struct xfs_trans { ...@@ -405,7 +405,7 @@ typedef struct xfs_trans {
int64_t t_res_fdblocks_delta; /* on-disk only chg */ int64_t t_res_fdblocks_delta; /* on-disk only chg */
int64_t t_frextents_delta;/* superblock freextents chg*/ int64_t t_frextents_delta;/* superblock freextents chg*/
int64_t t_res_frextents_delta; /* on-disk only chg */ int64_t t_res_frextents_delta; /* on-disk only chg */
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
int64_t t_ag_freeblks_delta; /* debugging counter */ int64_t t_ag_freeblks_delta; /* debugging counter */
int64_t t_ag_flist_delta; /* debugging counter */ int64_t t_ag_flist_delta; /* debugging counter */
int64_t t_ag_btree_delta; /* debugging counter */ int64_t t_ag_btree_delta; /* debugging counter */
...@@ -433,7 +433,7 @@ typedef struct xfs_trans { ...@@ -433,7 +433,7 @@ typedef struct xfs_trans {
#define xfs_trans_get_block_res(tp) ((tp)->t_blk_res) #define xfs_trans_get_block_res(tp) ((tp)->t_blk_res)
#define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) #define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC)
#ifdef DEBUG #if defined(DEBUG) || defined(XFS_WARN)
#define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d) #define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d)
#define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d) #define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d)
#define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d) #define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment