debug.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /*
  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. *
  10. * $Id: debug.h,v 1.1 2005/07/30 15:30:42 asl Exp $
  11. *
  12. */
  13. #ifndef _JFFS2_DEBUG_H_
  14. #define _JFFS2_DEBUG_H_
  15. #include "jffs2_config.h"
  16. #include <linux/config.h>
  17. #ifndef CONFIG_JFFS2_FS_DEBUG
  18. #define CONFIG_JFFS2_FS_DEBUG 0
  19. #endif
  20. #if CONFIG_JFFS2_FS_DEBUG == 1
  21. /* Enable "paranoia" checks and dumps */
  22. #define JFFS2_DBG_PARANOIA_CHECKS
  23. #define JFFS2_DBG_DUMPS
  24. #define JFFS2_DBG_READINODE_MESSAGES
  25. #define JFFS2_DBG_FRAGTREE_MESSAGES
  26. #define JFFS2_DBG_DENTLIST_MESSAGES
  27. #define JFFS2_DBG_NODEREF_MESSAGES
  28. #define JFFS2_DBG_INOCACHE_MESSAGES
  29. #endif
  30. #if CONFIG_JFFS2_FS_DEBUG == 2
  31. #define JFFS2_DBG_FRAGTREE2_MESSAGES
  32. #endif
  33. /* Enable JFFS2 sanity checks by default */
  34. #define JFFS2_DBG_SANITY_CHECKS
  35. /*
  36. * Dx() are mainly used for debugging messages, they must go away and be
  37. * superseded by nicer JFFS2_DBG_XXX() macros...
  38. */
  39. #if CONFIG_JFFS2_FS_DEBUG > 0
  40. #define D1(x) x
  41. #else
  42. #define D1(x)
  43. #endif
  44. #if CONFIG_JFFS2_FS_DEBUG > 1
  45. #define D2(x) x
  46. #else
  47. #define D2(x)
  48. #endif
  49. /* The prefixes of JFFS2 messages */
  50. #define JFFS2_DBG_MSG_PREFIX "[JFFS2 DBG]"
  51. #define JFFS2_ERR_MSG_PREFIX "JFFS2 error: "
  52. #define JFFS2_WARN_MSG_PREFIX "JFFS2 warning: "
  53. #define JFFS2_NOTICE_MSG_PREFIX "JFFS2 notice: "
  54. #define JFFS2_ERR_LVL KERN_ERR
  55. #define JFFS2_WARN_LVL KERN_WARNING
  56. #define JFFS2_NOTICE_LVL KERN_NOTICE
  57. #define JFFS2_DBG_LVL KERN_DEBUG
  58. /* JFFS2 message macros */
  59. #define JFFS2_ERROR(fmt, ...) \
  60. do { \
  61. printk(JFFS2_ERR_LVL JFFS2_ERR_MSG_PREFIX " %s: " \
  62. fmt, __FUNCTION__, ##__VA_ARGS__); \
  63. } while(0)
  64. #define JFFS2_WARNING(fmt, ...) \
  65. do { \
  66. printk(JFFS2_WARN_LVL JFFS2_WARN_MSG_PREFIX " %s: " \
  67. fmt, __FUNCTION__, ##__VA_ARGS__); \
  68. } while(0)
  69. #define JFFS2_NOTICE(fmt, ...) \
  70. do { \
  71. printk(JFFS2_NOTICE_LVL JFFS2_NOTICE_MSG_PREFIX " %s: " \
  72. fmt, __FUNCTION__, ##__VA_ARGS__); \
  73. } while(0)
  74. #define JFFS2_DEBUG(fmt, ...) \
  75. do { \
  76. printk(JFFS2_DBG_LVL JFFS2_DBG_MSG_PREFIX " %s: " \
  77. fmt, __FUNCTION__, ##__VA_ARGS__); \
  78. } while(0)
  79. /*
  80. * We split our debugging messages on several parts, depending on the JFFS2
  81. * subsystem the message belongs to.
  82. */
  83. /* Read inode debugging messages */
  84. #ifdef JFFS2_DBG_READINODE_MESSAGES
  85. #define JFFS2_DBG_READINODE(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
  86. #else
  87. #define JFFS2_DBG_READINODE(fmt, ...)
  88. #endif
  89. /* Fragtree build debugging messages */
  90. #ifdef JFFS2_DBG_FRAGTREE_MESSAGES
  91. #define JFFS2_DBG_FRAGTREE(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
  92. #else
  93. #define JFFS2_DBG_FRAGTREE(fmt, ...)
  94. #endif
  95. /* Directory entry list manilulation debugging messages */
  96. #ifdef JFFS2_DBG_DENTLIST_MESSAGES
  97. #define JFFS2_DBG_DENTLIST(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
  98. #else
  99. #define JFFS2_DBG_DENTLIST(fmt, ...)
  100. #endif
  101. #ifdef JFFS2_DBG_FRAGTREE2_MESSAGES
  102. #define JFFS2_DBG_FRAGTREE2(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
  103. #else
  104. #define JFFS2_DBG_FRAGTREE2(fmt, ...)
  105. #endif
  106. /* Print the messages about manipulating node_refs */
  107. #ifdef JFFS2_DBG_NODEREF_MESSAGES
  108. #define JFFS2_DBG_NODEREF(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
  109. #else
  110. #define JFFS2_DBG_NODEREF(fmt, ...)
  111. #endif
  112. /* Manipulations with the list of inodes (JFFS2 inocache) */
  113. #ifdef JFFS2_DBG_INOCACHE_MESSAGES
  114. #define JFFS2_DBG_INOCACHE(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
  115. #else
  116. #define JFFS2_DBG_INOCACHE(fmt, ...)
  117. #endif
  118. /* Watch the object allocations */
  119. #ifdef JFFS2_DBG_MEMALLOC_MESSAGES
  120. #define JFFS2_DBG_MEMALLOC(fmt, ...) JFFS2_DEBUG(fmt, ##__VA_ARGS__)
  121. #else
  122. #define JFFS2_DBG_MEMALLOC(fmt, ...)
  123. #endif
  124. /* "Paranoia" checks */
  125. void
  126. __jffs2_dbg_fragtree_paranoia_check(struct jffs2_inode_info *f);
  127. void
  128. __jffs2_dbg_fragtree_paranoia_check_nolock(struct jffs2_inode_info *f);
  129. void
  130. __jffs2_dbg_acct_paranoia_check(struct jffs2_sb_info *c,
  131. struct jffs2_eraseblock *jeb);
  132. void
  133. __jffs2_dbg_acct_paranoia_check_nolock(struct jffs2_sb_info *c,
  134. struct jffs2_eraseblock *jeb);
  135. void
  136. __jffs2_dbg_prewrite_paranoia_check(struct jffs2_sb_info *c,
  137. uint32_t ofs, int len);
  138. /* "Dump" functions */
  139. void
  140. __jffs2_dbg_dump_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
  141. void
  142. __jffs2_dbg_dump_jeb_nolock(struct jffs2_eraseblock *jeb);
  143. void
  144. __jffs2_dbg_dump_block_lists(struct jffs2_sb_info *c);
  145. void
  146. __jffs2_dbg_dump_block_lists_nolock(struct jffs2_sb_info *c);
  147. void
  148. __jffs2_dbg_dump_node_refs(struct jffs2_sb_info *c,
  149. struct jffs2_eraseblock *jeb);
  150. void
  151. __jffs2_dbg_dump_node_refs_nolock(struct jffs2_sb_info *c,
  152. struct jffs2_eraseblock *jeb);
  153. void
  154. __jffs2_dbg_dump_fragtree(struct jffs2_inode_info *f);
  155. void
  156. __jffs2_dbg_dump_fragtree_nolock(struct jffs2_inode_info *f);
  157. void
  158. __jffs2_dbg_dump_buffer(unsigned char *buf, int len, uint32_t offs);
  159. void
  160. __jffs2_dbg_dump_node(struct jffs2_sb_info *c, uint32_t ofs);
  161. #ifdef JFFS2_DBG_PARANOIA_CHECKS
  162. #define jffs2_dbg_fragtree_paranoia_check(f) \
  163. __jffs2_dbg_fragtree_paranoia_check(f)
  164. #define jffs2_dbg_fragtree_paranoia_check_nolock(f) \
  165. __jffs2_dbg_fragtree_paranoia_check_nolock(f)
  166. #define jffs2_dbg_acct_paranoia_check(c, jeb) \
  167. __jffs2_dbg_acct_paranoia_check(c,jeb)
  168. #define jffs2_dbg_acct_paranoia_check_nolock(c, jeb) \
  169. __jffs2_dbg_acct_paranoia_check_nolock(c,jeb)
  170. #define jffs2_dbg_prewrite_paranoia_check(c, ofs, len) \
  171. __jffs2_dbg_prewrite_paranoia_check(c, ofs, len)
  172. #else
  173. #define jffs2_dbg_fragtree_paranoia_check(f)
  174. #define jffs2_dbg_fragtree_paranoia_check_nolock(f)
  175. #define jffs2_dbg_acct_paranoia_check(c, jeb)
  176. #define jffs2_dbg_acct_paranoia_check_nolock(c, jeb)
  177. #define jffs2_dbg_prewrite_paranoia_check(c, ofs, len)
  178. #endif /* !JFFS2_PARANOIA_CHECKS */
  179. #ifdef JFFS2_DBG_DUMPS
  180. #define jffs2_dbg_dump_jeb(c, jeb) \
  181. __jffs2_dbg_dump_jeb(c, jeb);
  182. #define jffs2_dbg_dump_jeb_nolock(jeb) \
  183. __jffs2_dbg_dump_jeb_nolock(jeb);
  184. #define jffs2_dbg_dump_block_lists(c) \
  185. __jffs2_dbg_dump_block_lists(c)
  186. #define jffs2_dbg_dump_block_lists_nolock(c) \
  187. __jffs2_dbg_dump_block_lists_nolock(c)
  188. #define jffs2_dbg_dump_fragtree(f) \
  189. __jffs2_dbg_dump_fragtree(f);
  190. #define jffs2_dbg_dump_fragtree_nolock(f) \
  191. __jffs2_dbg_dump_fragtree_nolock(f);
  192. #define jffs2_dbg_dump_buffer(buf, len, offs) \
  193. __jffs2_dbg_dump_buffer(*buf, len, offs);
  194. #define jffs2_dbg_dump_node(c, ofs) \
  195. __jffs2_dbg_dump_node(c, ofs);
  196. #else
  197. #define jffs2_dbg_dump_jeb(c, jeb)
  198. #define jffs2_dbg_dump_jeb_nolock(jeb)
  199. #define jffs2_dbg_dump_block_lists(c)
  200. #define jffs2_dbg_dump_block_lists_nolock(c)
  201. #define jffs2_dbg_dump_fragtree(f)
  202. #define jffs2_dbg_dump_fragtree_nolock(f)
  203. #define jffs2_dbg_dump_buffer(buf, len, offs)
  204. #define jffs2_dbg_dump_node(c, ofs)
  205. #endif /* !JFFS2_DBG_DUMPS */
  206. /*
  207. * Sanity checks are supposed to be light-weight and enabled by default.
  208. */
  209. #ifdef JFFS2_DBG_SANITY_CHECKS
  210. /*
  211. * Check the space accounting of the file system and of
  212. * the JFFS2 erasable block 'jeb'.
  213. */
  214. static inline void
  215. jffs2_dbg_acct_sanity_check_nolock(struct jffs2_sb_info *c,
  216. struct jffs2_eraseblock *jeb)
  217. {
  218. if (unlikely(jeb && jeb->used_size + jeb->dirty_size +
  219. jeb->free_size + jeb->wasted_size +
  220. jeb->unchecked_size != c->sector_size)) {
  221. JFFS2_ERROR("eeep, space accounting for block at 0x%08x is screwed.\n", jeb->offset);
  222. JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + wasted %#08x + unchecked "
  223. "%#08x != total %#08x.\n", jeb->free_size, jeb->dirty_size, jeb->used_size,
  224. jeb->wasted_size, jeb->unchecked_size, c->sector_size);
  225. BUG();
  226. }
  227. if (unlikely(c->used_size + c->dirty_size + c->free_size + c->erasing_size + c->bad_size
  228. + c->wasted_size + c->unchecked_size != c->flash_size)) {
  229. JFFS2_ERROR("eeep, space accounting superblock info is screwed.\n");
  230. JFFS2_ERROR("free %#08x + dirty %#08x + used %#08x + erasing %#08x + bad %#08x + "
  231. "wasted %#08x + unchecked %#08x != total %#08x.\n",
  232. c->free_size, c->dirty_size, c->used_size, c->erasing_size, c->bad_size,
  233. c->wasted_size, c->unchecked_size, c->flash_size);
  234. BUG();
  235. }
  236. }
  237. static inline void
  238. jffs2_dbg_acct_sanity_check(struct jffs2_sb_info *c,
  239. struct jffs2_eraseblock *jeb)
  240. {
  241. spin_lock(&c->erase_completion_lock);
  242. jffs2_dbg_acct_sanity_check_nolock(c, jeb);
  243. spin_unlock(&c->erase_completion_lock);
  244. }
  245. #else
  246. #define jffs2_dbg_acct_sanity_check(c, jeb)
  247. #define jffs2_dbg_acct_sanity_check_nolock(c, jeb)
  248. #endif /* !JFFS2_DBG_SANITY_CHECKS */
  249. #endif /* _JFFS2_DEBUG_H_ */