blob: 3c3c2940f272abc7dda515202fb0d741f28071da [file] [log] [blame]
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +01001/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
4 * Copyright (C) 2001-2003 Red Hat, Inc.
5 *
6 * Created by David Woodhouse <dwmw2@infradead.org>
7 *
8 * For licensing information, see the file 'LICENCE' in this directory.
9 *
Artem B. Bityutskiyf302cd02005-07-24 16:29:59 +010010 * $Id: debug.h,v 1.6 2005/07/24 15:18:26 dedekind Exp $
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +010011 *
12 */
13#ifndef _JFFS2_DEBUG_H_
14#define _JFFS2_DEBUG_H_
15
16#include <linux/config.h>
17
18#ifndef CONFIG_JFFS2_FS_DEBUG
19#define CONFIG_JFFS2_FS_DEBUG 1
20#endif
21
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +010022#if CONFIG_JFFS2_FS_DEBUG == 1
23/* Enable "paranoia" checks and dumps */
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +010024#define JFFS2_DBG_PARANOIA_CHECKS
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +010025#define JFFS2_DBG_DUMPS
26#define JFFS2_DBG_READINODE_MESSAGES
27#define JFFS2_DBG_FRAGTREE_MESSAGES
28#define JFFS2_DBG_DENTLIST_MESSAGES
29#define JFFS2_DBG_NODEREF_MESSAGES
30#define JFFS2_DBG_INOCACHE_MESSAGES
31#endif
32
33#if CONFIG_JFFS2_FS_DEBUG == 2
34#define JFFS2_DBG_FRAGTREE2_MESSAGES
35#endif
36
37/* Enable JFFS2 sanity checks by default */
38#define JFFS2_DBG_SANITY_CHECKS
39
40/*
41 * Dx() are mainly used for debugging messages, they must go away and be
42 * superseded by nicer JFFS2_DBG_XXX() macros...
43 */
44#if CONFIG_JFFS2_FS_DEBUG > 0
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +010045#define D1(x) x
46#else
47#define D1(x)
48#endif
49
50#if CONFIG_JFFS2_FS_DEBUG > 1
51#define D2(x) x
52#else
53#define D2(x)
54#endif
55
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +010056/* The prefixes of JFFS2 messages */
57#define JFFS2_DBG_MSG_PREFIX "[JFFS2 DBG]"
58#define JFFS2_ERR_MSG_PREFIX "JFFS2 error: "
59#define JFFS2_WARN_MSG_PREFIX "JFFS2 warning: "
60#define JFFS2_NOTICE_MSG_PREFIX "JFFS2 notice: "
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +010061
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +010062#define JFFS2_ERR_LVL KERN_ERR
63#define JFFS2_WARN_LVL KERN_WARNING
64#define JFFS2_NOTICE_LVL KERN_NOTICE
65#define JFFS2_DBG_LVL KERN_DEBUG
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +010066
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +010067/* JFFS2 message macros */
68#define JFFS2_ERROR(fmt, ...) \
69 do { \
70 printk(JFFS2_ERR_LVL JFFS2_ERR_MSG_PREFIX " %s: " \
71 fmt, __FUNCTION__, ##__VA_ARGS__); \
72 } while(0)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +010073
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +010074#define JFFS2_WARNING(fmt, ...) \
75 do { \
76 printk(JFFS2_WARN_LVL JFFS2_WARN_MSG_PREFIX " %s: " \
77 fmt, __FUNCTION__, ##__VA_ARGS__); \
78 } while(0)
79
80#define JFFS2_NOTICE(fmt, ...) \
81 do { \
82 printk(JFFS2_NOTICE_LVL JFFS2_NOTICE_MSG_PREFIX " %s: " \
83 fmt, __FUNCTION__, ##__VA_ARGS__); \
84 } while(0)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +010085
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +010086#define JFFS2_DEBUG(fmt, ...) \
87 do { \
88 printk(JFFS2_DBG_LVL JFFS2_DBG_MSG_PREFIX " %s: " \
89 fmt, __FUNCTION__, ##__VA_ARGS__); \
90 } while(0)
91
92/*
93 * We split our debugging messages on several parts, depending on the JFFS2
94 * subsystem the message belongs to.
95 */
96/* Read inode debugging messages */
97#ifdef JFFS2_DBG_READINODE_MESSAGES
98#define JFFS2_DBG_READINODE(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
99#else
100#define JFFS2_DBG_READINODE(fmt, ...)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100101#endif
102
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100103/* Fragtree build debugging messages */
104#ifdef JFFS2_DBG_FRAGTREE_MESSAGES
105#define JFFS2_DBG_FRAGTREE(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
106#else
107#define JFFS2_DBG_FRAGTREE(fmt, ...)
108#endif
109
110/* Directory entry list manilulation debugging messages */
111#ifdef JFFS2_DBG_DENTLIST_MESSAGES
112#define JFFS2_DBG_DENTLIST(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
113#else
114#define JFFS2_DBG_DENTLIST(fmt, ...)
115#endif
116#ifdef JFFS2_DBG_FRAGTREE2_MESSAGES
117#define JFFS2_DBG_FRAGTREE2(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
118#else
119#define JFFS2_DBG_FRAGTREE2(fmt, ...)
120#endif
121
122/* Plays with node_refs */
123#ifdef JFFS2_DBG_NODEREF_MESSAGES
124#define JFFS2_DBG_NODEREF(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
125#else
126#define JFFS2_DBG_NODEREF(fmt, ...)
127#endif
128
129/* Plays with the list of inodes (JFFS2 inocache) */
130#ifdef JFFS2_DBG_INOCACHE_MESSAGES
131#define JFFS2_DBG_INOCACHE(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
132#else
133#define JFFS2_DBG_INOCACHE(fmt, ...)
134#endif
135
136/* "Paranoia" checks */
137void
138__jffs2_dbg_fragtree_paranoia_check(struct jffs2_inode_info *f);
139void
140__jffs2_dbg_fragtree_paranoia_check_nolock(struct jffs2_inode_info *f);
141void
142__jffs2_dbg_acct_paranoia_check(struct jffs2_sb_info *c,
143 struct jffs2_eraseblock *jeb);
144void
145__jffs2_dbg_acct_paranoia_check_nolock(struct jffs2_sb_info *c,
146 struct jffs2_eraseblock *jeb);
147void
148__jffs2_dbg_prewrite_paranoia_check(struct jffs2_sb_info *c,
149 uint32_t ofs, int len);
150
151/* "Dump" functions */
152void
153__jffs2_dbg_dump_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
154void
155__jffs2_dbg_dump_jeb_nolock(struct jffs2_eraseblock *jeb);
156void
157__jffs2_dbg_dump_block_lists(struct jffs2_sb_info *c);
158void
159__jffs2_dbg_dump_block_lists_nolock(struct jffs2_sb_info *c);
160void
161__jffs2_dbg_dump_node_refs(struct jffs2_sb_info *c,
162 struct jffs2_eraseblock *jeb);
163void
164__jffs2_dbg_dump_node_refs_nolock(struct jffs2_sb_info *c,
165 struct jffs2_eraseblock *jeb);
166void
167__jffs2_dbg_dump_fragtree(struct jffs2_inode_info *f);
168void
169__jffs2_dbg_dump_fragtree_nolock(struct jffs2_inode_info *f);
170void
171__jffs2_dbg_dump_buffer(unsigned char *buf, int len, uint32_t offs);
172void
173__jffs2_dbg_dump_node(struct jffs2_sb_info *c, uint32_t ofs);
174
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100175#ifdef JFFS2_DBG_PARANOIA_CHECKS
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100176#define jffs2_dbg_fragtree_paranoia_check(f) \
177 __jffs2_dbg_fragtree_paranoia_check(f)
178#define jffs2_dbg_fragtree_paranoia_check_nolock(f) \
179 __jffs2_dbg_fragtree_paranoia_check_nolock(f)
180#define jffs2_dbg_acct_paranoia_check(c, jeb) \
181 __jffs2_dbg_acct_paranoia_check(c,jeb)
182#define jffs2_dbg_acct_paranoia_check_nolock(c, jeb) \
183 __jffs2_dbg_acct_paranoia_check_nolock(c,jeb)
184#define jffs2_dbg_prewrite_paranoia_check(c, ofs, len) \
185 __jffs2_dbg_prewrite_paranoia_check(c, ofs, len)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100186#else
187#define jffs2_dbg_fragtree_paranoia_check(f)
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100188#define jffs2_dbg_fragtree_paranoia_check_nolock(f)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100189#define jffs2_dbg_acct_paranoia_check(c, jeb)
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100190#define jffs2_dbg_acct_paranoia_check_nolock(c, jeb)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100191#define jffs2_dbg_prewrite_paranoia_check(c, ofs, len)
192#endif /* !JFFS2_PARANOIA_CHECKS */
193
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100194#ifdef JFFS2_DBG_DUMPS
195#define jffs2_dbg_dump_jeb(c, jeb) \
196 __jffs2_dbg_dump_jeb(c, jeb);
197#define jffs2_dbg_dump_jeb_nolock(jeb) \
198 __jffs2_dbg_dump_jeb_nolock(jeb);
199#define jffs2_dbg_dump_block_lists(c) \
200 __jffs2_dbg_dump_block_lists(c)
201#define jffs2_dbg_dump_block_lists_nolock(c) \
202 __jffs2_dbg_dump_block_lists_nolock(c)
203#define jffs2_dbg_dump_fragtree(f) \
204 __jffs2_dbg_dump_fragtree(f);
205#define jffs2_dbg_dump_fragtree_nolock(f) \
206 __jffs2_dbg_dump_fragtree_nolock(f);
207#define jffs2_dbg_dump_buffer(buf, len, offs) \
208 __jffs2_dbg_dump_buffer(*buf, len, offs);
209#define jffs2_dbg_dump_node(c, ofs) \
210 __jffs2_dbg_dump_node(c, ofs);
211#else
212#define jffs2_dbg_dump_jeb(c, jeb)
213#define jffs2_dbg_dump_jeb_nolock(jeb)
214#define jffs2_dbg_dump_block_lists(c)
215#define jffs2_dbg_dump_block_lists_nolock(c)
216#define jffs2_dbg_dump_fragtree(f)
217#define jffs2_dbg_dump_fragtree_nolock(f)
218#define jffs2_dbg_dump_buffer(buf, len, offs)
219#define jffs2_dbg_dump_node(c, ofs)
220#endif /* !JFFS2_DBG_DUMPS */
221
222/*
223 * Sanity checks are supposed to be light-weight and enabled by default.
224 */
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100225#ifdef JFFS2_DBG_SANITY_CHECKS
226/*
227 * Check the space accounting of the file system and of
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100228 * the JFFS2 erasable block 'jeb'.
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100229 */
230static inline void
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100231jffs2_dbg_acct_sanity_check_nolock(struct jffs2_sb_info *c,
232 struct jffs2_eraseblock *jeb)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100233{
234 if (unlikely(jeb && jeb->used_size + jeb->dirty_size +
235 jeb->free_size + jeb->wasted_size +
236 jeb->unchecked_size != c->sector_size)) {
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100237 JFFS2_ERROR("eeep, space accounting for block at 0x%08x is screwed.\n", jeb->offset);
238 JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + wasted %#08x + unchecked "
239 "%#08x != total %#08x.\n", jeb->free_size, jeb->dirty_size, jeb->used_size,
240 jeb->wasted_size, jeb->unchecked_size, c->sector_size);
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100241 BUG();
242 }
243
244 if (unlikely(c->used_size + c->dirty_size + c->free_size + c->erasing_size + c->bad_size
245 + c->wasted_size + c->unchecked_size != c->flash_size)) {
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100246 JFFS2_ERROR("eeep, space accounting superblock info is screwed.\n");
247 JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + erasing %#08x + bad %#08x + "
248 "wasted %#08x + unchecked %#08x != total %#08x.\n",
249 c->free_size, c->dirty_size, c->used_size, c->erasing_size, c->bad_size,
250 c->wasted_size, c->unchecked_size, c->flash_size);
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100251 BUG();
252 }
253}
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100254
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100255static inline void
256jffs2_dbg_acct_sanity_check(struct jffs2_sb_info *c,
Artem B. Bityutskiye0c8e422005-07-24 16:14:17 +0100257 struct jffs2_eraseblock *jeb)
258{
259 spin_lock(&c->erase_completion_lock);
260 jffs2_dbg_acct_sanity_check_nolock(c, jeb);
261 spin_unlock(&c->erase_completion_lock);
262}
263#else
264#define jffs2_dbg_acct_sanity_check(c, jeb)
265#define jffs2_dbg_acct_sanity_check_nolock(c, jeb)
Artem B. Bityutskiy730554d2005-07-17 07:56:26 +0100266#endif /* !JFFS2_DBG_SANITY_CHECKS */
267
268#endif /* _JFFS2_DEBUG_H_ */