162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * JFFS2 -- Journalling Flash File System, Version 2.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright © 2001-2007 Red Hat, Inc.
562306a36Sopenharmony_ci * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Created by David Woodhouse <dwmw2@infradead.org>
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * For licensing information, see the file 'LICENCE' in this directory.
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#ifndef _JFFS2_DEBUG_H_
1462306a36Sopenharmony_ci#define _JFFS2_DEBUG_H_
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <linux/printk.h>
1762306a36Sopenharmony_ci#include <linux/sched.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#ifndef CONFIG_JFFS2_FS_DEBUG
2062306a36Sopenharmony_ci#define CONFIG_JFFS2_FS_DEBUG 0
2162306a36Sopenharmony_ci#endif
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#if CONFIG_JFFS2_FS_DEBUG > 0
2462306a36Sopenharmony_ci/* Enable "paranoia" checks and dumps */
2562306a36Sopenharmony_ci#define JFFS2_DBG_PARANOIA_CHECKS
2662306a36Sopenharmony_ci#define JFFS2_DBG_DUMPS
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/*
2962306a36Sopenharmony_ci * By defining/undefining the below macros one may select debugging messages
3062306a36Sopenharmony_ci * fro specific JFFS2 subsystems.
3162306a36Sopenharmony_ci */
3262306a36Sopenharmony_ci#define JFFS2_DBG_READINODE_MESSAGES
3362306a36Sopenharmony_ci#define JFFS2_DBG_FRAGTREE_MESSAGES
3462306a36Sopenharmony_ci#define JFFS2_DBG_DENTLIST_MESSAGES
3562306a36Sopenharmony_ci#define JFFS2_DBG_NODEREF_MESSAGES
3662306a36Sopenharmony_ci#define JFFS2_DBG_INOCACHE_MESSAGES
3762306a36Sopenharmony_ci#define JFFS2_DBG_SUMMARY_MESSAGES
3862306a36Sopenharmony_ci#define JFFS2_DBG_FSBUILD_MESSAGES
3962306a36Sopenharmony_ci#endif
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#if CONFIG_JFFS2_FS_DEBUG > 1
4262306a36Sopenharmony_ci#define JFFS2_DBG_FRAGTREE2_MESSAGES
4362306a36Sopenharmony_ci#define JFFS2_DBG_READINODE2_MESSAGES
4462306a36Sopenharmony_ci#define JFFS2_DBG_MEMALLOC_MESSAGES
4562306a36Sopenharmony_ci#endif
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* Sanity checks are supposed to be light-weight and enabled by default */
4862306a36Sopenharmony_ci#define JFFS2_DBG_SANITY_CHECKS
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/*
5162306a36Sopenharmony_ci * Dx() are mainly used for debugging messages, they must go away and be
5262306a36Sopenharmony_ci * superseded by nicer dbg_xxx() macros...
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_ci#if CONFIG_JFFS2_FS_DEBUG > 0
5562306a36Sopenharmony_ci#define DEBUG
5662306a36Sopenharmony_ci#define D1(x) x
5762306a36Sopenharmony_ci#else
5862306a36Sopenharmony_ci#define D1(x)
5962306a36Sopenharmony_ci#endif
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#if CONFIG_JFFS2_FS_DEBUG > 1
6262306a36Sopenharmony_ci#define D2(x) x
6362306a36Sopenharmony_ci#else
6462306a36Sopenharmony_ci#define D2(x)
6562306a36Sopenharmony_ci#endif
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define jffs2_dbg(level, fmt, ...)		\
6862306a36Sopenharmony_cido {						\
6962306a36Sopenharmony_ci	if (CONFIG_JFFS2_FS_DEBUG >= level)	\
7062306a36Sopenharmony_ci		pr_debug(fmt, ##__VA_ARGS__);	\
7162306a36Sopenharmony_ci} while (0)
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci/* The prefixes of JFFS2 messages */
7462306a36Sopenharmony_ci#define JFFS2_DBG		KERN_DEBUG
7562306a36Sopenharmony_ci#define JFFS2_DBG_PREFIX	"[JFFS2 DBG]"
7662306a36Sopenharmony_ci#define JFFS2_DBG_MSG_PREFIX	JFFS2_DBG JFFS2_DBG_PREFIX
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci/* JFFS2 message macros */
7962306a36Sopenharmony_ci#define JFFS2_ERROR(fmt, ...)					\
8062306a36Sopenharmony_ci	pr_err("error: (%d) %s: " fmt,				\
8162306a36Sopenharmony_ci	       task_pid_nr(current), __func__, ##__VA_ARGS__)
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#define JFFS2_WARNING(fmt, ...)						\
8462306a36Sopenharmony_ci	pr_warn("warning: (%d) %s: " fmt,				\
8562306a36Sopenharmony_ci		task_pid_nr(current), __func__, ##__VA_ARGS__)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define JFFS2_NOTICE(fmt, ...)						\
8862306a36Sopenharmony_ci	pr_notice("notice: (%d) %s: " fmt,				\
8962306a36Sopenharmony_ci		  task_pid_nr(current), __func__, ##__VA_ARGS__)
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci#define JFFS2_DEBUG(fmt, ...)						\
9262306a36Sopenharmony_ci	printk(KERN_DEBUG "[JFFS2 DBG] (%d) %s: " fmt,			\
9362306a36Sopenharmony_ci	       task_pid_nr(current), __func__, ##__VA_ARGS__)
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/*
9662306a36Sopenharmony_ci * We split our debugging messages on several parts, depending on the JFFS2
9762306a36Sopenharmony_ci * subsystem the message belongs to.
9862306a36Sopenharmony_ci */
9962306a36Sopenharmony_ci/* Read inode debugging messages */
10062306a36Sopenharmony_ci#ifdef JFFS2_DBG_READINODE_MESSAGES
10162306a36Sopenharmony_ci#define dbg_readinode(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
10262306a36Sopenharmony_ci#else
10362306a36Sopenharmony_ci#define dbg_readinode(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
10462306a36Sopenharmony_ci#endif
10562306a36Sopenharmony_ci#ifdef JFFS2_DBG_READINODE2_MESSAGES
10662306a36Sopenharmony_ci#define dbg_readinode2(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
10762306a36Sopenharmony_ci#else
10862306a36Sopenharmony_ci#define dbg_readinode2(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
10962306a36Sopenharmony_ci#endif
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci/* Fragtree build debugging messages */
11262306a36Sopenharmony_ci#ifdef JFFS2_DBG_FRAGTREE_MESSAGES
11362306a36Sopenharmony_ci#define dbg_fragtree(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
11462306a36Sopenharmony_ci#else
11562306a36Sopenharmony_ci#define dbg_fragtree(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
11662306a36Sopenharmony_ci#endif
11762306a36Sopenharmony_ci#ifdef JFFS2_DBG_FRAGTREE2_MESSAGES
11862306a36Sopenharmony_ci#define dbg_fragtree2(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
11962306a36Sopenharmony_ci#else
12062306a36Sopenharmony_ci#define dbg_fragtree2(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
12162306a36Sopenharmony_ci#endif
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/* Directory entry list manilulation debugging messages */
12462306a36Sopenharmony_ci#ifdef JFFS2_DBG_DENTLIST_MESSAGES
12562306a36Sopenharmony_ci#define dbg_dentlist(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
12662306a36Sopenharmony_ci#else
12762306a36Sopenharmony_ci#define dbg_dentlist(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
12862306a36Sopenharmony_ci#endif
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci/* Print the messages about manipulating node_refs */
13162306a36Sopenharmony_ci#ifdef JFFS2_DBG_NODEREF_MESSAGES
13262306a36Sopenharmony_ci#define dbg_noderef(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
13362306a36Sopenharmony_ci#else
13462306a36Sopenharmony_ci#define dbg_noderef(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
13562306a36Sopenharmony_ci#endif
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/* Manipulations with the list of inodes (JFFS2 inocache) */
13862306a36Sopenharmony_ci#ifdef JFFS2_DBG_INOCACHE_MESSAGES
13962306a36Sopenharmony_ci#define dbg_inocache(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
14062306a36Sopenharmony_ci#else
14162306a36Sopenharmony_ci#define dbg_inocache(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
14262306a36Sopenharmony_ci#endif
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/* Summary debugging messages */
14562306a36Sopenharmony_ci#ifdef JFFS2_DBG_SUMMARY_MESSAGES
14662306a36Sopenharmony_ci#define dbg_summary(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
14762306a36Sopenharmony_ci#else
14862306a36Sopenharmony_ci#define dbg_summary(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
14962306a36Sopenharmony_ci#endif
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci/* File system build messages */
15262306a36Sopenharmony_ci#ifdef JFFS2_DBG_FSBUILD_MESSAGES
15362306a36Sopenharmony_ci#define dbg_fsbuild(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
15462306a36Sopenharmony_ci#else
15562306a36Sopenharmony_ci#define dbg_fsbuild(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
15662306a36Sopenharmony_ci#endif
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* Watch the object allocations */
15962306a36Sopenharmony_ci#ifdef JFFS2_DBG_MEMALLOC_MESSAGES
16062306a36Sopenharmony_ci#define dbg_memalloc(fmt, ...)	JFFS2_DEBUG(fmt, ##__VA_ARGS__)
16162306a36Sopenharmony_ci#else
16262306a36Sopenharmony_ci#define dbg_memalloc(fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
16362306a36Sopenharmony_ci#endif
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci/* Watch the XATTR subsystem */
16662306a36Sopenharmony_ci#ifdef JFFS2_DBG_XATTR_MESSAGES
16762306a36Sopenharmony_ci#define dbg_xattr(fmt, ...)  JFFS2_DEBUG(fmt, ##__VA_ARGS__)
16862306a36Sopenharmony_ci#else
16962306a36Sopenharmony_ci#define dbg_xattr(fmt, ...)  no_printk(fmt, ##__VA_ARGS__)
17062306a36Sopenharmony_ci#endif
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/* "Sanity" checks */
17362306a36Sopenharmony_civoid
17462306a36Sopenharmony_ci__jffs2_dbg_acct_sanity_check_nolock(struct jffs2_sb_info *c,
17562306a36Sopenharmony_ci				     struct jffs2_eraseblock *jeb);
17662306a36Sopenharmony_civoid
17762306a36Sopenharmony_ci__jffs2_dbg_acct_sanity_check(struct jffs2_sb_info *c,
17862306a36Sopenharmony_ci			      struct jffs2_eraseblock *jeb);
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci/* "Paranoia" checks */
18162306a36Sopenharmony_civoid
18262306a36Sopenharmony_ci__jffs2_dbg_fragtree_paranoia_check(struct jffs2_inode_info *f);
18362306a36Sopenharmony_civoid
18462306a36Sopenharmony_ci__jffs2_dbg_fragtree_paranoia_check_nolock(struct jffs2_inode_info *f);
18562306a36Sopenharmony_civoid
18662306a36Sopenharmony_ci__jffs2_dbg_acct_paranoia_check(struct jffs2_sb_info *c,
18762306a36Sopenharmony_ci			   	struct jffs2_eraseblock *jeb);
18862306a36Sopenharmony_civoid
18962306a36Sopenharmony_ci__jffs2_dbg_acct_paranoia_check_nolock(struct jffs2_sb_info *c,
19062306a36Sopenharmony_ci				       struct jffs2_eraseblock *jeb);
19162306a36Sopenharmony_civoid
19262306a36Sopenharmony_ci__jffs2_dbg_prewrite_paranoia_check(struct jffs2_sb_info *c,
19362306a36Sopenharmony_ci				    uint32_t ofs, int len);
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci/* "Dump" functions */
19662306a36Sopenharmony_civoid
19762306a36Sopenharmony_ci__jffs2_dbg_dump_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
19862306a36Sopenharmony_civoid
19962306a36Sopenharmony_ci__jffs2_dbg_dump_jeb_nolock(struct jffs2_eraseblock *jeb);
20062306a36Sopenharmony_civoid
20162306a36Sopenharmony_ci__jffs2_dbg_dump_block_lists(struct jffs2_sb_info *c);
20262306a36Sopenharmony_civoid
20362306a36Sopenharmony_ci__jffs2_dbg_dump_block_lists_nolock(struct jffs2_sb_info *c);
20462306a36Sopenharmony_civoid
20562306a36Sopenharmony_ci__jffs2_dbg_dump_node_refs(struct jffs2_sb_info *c,
20662306a36Sopenharmony_ci		 	   struct jffs2_eraseblock *jeb);
20762306a36Sopenharmony_civoid
20862306a36Sopenharmony_ci__jffs2_dbg_dump_node_refs_nolock(struct jffs2_sb_info *c,
20962306a36Sopenharmony_ci				  struct jffs2_eraseblock *jeb);
21062306a36Sopenharmony_civoid
21162306a36Sopenharmony_ci__jffs2_dbg_dump_fragtree(struct jffs2_inode_info *f);
21262306a36Sopenharmony_civoid
21362306a36Sopenharmony_ci__jffs2_dbg_dump_fragtree_nolock(struct jffs2_inode_info *f);
21462306a36Sopenharmony_civoid
21562306a36Sopenharmony_ci__jffs2_dbg_dump_buffer(unsigned char *buf, int len, uint32_t offs);
21662306a36Sopenharmony_civoid
21762306a36Sopenharmony_ci__jffs2_dbg_dump_node(struct jffs2_sb_info *c, uint32_t ofs);
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci#ifdef JFFS2_DBG_PARANOIA_CHECKS
22062306a36Sopenharmony_ci#define jffs2_dbg_fragtree_paranoia_check(f)			\
22162306a36Sopenharmony_ci	__jffs2_dbg_fragtree_paranoia_check(f)
22262306a36Sopenharmony_ci#define jffs2_dbg_fragtree_paranoia_check_nolock(f)		\
22362306a36Sopenharmony_ci	__jffs2_dbg_fragtree_paranoia_check_nolock(f)
22462306a36Sopenharmony_ci#define jffs2_dbg_acct_paranoia_check(c, jeb)			\
22562306a36Sopenharmony_ci	__jffs2_dbg_acct_paranoia_check(c,jeb)
22662306a36Sopenharmony_ci#define jffs2_dbg_acct_paranoia_check_nolock(c, jeb)		\
22762306a36Sopenharmony_ci	__jffs2_dbg_acct_paranoia_check_nolock(c,jeb)
22862306a36Sopenharmony_ci#define jffs2_dbg_prewrite_paranoia_check(c, ofs, len)		\
22962306a36Sopenharmony_ci	__jffs2_dbg_prewrite_paranoia_check(c, ofs, len)
23062306a36Sopenharmony_ci#else
23162306a36Sopenharmony_ci#define jffs2_dbg_fragtree_paranoia_check(f)
23262306a36Sopenharmony_ci#define jffs2_dbg_fragtree_paranoia_check_nolock(f)
23362306a36Sopenharmony_ci#define jffs2_dbg_acct_paranoia_check(c, jeb)
23462306a36Sopenharmony_ci#define jffs2_dbg_acct_paranoia_check_nolock(c, jeb)
23562306a36Sopenharmony_ci#define jffs2_dbg_prewrite_paranoia_check(c, ofs, len)
23662306a36Sopenharmony_ci#endif /* !JFFS2_PARANOIA_CHECKS */
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci#ifdef JFFS2_DBG_DUMPS
23962306a36Sopenharmony_ci#define jffs2_dbg_dump_jeb(c, jeb)				\
24062306a36Sopenharmony_ci	__jffs2_dbg_dump_jeb(c, jeb);
24162306a36Sopenharmony_ci#define jffs2_dbg_dump_jeb_nolock(jeb)				\
24262306a36Sopenharmony_ci	__jffs2_dbg_dump_jeb_nolock(jeb);
24362306a36Sopenharmony_ci#define jffs2_dbg_dump_block_lists(c)				\
24462306a36Sopenharmony_ci	__jffs2_dbg_dump_block_lists(c)
24562306a36Sopenharmony_ci#define jffs2_dbg_dump_block_lists_nolock(c)			\
24662306a36Sopenharmony_ci	__jffs2_dbg_dump_block_lists_nolock(c)
24762306a36Sopenharmony_ci#define jffs2_dbg_dump_fragtree(f)				\
24862306a36Sopenharmony_ci	__jffs2_dbg_dump_fragtree(f);
24962306a36Sopenharmony_ci#define jffs2_dbg_dump_fragtree_nolock(f)			\
25062306a36Sopenharmony_ci	__jffs2_dbg_dump_fragtree_nolock(f);
25162306a36Sopenharmony_ci#define jffs2_dbg_dump_buffer(buf, len, offs)			\
25262306a36Sopenharmony_ci	__jffs2_dbg_dump_buffer(*buf, len, offs);
25362306a36Sopenharmony_ci#define jffs2_dbg_dump_node(c, ofs)				\
25462306a36Sopenharmony_ci	__jffs2_dbg_dump_node(c, ofs);
25562306a36Sopenharmony_ci#else
25662306a36Sopenharmony_ci#define jffs2_dbg_dump_jeb(c, jeb)
25762306a36Sopenharmony_ci#define jffs2_dbg_dump_jeb_nolock(jeb)
25862306a36Sopenharmony_ci#define jffs2_dbg_dump_block_lists(c)
25962306a36Sopenharmony_ci#define jffs2_dbg_dump_block_lists_nolock(c)
26062306a36Sopenharmony_ci#define jffs2_dbg_dump_fragtree(f)
26162306a36Sopenharmony_ci#define jffs2_dbg_dump_fragtree_nolock(f)
26262306a36Sopenharmony_ci#define jffs2_dbg_dump_buffer(buf, len, offs)
26362306a36Sopenharmony_ci#define jffs2_dbg_dump_node(c, ofs)
26462306a36Sopenharmony_ci#endif /* !JFFS2_DBG_DUMPS */
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci#ifdef JFFS2_DBG_SANITY_CHECKS
26762306a36Sopenharmony_ci#define jffs2_dbg_acct_sanity_check(c, jeb)			\
26862306a36Sopenharmony_ci	__jffs2_dbg_acct_sanity_check(c, jeb)
26962306a36Sopenharmony_ci#define jffs2_dbg_acct_sanity_check_nolock(c, jeb)		\
27062306a36Sopenharmony_ci	__jffs2_dbg_acct_sanity_check_nolock(c, jeb)
27162306a36Sopenharmony_ci#else
27262306a36Sopenharmony_ci#define jffs2_dbg_acct_sanity_check(c, jeb)
27362306a36Sopenharmony_ci#define jffs2_dbg_acct_sanity_check_nolock(c, jeb)
27462306a36Sopenharmony_ci#endif /* !JFFS2_DBG_SANITY_CHECKS */
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci#endif /* _JFFS2_DEBUG_H_ */
277