aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/ubifs/commit.c25
-rw-r--r--fs/ubifs/debug.c71
-rw-r--r--fs/ubifs/debug.h51
-rw-r--r--fs/ubifs/lprops.c2
-rw-r--r--fs/ubifs/lpt_commit.c55
-rw-r--r--fs/ubifs/orphan.c2
-rw-r--r--fs/ubifs/super.c22
-rw-r--r--fs/ubifs/tnc_commit.c7
-rw-r--r--fs/ubifs/ubifs.h34
9 files changed, 156 insertions, 113 deletions
diff --git a/fs/ubifs/commit.c b/fs/ubifs/commit.c
index b49884c8c10e..f3a7945527fb 100644
--- a/fs/ubifs/commit.c
+++ b/fs/ubifs/commit.c
@@ -470,12 +470,12 @@ int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot)
470{ 470{
471 struct ubifs_idx_node *idx; 471 struct ubifs_idx_node *idx;
472 int lnum, offs, len, err = 0; 472 int lnum, offs, len, err = 0;
473 struct ubifs_debug_info *d = c->dbg;
473 474
474 c->old_zroot = *zroot; 475 d->old_zroot = *zroot;
475 476 lnum = d->old_zroot.lnum;
476 lnum = c->old_zroot.lnum; 477 offs = d->old_zroot.offs;
477 offs = c->old_zroot.offs; 478 len = d->old_zroot.len;
478 len = c->old_zroot.len;
479 479
480 idx = kmalloc(c->max_idx_node_sz, GFP_NOFS); 480 idx = kmalloc(c->max_idx_node_sz, GFP_NOFS);
481 if (!idx) 481 if (!idx)
@@ -485,8 +485,8 @@ int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot)
485 if (err) 485 if (err)
486 goto out; 486 goto out;
487 487
488 c->old_zroot_level = le16_to_cpu(idx->level); 488 d->old_zroot_level = le16_to_cpu(idx->level);
489 c->old_zroot_sqnum = le64_to_cpu(idx->ch.sqnum); 489 d->old_zroot_sqnum = le64_to_cpu(idx->ch.sqnum);
490out: 490out:
491 kfree(idx); 491 kfree(idx);
492 return err; 492 return err;
@@ -509,6 +509,7 @@ int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot)
509{ 509{
510 int lnum, offs, len, err = 0, uninitialized_var(last_level), child_cnt; 510 int lnum, offs, len, err = 0, uninitialized_var(last_level), child_cnt;
511 int first = 1, iip; 511 int first = 1, iip;
512 struct ubifs_debug_info *d = c->dbg;
512 union ubifs_key lower_key, upper_key, l_key, u_key; 513 union ubifs_key lower_key, upper_key, l_key, u_key;
513 unsigned long long uninitialized_var(last_sqnum); 514 unsigned long long uninitialized_var(last_sqnum);
514 struct ubifs_idx_node *idx; 515 struct ubifs_idx_node *idx;
@@ -525,9 +526,9 @@ int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot)
525 UBIFS_IDX_NODE_SZ; 526 UBIFS_IDX_NODE_SZ;
526 527
527 /* Start at the old zroot */ 528 /* Start at the old zroot */
528 lnum = c->old_zroot.lnum; 529 lnum = d->old_zroot.lnum;
529 offs = c->old_zroot.offs; 530 offs = d->old_zroot.offs;
530 len = c->old_zroot.len; 531 len = d->old_zroot.len;
531 iip = 0; 532 iip = 0;
532 533
533 /* 534 /*
@@ -560,11 +561,11 @@ int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot)
560 if (first) { 561 if (first) {
561 first = 0; 562 first = 0;
562 /* Check root level and sqnum */ 563 /* Check root level and sqnum */
563 if (le16_to_cpu(idx->level) != c->old_zroot_level) { 564 if (le16_to_cpu(idx->level) != d->old_zroot_level) {
564 err = 2; 565 err = 2;
565 goto out_dump; 566 goto out_dump;
566 } 567 }
567 if (le64_to_cpu(idx->ch.sqnum) != c->old_zroot_sqnum) { 568 if (le64_to_cpu(idx->ch.sqnum) != d->old_zroot_sqnum) {
568 err = 3; 569 err = 3;
569 goto out_dump; 570 goto out_dump;
570 } 571 }
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c
index 510ffa0bbda4..0332a856a082 100644
--- a/fs/ubifs/debug.c
+++ b/fs/ubifs/debug.c
@@ -705,7 +705,7 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum)
705 705
706 printk(KERN_DEBUG "(pid %d) Dumping LEB %d\n", current->pid, lnum); 706 printk(KERN_DEBUG "(pid %d) Dumping LEB %d\n", current->pid, lnum);
707 707
708 sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); 708 sleb = ubifs_scan(c, lnum, 0, c->dbg->buf);
709 if (IS_ERR(sleb)) { 709 if (IS_ERR(sleb)) {
710 ubifs_err("scan error %d", (int)PTR_ERR(sleb)); 710 ubifs_err("scan error %d", (int)PTR_ERR(sleb));
711 return; 711 return;
@@ -2097,7 +2097,7 @@ static int simple_rand(void)
2097 return (next >> 16) & 32767; 2097 return (next >> 16) & 32767;
2098} 2098}
2099 2099
2100void dbg_failure_mode_registration(struct ubifs_info *c) 2100static void failure_mode_init(struct ubifs_info *c)
2101{ 2101{
2102 struct failure_mode_info *fmi; 2102 struct failure_mode_info *fmi;
2103 2103
@@ -2112,7 +2112,7 @@ void dbg_failure_mode_registration(struct ubifs_info *c)
2112 spin_unlock(&fmi_lock); 2112 spin_unlock(&fmi_lock);
2113} 2113}
2114 2114
2115void dbg_failure_mode_deregistration(struct ubifs_info *c) 2115static void failure_mode_exit(struct ubifs_info *c)
2116{ 2116{
2117 struct failure_mode_info *fmi, *tmp; 2117 struct failure_mode_info *fmi, *tmp;
2118 2118
@@ -2146,42 +2146,44 @@ static int in_failure_mode(struct ubi_volume_desc *desc)
2146 struct ubifs_info *c = dbg_find_info(desc); 2146 struct ubifs_info *c = dbg_find_info(desc);
2147 2147
2148 if (c && dbg_failure_mode) 2148 if (c && dbg_failure_mode)
2149 return c->failure_mode; 2149 return c->dbg->failure_mode;
2150 return 0; 2150 return 0;
2151} 2151}
2152 2152
2153static int do_fail(struct ubi_volume_desc *desc, int lnum, int write) 2153static int do_fail(struct ubi_volume_desc *desc, int lnum, int write)
2154{ 2154{
2155 struct ubifs_info *c = dbg_find_info(desc); 2155 struct ubifs_info *c = dbg_find_info(desc);
2156 struct ubifs_debug_info *d;
2156 2157
2157 if (!c || !dbg_failure_mode) 2158 if (!c || !dbg_failure_mode)
2158 return 0; 2159 return 0;
2159 if (c->failure_mode) 2160 d = c->dbg;
2161 if (d->failure_mode)
2160 return 1; 2162 return 1;
2161 if (!c->fail_cnt) { 2163 if (!d->fail_cnt) {
2162 /* First call - decide delay to failure */ 2164 /* First call - decide delay to failure */
2163 if (chance(1, 2)) { 2165 if (chance(1, 2)) {
2164 unsigned int delay = 1 << (simple_rand() >> 11); 2166 unsigned int delay = 1 << (simple_rand() >> 11);
2165 2167
2166 if (chance(1, 2)) { 2168 if (chance(1, 2)) {
2167 c->fail_delay = 1; 2169 d->fail_delay = 1;
2168 c->fail_timeout = jiffies + 2170 d->fail_timeout = jiffies +
2169 msecs_to_jiffies(delay); 2171 msecs_to_jiffies(delay);
2170 dbg_rcvry("failing after %ums", delay); 2172 dbg_rcvry("failing after %ums", delay);
2171 } else { 2173 } else {
2172 c->fail_delay = 2; 2174 d->fail_delay = 2;
2173 c->fail_cnt_max = delay; 2175 d->fail_cnt_max = delay;
2174 dbg_rcvry("failing after %u calls", delay); 2176 dbg_rcvry("failing after %u calls", delay);
2175 } 2177 }
2176 } 2178 }
2177 c->fail_cnt += 1; 2179 d->fail_cnt += 1;
2178 } 2180 }
2179 /* Determine if failure delay has expired */ 2181 /* Determine if failure delay has expired */
2180 if (c->fail_delay == 1) { 2182 if (d->fail_delay == 1) {
2181 if (time_before(jiffies, c->fail_timeout)) 2183 if (time_before(jiffies, d->fail_timeout))
2182 return 0; 2184 return 0;
2183 } else if (c->fail_delay == 2) 2185 } else if (d->fail_delay == 2)
2184 if (c->fail_cnt++ < c->fail_cnt_max) 2186 if (d->fail_cnt++ < d->fail_cnt_max)
2185 return 0; 2187 return 0;
2186 if (lnum == UBIFS_SB_LNUM) { 2188 if (lnum == UBIFS_SB_LNUM) {
2187 if (write) { 2189 if (write) {
@@ -2239,7 +2241,7 @@ static int do_fail(struct ubi_volume_desc *desc, int lnum, int write)
2239 dbg_rcvry("failing in bud LEB %d commit not running", lnum); 2241 dbg_rcvry("failing in bud LEB %d commit not running", lnum);
2240 } 2242 }
2241 ubifs_err("*** SETTING FAILURE MODE ON (LEB %d) ***", lnum); 2243 ubifs_err("*** SETTING FAILURE MODE ON (LEB %d) ***", lnum);
2242 c->failure_mode = 1; 2244 d->failure_mode = 1;
2243 dump_stack(); 2245 dump_stack();
2244 return 1; 2246 return 1;
2245} 2247}
@@ -2344,4 +2346,41 @@ int dbg_leb_map(struct ubi_volume_desc *desc, int lnum, int dtype)
2344 return 0; 2346 return 0;
2345} 2347}
2346 2348
2349/**
2350 * ubifs_debugging_init - initialize UBIFS debugging.
2351 * @c: UBIFS file-system description object
2352 *
2353 * This function initializes debugging-related data for the file system.
2354 * Returns zero in case of success and a negative error code in case of
2355 * failure.
2356 */
2357int ubifs_debugging_init(struct ubifs_info *c)
2358{
2359 c->dbg = kzalloc(sizeof(struct ubifs_debug_info), GFP_KERNEL);
2360 if (!c->dbg)
2361 return -ENOMEM;
2362
2363 c->dbg->buf = vmalloc(c->leb_size);
2364 if (!c->dbg->buf)
2365 goto out;
2366
2367 failure_mode_init(c);
2368 return 0;
2369
2370out:
2371 kfree(c->dbg);
2372 return -ENOMEM;
2373}
2374
2375/**
2376 * ubifs_debugging_exit - free debugging data.
2377 * @c: UBIFS file-system description object
2378 */
2379void ubifs_debugging_exit(struct ubifs_info *c)
2380{
2381 failure_mode_exit(c);
2382 vfree(c->dbg->buf);
2383 kfree(c->dbg);
2384}
2385
2347#endif /* CONFIG_UBIFS_FS_DEBUG */ 2386#endif /* CONFIG_UBIFS_FS_DEBUG */
diff --git a/fs/ubifs/debug.h b/fs/ubifs/debug.h
index 33d6b95071e4..d6ea1362d56a 100644
--- a/fs/ubifs/debug.h
+++ b/fs/ubifs/debug.h
@@ -25,7 +25,43 @@
25 25
26#ifdef CONFIG_UBIFS_FS_DEBUG 26#ifdef CONFIG_UBIFS_FS_DEBUG
27 27
28#define UBIFS_DBG(op) op 28/**
29 * ubifs_debug_info - per-FS debugging information.
30 * @buf: a buffer of LEB size, used for various purposes
31 * @old_zroot: old index root - used by 'dbg_check_old_index()'
32 * @old_zroot_level: old index root level - used by 'dbg_check_old_index()'
33 * @old_zroot_sqnum: old index root sqnum - used by 'dbg_check_old_index()'
34 * @failure_mode: failure mode for recovery testing
35 * @fail_delay: 0=>don't delay, 1=>delay a time, 2=>delay a number of calls
36 * @fail_timeout: time in jiffies when delay of failure mode expires
37 * @fail_cnt: current number of calls to failure mode I/O functions
38 * @fail_cnt_max: number of calls by which to delay failure mode
39 * @chk_lpt_sz: used by LPT tree size checker
40 * @chk_lpt_sz2: used by LPT tree size checker
41 * @chk_lpt_wastage: used by LPT tree size checker
42 * @chk_lpt_lebs: used by LPT tree size checker
43 * @new_nhead_offs: used by LPT tree size checker
44 * @new_ihead_lnum: used by debugging to check ihead_lnum
45 * @new_ihead_offs: used by debugging to check ihead_offs
46 */
47struct ubifs_debug_info {
48 void *buf;
49 struct ubifs_zbranch old_zroot;
50 int old_zroot_level;
51 unsigned long long old_zroot_sqnum;
52 int failure_mode;
53 int fail_delay;
54 unsigned long fail_timeout;
55 unsigned int fail_cnt;
56 unsigned int fail_cnt_max;
57 long long chk_lpt_sz;
58 long long chk_lpt_sz2;
59 long long chk_lpt_wastage;
60 int chk_lpt_lebs;
61 int new_nhead_offs;
62 int new_ihead_lnum;
63 int new_ihead_offs;
64};
29 65
30#define ubifs_assert(expr) do { \ 66#define ubifs_assert(expr) do { \
31 if (unlikely(!(expr))) { \ 67 if (unlikely(!(expr))) { \
@@ -211,6 +247,9 @@ extern unsigned int ubifs_msg_flags;
211extern unsigned int ubifs_chk_flags; 247extern unsigned int ubifs_chk_flags;
212extern unsigned int ubifs_tst_flags; 248extern unsigned int ubifs_tst_flags;
213 249
250int ubifs_debugging_init(struct ubifs_info *c);
251void ubifs_debugging_exit(struct ubifs_info *c);
252
214/* Dump functions */ 253/* Dump functions */
215 254
216const char *dbg_ntype(int type); 255const char *dbg_ntype(int type);
@@ -274,9 +313,6 @@ int dbg_force_in_the_gaps(void);
274 313
275#define dbg_failure_mode (ubifs_tst_flags & UBIFS_TST_RCVRY) 314#define dbg_failure_mode (ubifs_tst_flags & UBIFS_TST_RCVRY)
276 315
277void dbg_failure_mode_registration(struct ubifs_info *c);
278void dbg_failure_mode_deregistration(struct ubifs_info *c);
279
280#ifndef UBIFS_DBG_PRESERVE_UBI 316#ifndef UBIFS_DBG_PRESERVE_UBI
281 317
282#define ubi_leb_read dbg_leb_read 318#define ubi_leb_read dbg_leb_read
@@ -320,8 +356,6 @@ static inline int dbg_change(struct ubi_volume_desc *desc, int lnum,
320 356
321#else /* !CONFIG_UBIFS_FS_DEBUG */ 357#else /* !CONFIG_UBIFS_FS_DEBUG */
322 358
323#define UBIFS_DBG(op)
324
325/* Use "if (0)" to make compiler check arguments even if debugging is off */ 359/* Use "if (0)" to make compiler check arguments even if debugging is off */
326#define ubifs_assert(expr) do { \ 360#define ubifs_assert(expr) do { \
327 if (0 && (expr)) \ 361 if (0 && (expr)) \
@@ -360,6 +394,9 @@ static inline int dbg_change(struct ubi_volume_desc *desc, int lnum,
360#define DBGKEY(key) ((char *)(key)) 394#define DBGKEY(key) ((char *)(key))
361#define DBGKEY1(key) ((char *)(key)) 395#define DBGKEY1(key) ((char *)(key))
362 396
397#define ubifs_debugging_init(c) 0
398#define ubifs_debugging_exit(c) ({})
399
363#define dbg_ntype(type) "" 400#define dbg_ntype(type) ""
364#define dbg_cstate(cmt_state) "" 401#define dbg_cstate(cmt_state) ""
365#define dbg_get_key_dump(c, key) ({}) 402#define dbg_get_key_dump(c, key) ({})
@@ -396,8 +433,6 @@ static inline int dbg_change(struct ubi_volume_desc *desc, int lnum,
396#define dbg_force_in_the_gaps_enabled 0 433#define dbg_force_in_the_gaps_enabled 0
397#define dbg_force_in_the_gaps() 0 434#define dbg_force_in_the_gaps() 0
398#define dbg_failure_mode 0 435#define dbg_failure_mode 0
399#define dbg_failure_mode_registration(c) ({})
400#define dbg_failure_mode_deregistration(c) ({})
401 436
402#endif /* !CONFIG_UBIFS_FS_DEBUG */ 437#endif /* !CONFIG_UBIFS_FS_DEBUG */
403 438
diff --git a/fs/ubifs/lprops.c b/fs/ubifs/lprops.c
index f27176e9b70d..10ba663eb329 100644
--- a/fs/ubifs/lprops.c
+++ b/fs/ubifs/lprops.c
@@ -1088,7 +1088,7 @@ static int scan_check_cb(struct ubifs_info *c,
1088 } 1088 }
1089 } 1089 }
1090 1090
1091 sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); 1091 sleb = ubifs_scan(c, lnum, 0, c->dbg->buf);
1092 if (IS_ERR(sleb)) { 1092 if (IS_ERR(sleb)) {
1093 /* 1093 /*
1094 * After an unclean unmount, empty and freeable LEBs 1094 * After an unclean unmount, empty and freeable LEBs
diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c
index a41434b42785..1aefab9f0b5e 100644
--- a/fs/ubifs/lpt_commit.c
+++ b/fs/ubifs/lpt_commit.c
@@ -1602,7 +1602,7 @@ static int dbg_check_ltab_lnum(struct ubifs_info *c, int lnum)
1602{ 1602{
1603 int err, len = c->leb_size, dirty = 0, node_type, node_num, node_len; 1603 int err, len = c->leb_size, dirty = 0, node_type, node_num, node_len;
1604 int ret; 1604 int ret;
1605 void *buf = c->dbg_buf; 1605 void *buf = c->dbg->buf;
1606 1606
1607 dbg_lp("LEB %d", lnum); 1607 dbg_lp("LEB %d", lnum);
1608 err = ubi_read(c->ubi, lnum, buf, 0, c->leb_size); 1608 err = ubi_read(c->ubi, lnum, buf, 0, c->leb_size);
@@ -1731,15 +1731,16 @@ int dbg_chk_lpt_free_spc(struct ubifs_info *c)
1731 */ 1731 */
1732int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len) 1732int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
1733{ 1733{
1734 struct ubifs_debug_info *d = c->dbg;
1734 long long chk_lpt_sz, lpt_sz; 1735 long long chk_lpt_sz, lpt_sz;
1735 int err = 0; 1736 int err = 0;
1736 1737
1737 switch (action) { 1738 switch (action) {
1738 case 0: 1739 case 0:
1739 c->chk_lpt_sz = 0; 1740 d->chk_lpt_sz = 0;
1740 c->chk_lpt_sz2 = 0; 1741 d->chk_lpt_sz2 = 0;
1741 c->chk_lpt_lebs = 0; 1742 d->chk_lpt_lebs = 0;
1742 c->chk_lpt_wastage = 0; 1743 d->chk_lpt_wastage = 0;
1743 if (c->dirty_pn_cnt > c->pnode_cnt) { 1744 if (c->dirty_pn_cnt > c->pnode_cnt) {
1744 dbg_err("dirty pnodes %d exceed max %d", 1745 dbg_err("dirty pnodes %d exceed max %d",
1745 c->dirty_pn_cnt, c->pnode_cnt); 1746 c->dirty_pn_cnt, c->pnode_cnt);
@@ -1752,35 +1753,35 @@ int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
1752 } 1753 }
1753 return err; 1754 return err;
1754 case 1: 1755 case 1:
1755 c->chk_lpt_sz += len; 1756 d->chk_lpt_sz += len;
1756 return 0; 1757 return 0;
1757 case 2: 1758 case 2:
1758 c->chk_lpt_sz += len; 1759 d->chk_lpt_sz += len;
1759 c->chk_lpt_wastage += len; 1760 d->chk_lpt_wastage += len;
1760 c->chk_lpt_lebs += 1; 1761 d->chk_lpt_lebs += 1;
1761 return 0; 1762 return 0;
1762 case 3: 1763 case 3:
1763 chk_lpt_sz = c->leb_size; 1764 chk_lpt_sz = c->leb_size;
1764 chk_lpt_sz *= c->chk_lpt_lebs; 1765 chk_lpt_sz *= d->chk_lpt_lebs;
1765 chk_lpt_sz += len - c->nhead_offs; 1766 chk_lpt_sz += len - c->nhead_offs;
1766 if (c->chk_lpt_sz != chk_lpt_sz) { 1767 if (d->chk_lpt_sz != chk_lpt_sz) {
1767 dbg_err("LPT wrote %lld but space used was %lld", 1768 dbg_err("LPT wrote %lld but space used was %lld",
1768 c->chk_lpt_sz, chk_lpt_sz); 1769 d->chk_lpt_sz, chk_lpt_sz);
1769 err = -EINVAL; 1770 err = -EINVAL;
1770 } 1771 }
1771 if (c->chk_lpt_sz > c->lpt_sz) { 1772 if (d->chk_lpt_sz > c->lpt_sz) {
1772 dbg_err("LPT wrote %lld but lpt_sz is %lld", 1773 dbg_err("LPT wrote %lld but lpt_sz is %lld",
1773 c->chk_lpt_sz, c->lpt_sz); 1774 d->chk_lpt_sz, c->lpt_sz);
1774 err = -EINVAL; 1775 err = -EINVAL;
1775 } 1776 }
1776 if (c->chk_lpt_sz2 && c->chk_lpt_sz != c->chk_lpt_sz2) { 1777 if (d->chk_lpt_sz2 && d->chk_lpt_sz != d->chk_lpt_sz2) {
1777 dbg_err("LPT layout size %lld but wrote %lld", 1778 dbg_err("LPT layout size %lld but wrote %lld",
1778 c->chk_lpt_sz, c->chk_lpt_sz2); 1779 d->chk_lpt_sz, d->chk_lpt_sz2);
1779 err = -EINVAL; 1780 err = -EINVAL;
1780 } 1781 }
1781 if (c->chk_lpt_sz2 && c->new_nhead_offs != len) { 1782 if (d->chk_lpt_sz2 && d->new_nhead_offs != len) {
1782 dbg_err("LPT new nhead offs: expected %d was %d", 1783 dbg_err("LPT new nhead offs: expected %d was %d",
1783 c->new_nhead_offs, len); 1784 d->new_nhead_offs, len);
1784 err = -EINVAL; 1785 err = -EINVAL;
1785 } 1786 }
1786 lpt_sz = (long long)c->pnode_cnt * c->pnode_sz; 1787 lpt_sz = (long long)c->pnode_cnt * c->pnode_sz;
@@ -1788,22 +1789,22 @@ int dbg_chk_lpt_sz(struct ubifs_info *c, int action, int len)
1788 lpt_sz += c->ltab_sz; 1789 lpt_sz += c->ltab_sz;
1789 if (c->big_lpt) 1790 if (c->big_lpt)
1790 lpt_sz += c->lsave_sz; 1791 lpt_sz += c->lsave_sz;
1791 if (c->chk_lpt_sz - c->chk_lpt_wastage > lpt_sz) { 1792 if (d->chk_lpt_sz - d->chk_lpt_wastage > lpt_sz) {
1792 dbg_err("LPT chk_lpt_sz %lld + waste %lld exceeds %lld", 1793 dbg_err("LPT chk_lpt_sz %lld + waste %lld exceeds %lld",
1793 c->chk_lpt_sz, c->chk_lpt_wastage, lpt_sz); 1794 d->chk_lpt_sz, d->chk_lpt_wastage, lpt_sz);
1794 err = -EINVAL; 1795 err = -EINVAL;
1795 } 1796 }
1796 if (err) 1797 if (err)
1797 dbg_dump_lpt_info(c); 1798 dbg_dump_lpt_info(c);
1798 c->chk_lpt_sz2 = c->chk_lpt_sz; 1799 d->chk_lpt_sz2 = d->chk_lpt_sz;
1799 c->chk_lpt_sz = 0; 1800 d->chk_lpt_sz = 0;
1800 c->chk_lpt_wastage = 0; 1801 d->chk_lpt_wastage = 0;
1801 c->chk_lpt_lebs = 0; 1802 d->chk_lpt_lebs = 0;
1802 c->new_nhead_offs = len; 1803 d->new_nhead_offs = len;
1803 return err; 1804 return err;
1804 case 4: 1805 case 4:
1805 c->chk_lpt_sz += len; 1806 d->chk_lpt_sz += len;
1806 c->chk_lpt_wastage += len; 1807 d->chk_lpt_wastage += len;
1807 return 0; 1808 return 0;
1808 default: 1809 default:
1809 return -EINVAL; 1810 return -EINVAL;
diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c
index 9bd5a43d4526..9e6f403f170e 100644
--- a/fs/ubifs/orphan.c
+++ b/fs/ubifs/orphan.c
@@ -899,7 +899,7 @@ static int dbg_scan_orphans(struct ubifs_info *c, struct check_info *ci)
899 for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) { 899 for (lnum = c->orph_first; lnum <= c->orph_last; lnum++) {
900 struct ubifs_scan_leb *sleb; 900 struct ubifs_scan_leb *sleb;
901 901
902 sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); 902 sleb = ubifs_scan(c, lnum, 0, c->dbg->buf);
903 if (IS_ERR(sleb)) { 903 if (IS_ERR(sleb)) {
904 err = PTR_ERR(sleb); 904 err = PTR_ERR(sleb);
905 break; 905 break;
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index fc81022cc26d..ad44822059c7 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -1069,11 +1069,9 @@ static int mount_ubifs(struct ubifs_info *c)
1069 if (err) 1069 if (err)
1070 return err; 1070 return err;
1071 1071
1072#ifdef CONFIG_UBIFS_FS_DEBUG 1072 err = ubifs_debugging_init(c);
1073 c->dbg_buf = vmalloc(c->leb_size); 1073 if (err)
1074 if (!c->dbg_buf) 1074 return err;
1075 return -ENOMEM;
1076#endif
1077 1075
1078 err = check_volume_empty(c); 1076 err = check_volume_empty(c);
1079 if (err) 1077 if (err)
@@ -1139,18 +1137,16 @@ static int mount_ubifs(struct ubifs_info *c)
1139 goto out_free; 1137 goto out_free;
1140 } 1138 }
1141 1139
1142 dbg_failure_mode_registration(c);
1143
1144 err = init_constants_late(c); 1140 err = init_constants_late(c);
1145 if (err) 1141 if (err)
1146 goto out_dereg; 1142 goto out_free;
1147 1143
1148 sz = ALIGN(c->max_idx_node_sz, c->min_io_size); 1144 sz = ALIGN(c->max_idx_node_sz, c->min_io_size);
1149 sz = ALIGN(sz + c->max_idx_node_sz, c->min_io_size); 1145 sz = ALIGN(sz + c->max_idx_node_sz, c->min_io_size);
1150 c->cbuf = kmalloc(sz, GFP_NOFS); 1146 c->cbuf = kmalloc(sz, GFP_NOFS);
1151 if (!c->cbuf) { 1147 if (!c->cbuf) {
1152 err = -ENOMEM; 1148 err = -ENOMEM;
1153 goto out_dereg; 1149 goto out_free;
1154 } 1150 }
1155 1151
1156 sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id); 1152 sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id);
@@ -1350,14 +1346,12 @@ out_wbufs:
1350 free_wbufs(c); 1346 free_wbufs(c);
1351out_cbuf: 1347out_cbuf:
1352 kfree(c->cbuf); 1348 kfree(c->cbuf);
1353out_dereg:
1354 dbg_failure_mode_deregistration(c);
1355out_free: 1349out_free:
1356 kfree(c->bu.buf); 1350 kfree(c->bu.buf);
1357 vfree(c->ileb_buf); 1351 vfree(c->ileb_buf);
1358 vfree(c->sbuf); 1352 vfree(c->sbuf);
1359 kfree(c->bottom_up_buf); 1353 kfree(c->bottom_up_buf);
1360 UBIFS_DBG(vfree(c->dbg_buf)); 1354 ubifs_debugging_exit(c);
1361 return err; 1355 return err;
1362} 1356}
1363 1357
@@ -1394,8 +1388,7 @@ static void ubifs_umount(struct ubifs_info *c)
1394 vfree(c->ileb_buf); 1388 vfree(c->ileb_buf);
1395 vfree(c->sbuf); 1389 vfree(c->sbuf);
1396 kfree(c->bottom_up_buf); 1390 kfree(c->bottom_up_buf);
1397 UBIFS_DBG(vfree(c->dbg_buf)); 1391 ubifs_debugging_exit(c);
1398 dbg_failure_mode_deregistration(c);
1399} 1392}
1400 1393
1401/** 1394/**
@@ -1879,7 +1872,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent)
1879 goto out_iput; 1872 goto out_iput;
1880 1873
1881 mutex_unlock(&c->umount_mutex); 1874 mutex_unlock(&c->umount_mutex);
1882
1883 return 0; 1875 return 0;
1884 1876
1885out_iput: 1877out_iput:
diff --git a/fs/ubifs/tnc_commit.c b/fs/ubifs/tnc_commit.c
index 8ac76b1c2d55..3c0af452887b 100644
--- a/fs/ubifs/tnc_commit.c
+++ b/fs/ubifs/tnc_commit.c
@@ -553,8 +553,8 @@ static int layout_in_empty_space(struct ubifs_info *c)
553 } 553 }
554 554
555#ifdef CONFIG_UBIFS_FS_DEBUG 555#ifdef CONFIG_UBIFS_FS_DEBUG
556 c->new_ihead_lnum = lnum; 556 c->dbg->new_ihead_lnum = lnum;
557 c->new_ihead_offs = buf_offs; 557 c->dbg->new_ihead_offs = buf_offs;
558#endif 558#endif
559 559
560 return 0; 560 return 0;
@@ -1002,7 +1002,8 @@ static int write_index(struct ubifs_info *c)
1002 } 1002 }
1003 1003
1004#ifdef CONFIG_UBIFS_FS_DEBUG 1004#ifdef CONFIG_UBIFS_FS_DEBUG
1005 if (lnum != c->new_ihead_lnum || buf_offs != c->new_ihead_offs) { 1005 if (lnum != c->dbg->new_ihead_lnum ||
1006 buf_offs != c->dbg->new_ihead_offs) {
1006 ubifs_err("inconsistent ihead"); 1007 ubifs_err("inconsistent ihead");
1007 return -EINVAL; 1008 return -EINVAL;
1008 } 1009 }
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h
index 16840e099eff..7e090a5e2bf6 100644
--- a/fs/ubifs/ubifs.h
+++ b/fs/ubifs/ubifs.h
@@ -910,6 +910,8 @@ struct ubifs_mount_opts {
910 unsigned int compr_type:2; 910 unsigned int compr_type:2;
911}; 911};
912 912
913struct ubifs_debug_info;
914
913/** 915/**
914 * struct ubifs_info - UBIFS file-system description data structure 916 * struct ubifs_info - UBIFS file-system description data structure
915 * (per-superblock). 917 * (per-superblock).
@@ -972,8 +974,6 @@ struct ubifs_mount_opts {
972 * @ileb_nxt: next pre-allocated index LEBs 974 * @ileb_nxt: next pre-allocated index LEBs
973 * @old_idx: tree of index nodes obsoleted since the last commit start 975 * @old_idx: tree of index nodes obsoleted since the last commit start
974 * @bottom_up_buf: a buffer which is used by 'dirty_cow_bottom_up()' in tnc.c 976 * @bottom_up_buf: a buffer which is used by 'dirty_cow_bottom_up()' in tnc.c
975 * @new_ihead_lnum: used by debugging to check ihead_lnum
976 * @new_ihead_offs: used by debugging to check ihead_offs
977 * 977 *
978 * @mst_node: master node 978 * @mst_node: master node
979 * @mst_offs: offset of valid master node 979 * @mst_offs: offset of valid master node
@@ -1157,15 +1157,7 @@ struct ubifs_mount_opts {
1157 * @always_chk_crc: always check CRCs (while mounting and remounting rw) 1157 * @always_chk_crc: always check CRCs (while mounting and remounting rw)
1158 * @mount_opts: UBIFS-specific mount options 1158 * @mount_opts: UBIFS-specific mount options
1159 * 1159 *
1160 * @dbg_buf: a buffer of LEB size used for debugging purposes 1160 * @dbg: debugging-related information
1161 * @old_zroot: old index root - used by 'dbg_check_old_index()'
1162 * @old_zroot_level: old index root level - used by 'dbg_check_old_index()'
1163 * @old_zroot_sqnum: old index root sqnum - used by 'dbg_check_old_index()'
1164 * @failure_mode: failure mode for recovery testing
1165 * @fail_delay: 0=>don't delay, 1=>delay a time, 2=>delay a number of calls
1166 * @fail_timeout: time in jiffies when delay of failure mode expires
1167 * @fail_cnt: current number of calls to failure mode I/O functions
1168 * @fail_cnt_max: number of calls by which to delay failure mode
1169 */ 1161 */
1170struct ubifs_info { 1162struct ubifs_info {
1171 struct super_block *vfs_sb; 1163 struct super_block *vfs_sb;
@@ -1221,10 +1213,6 @@ struct ubifs_info {
1221 int ileb_nxt; 1213 int ileb_nxt;
1222 struct rb_root old_idx; 1214 struct rb_root old_idx;
1223 int *bottom_up_buf; 1215 int *bottom_up_buf;
1224#ifdef CONFIG_UBIFS_FS_DEBUG
1225 int new_ihead_lnum;
1226 int new_ihead_offs;
1227#endif
1228 1216
1229 struct ubifs_mst_node *mst_node; 1217 struct ubifs_mst_node *mst_node;
1230 int mst_offs; 1218 int mst_offs;
@@ -1399,21 +1387,7 @@ struct ubifs_info {
1399 struct ubifs_mount_opts mount_opts; 1387 struct ubifs_mount_opts mount_opts;
1400 1388
1401#ifdef CONFIG_UBIFS_FS_DEBUG 1389#ifdef CONFIG_UBIFS_FS_DEBUG
1402 void *dbg_buf; 1390 struct ubifs_debug_info *dbg;
1403 struct ubifs_zbranch old_zroot;
1404 int old_zroot_level;
1405 unsigned long long old_zroot_sqnum;
1406 int failure_mode;
1407 int fail_delay;
1408 unsigned long fail_timeout;
1409 unsigned int fail_cnt;
1410 unsigned int fail_cnt_max;
1411 long long chk_lpt_sz;
1412 long long chk_lpt_sz2;
1413 long long chk_lpt_wastage;
1414 int chk_lpt_lebs;
1415 int new_nhead_lnum;
1416 int new_nhead_offs;
1417#endif 1391#endif
1418}; 1392};
1419 1393