aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-03-29 14:36:49 -0500
committerSteven Whitehouse <swhiteho@redhat.com>2006-03-29 14:36:49 -0500
commitd0dc80dbafb5c10ad2084831a61bbf945484a139 (patch)
treef7434367a66e4e4be0885daefe5e59ab43502a7f
parent484adff8a06cb5d952832f5487ae863f54c0fb69 (diff)
[GFS2] Update debugging code
Update the debugging code in trans.c and at the same time improve the debugging code for gfs2_holders. The new code should be pretty fast during the normal case and provide just as much information in case of errors (or more). One small function from glock.c has moved to glock.h as a static inline so that its return address won't get in the way of the debugging. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/glock.c34
-rw-r--r--fs/gfs2/glock.h27
-rw-r--r--fs/gfs2/incore.h4
-rw-r--r--fs/gfs2/trans.c32
-rw-r--r--fs/gfs2/trans.h8
5 files changed, 52 insertions, 53 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 81b06812b32..6a1b42cf4df 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -16,6 +16,7 @@
16#include <linux/sort.h> 16#include <linux/sort.h>
17#include <linux/jhash.h> 17#include <linux/jhash.h>
18#include <linux/kref.h> 18#include <linux/kref.h>
19#include <linux/kallsyms.h>
19#include <linux/gfs2_ondisk.h> 20#include <linux/gfs2_ondisk.h>
20#include <asm/semaphore.h> 21#include <asm/semaphore.h>
21#include <asm/uaccess.h> 22#include <asm/uaccess.h>
@@ -357,6 +358,7 @@ void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, int flags,
357{ 358{
358 INIT_LIST_HEAD(&gh->gh_list); 359 INIT_LIST_HEAD(&gh->gh_list);
359 gh->gh_gl = gl; 360 gh->gh_gl = gl;
361 gh->gh_ip = (unsigned long)__builtin_return_address(0);
360 gh->gh_owner = (flags & GL_NEVER_RECURSE) ? NULL : current; 362 gh->gh_owner = (flags & GL_NEVER_RECURSE) ? NULL : current;
361 gh->gh_state = state; 363 gh->gh_state = state;
362 gh->gh_flags = flags; 364 gh->gh_flags = flags;
@@ -388,6 +390,7 @@ void gfs2_holder_reinit(unsigned int state, int flags, struct gfs2_holder *gh)
388 gh->gh_flags |= GL_LOCAL_EXCL; 390 gh->gh_flags |= GL_LOCAL_EXCL;
389 391
390 gh->gh_iflags &= 1 << HIF_ALLOCED; 392 gh->gh_iflags &= 1 << HIF_ALLOCED;
393 gh->gh_ip = (unsigned long)__builtin_return_address(0);
391} 394}
392 395
393/** 396/**
@@ -400,6 +403,7 @@ void gfs2_holder_uninit(struct gfs2_holder *gh)
400{ 403{
401 gfs2_glock_put(gh->gh_gl); 404 gfs2_glock_put(gh->gh_gl);
402 gh->gh_gl = NULL; 405 gh->gh_gl = NULL;
406 gh->gh_ip = 0;
403} 407}
404 408
405/** 409/**
@@ -427,7 +431,7 @@ struct gfs2_holder *gfs2_holder_get(struct gfs2_glock *gl, unsigned int state,
427 431
428 gfs2_holder_init(gl, state, flags, gh); 432 gfs2_holder_init(gl, state, flags, gh);
429 set_bit(HIF_ALLOCED, &gh->gh_iflags); 433 set_bit(HIF_ALLOCED, &gh->gh_iflags);
430 434 gh->gh_ip = (unsigned long)__builtin_return_address(0);
431 return gh; 435 return gh;
432} 436}
433 437
@@ -1238,6 +1242,9 @@ static int recurse_check(struct gfs2_holder *existing, struct gfs2_holder *new,
1238 return 0; 1242 return 0;
1239 1243
1240 fail: 1244 fail:
1245 print_symbol(KERN_WARNING "GFS2: Existing holder from %s\n",
1246 existing->gh_ip);
1247 print_symbol(KERN_WARNING "GFS2: New holder from %s\n", new->gh_ip);
1241 set_bit(HIF_ABORTED, &new->gh_iflags); 1248 set_bit(HIF_ABORTED, &new->gh_iflags);
1242 return -EINVAL; 1249 return -EINVAL;
1243} 1250}
@@ -1544,30 +1551,6 @@ int gfs2_glock_be_greedy(struct gfs2_glock *gl, unsigned int time)
1544} 1551}
1545 1552
1546/** 1553/**
1547 * gfs2_glock_nq_init - intialize a holder and enqueue it on a glock
1548 * @gl: the glock
1549 * @state: the state we're requesting
1550 * @flags: the modifier flags
1551 * @gh: the holder structure
1552 *
1553 * Returns: 0, GLR_*, or errno
1554 */
1555
1556int gfs2_glock_nq_init(struct gfs2_glock *gl, unsigned int state, int flags,
1557 struct gfs2_holder *gh)
1558{
1559 int error;
1560
1561 gfs2_holder_init(gl, state, flags, gh);
1562
1563 error = gfs2_glock_nq(gh);
1564 if (error)
1565 gfs2_holder_uninit(gh);
1566
1567 return error;
1568}
1569
1570/**
1571 * gfs2_glock_dq_uninit - dequeue a holder from a glock and initialize it 1554 * gfs2_glock_dq_uninit - dequeue a holder from a glock and initialize it
1572 * @gh: the holder structure 1555 * @gh: the holder structure
1573 * 1556 *
@@ -2334,6 +2317,7 @@ static int dump_holder(char *str, struct gfs2_holder *gh)
2334 if (test_bit(x, &gh->gh_iflags)) 2317 if (test_bit(x, &gh->gh_iflags))
2335 printk(" %u", x); 2318 printk(" %u", x);
2336 printk(" \n"); 2319 printk(" \n");
2320 print_symbol(KERN_INFO " initialized at: %s\n", gh->gh_ip);
2337 2321
2338 error = 0; 2322 error = 0;
2339 2323
diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h
index 06847ebebde..560029de8d0 100644
--- a/fs/gfs2/glock.h
+++ b/fs/gfs2/glock.h
@@ -106,8 +106,6 @@ void gfs2_glock_force_drop(struct gfs2_glock *gl);
106 106
107int gfs2_glock_be_greedy(struct gfs2_glock *gl, unsigned int time); 107int gfs2_glock_be_greedy(struct gfs2_glock *gl, unsigned int time);
108 108
109int gfs2_glock_nq_init(struct gfs2_glock *gl, unsigned int state, int flags,
110 struct gfs2_holder *gh);
111void gfs2_glock_dq_uninit(struct gfs2_holder *gh); 109void gfs2_glock_dq_uninit(struct gfs2_holder *gh);
112int gfs2_glock_nq_num(struct gfs2_sbd *sdp, 110int gfs2_glock_nq_num(struct gfs2_sbd *sdp,
113 uint64_t number, struct gfs2_glock_operations *glops, 111 uint64_t number, struct gfs2_glock_operations *glops,
@@ -121,6 +119,31 @@ void gfs2_glock_prefetch_num(struct gfs2_sbd *sdp, uint64_t number,
121 struct gfs2_glock_operations *glops, 119 struct gfs2_glock_operations *glops,
122 unsigned int state, int flags); 120 unsigned int state, int flags);
123 121
122/**
123 * gfs2_glock_nq_init - intialize a holder and enqueue it on a glock
124 * @gl: the glock
125 * @state: the state we're requesting
126 * @flags: the modifier flags
127 * @gh: the holder structure
128 *
129 * Returns: 0, GLR_*, or errno
130 */
131
132static inline int gfs2_glock_nq_init(struct gfs2_glock *gl,
133 unsigned int state, int flags,
134 struct gfs2_holder *gh)
135{
136 int error;
137
138 gfs2_holder_init(gl, state, flags, gh);
139
140 error = gfs2_glock_nq(gh);
141 if (error)
142 gfs2_holder_uninit(gh);
143
144 return error;
145}
146
124/* Lock Value Block functions */ 147/* Lock Value Block functions */
125 148
126int gfs2_lvb_hold(struct gfs2_glock *gl); 149int gfs2_lvb_hold(struct gfs2_glock *gl);
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 35163b56246..b5a994d1b5f 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -161,6 +161,7 @@ struct gfs2_holder {
161 int gh_error; 161 int gh_error;
162 unsigned long gh_iflags; 162 unsigned long gh_iflags;
163 struct completion gh_wait; 163 struct completion gh_wait;
164 unsigned long gh_ip;
164}; 165};
165 166
166enum { 167enum {
@@ -353,8 +354,7 @@ struct gfs2_log_buf {
353}; 354};
354 355
355struct gfs2_trans { 356struct gfs2_trans {
356 char *tr_file; 357 unsigned long tr_ip;
357 unsigned int tr_line;
358 358
359 unsigned int tr_blocks; 359 unsigned int tr_blocks;
360 unsigned int tr_revokes; 360 unsigned int tr_revokes;
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
index aa1a619f085..3fae3d4e9ae 100644
--- a/fs/gfs2/trans.c
+++ b/fs/gfs2/trans.c
@@ -13,6 +13,7 @@
13#include <linux/completion.h> 13#include <linux/completion.h>
14#include <linux/buffer_head.h> 14#include <linux/buffer_head.h>
15#include <linux/gfs2_ondisk.h> 15#include <linux/gfs2_ondisk.h>
16#include <linux/kallsyms.h>
16#include <asm/semaphore.h> 17#include <asm/semaphore.h>
17 18
18#include "gfs2.h" 19#include "gfs2.h"
@@ -25,24 +26,20 @@
25#include "trans.h" 26#include "trans.h"
26#include "util.h" 27#include "util.h"
27 28
28int gfs2_trans_begin_i(struct gfs2_sbd *sdp, unsigned int blocks, 29int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
29 unsigned int revokes, char *file, unsigned int line) 30 unsigned int revokes)
30{ 31{
31 struct gfs2_trans *tr; 32 struct gfs2_trans *tr;
32 int error; 33 int error;
33 34
34 if (gfs2_assert_warn(sdp, !current->journal_info) || 35 BUG_ON(current->journal_info);
35 gfs2_assert_warn(sdp, blocks || revokes)) { 36 BUG_ON(blocks == 0 && revokes == 0);
36 fs_warn(sdp, "(%s, %u)\n", file, line);
37 return -EINVAL;
38 }
39 37
40 tr = kzalloc(sizeof(struct gfs2_trans), GFP_NOFS); 38 tr = kzalloc(sizeof(struct gfs2_trans), GFP_NOFS);
41 if (!tr) 39 if (!tr)
42 return -ENOMEM; 40 return -ENOMEM;
43 41
44 tr->tr_file = file; 42 tr->tr_ip = (unsigned long)__builtin_return_address(0);
45 tr->tr_line = line;
46 tr->tr_blocks = blocks; 43 tr->tr_blocks = blocks;
47 tr->tr_revokes = revokes; 44 tr->tr_revokes = revokes;
48 tr->tr_reserved = 1; 45 tr->tr_reserved = 1;
@@ -104,16 +101,15 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
104 return; 101 return;
105 } 102 }
106 103
107 if (gfs2_assert_withdraw(sdp, tr->tr_num_buf <= tr->tr_blocks)) 104 if (gfs2_assert_withdraw(sdp, tr->tr_num_buf <= tr->tr_blocks)) {
108 fs_err(sdp, "tr_num_buf = %u, tr_blocks = %u " 105 fs_err(sdp, "tr_num_buf = %u, tr_blocks = %u ",
109 "tr_file = %s, tr_line = %u\n", 106 tr->tr_num_buf, tr->tr_blocks);
110 tr->tr_num_buf, tr->tr_blocks, 107 print_symbol(KERN_WARNING "GFS2: Transaction created at: %s\n", tr->tr_ip);
111 tr->tr_file, tr->tr_line); 108 }
112 if (gfs2_assert_withdraw(sdp, tr->tr_num_revoke <= tr->tr_revokes)) 109 if (gfs2_assert_withdraw(sdp, tr->tr_num_revoke <= tr->tr_revokes))
113 fs_err(sdp, "tr_num_revoke = %u, tr_revokes = %u " 110 fs_err(sdp, "tr_num_revoke = %u, tr_revokes = %u ",
114 "tr_file = %s, tr_line = %u\n", 111 tr->tr_num_revoke, tr->tr_revokes);
115 tr->tr_num_revoke, tr->tr_revokes, 112 print_symbol(KERN_WARNING "GFS2: Transaction created at: %s\n", tr->tr_ip);
116 tr->tr_file, tr->tr_line);
117 113
118 gfs2_log_commit(sdp, tr); 114 gfs2_log_commit(sdp, tr);
119 115
diff --git a/fs/gfs2/trans.h b/fs/gfs2/trans.h
index f7f3e2a3d59..6b5e9e8bf56 100644
--- a/fs/gfs2/trans.h
+++ b/fs/gfs2/trans.h
@@ -21,12 +21,8 @@
21#define RES_STATFS 1 21#define RES_STATFS 1
22#define RES_QUOTA 2 22#define RES_QUOTA 2
23 23
24#define gfs2_trans_begin(sdp, blocks, revokes) \ 24int gfs2_trans_begin(struct gfs2_sbd *sdp,
25gfs2_trans_begin_i((sdp), (blocks), (revokes), __FILE__, __LINE__) 25 unsigned int blocks, unsigned int revokes);
26
27int gfs2_trans_begin_i(struct gfs2_sbd *sdp,
28 unsigned int blocks, unsigned int revokes,
29 char *file, unsigned int line);
30 26
31void gfs2_trans_end(struct gfs2_sbd *sdp); 27void gfs2_trans_end(struct gfs2_sbd *sdp);
32 28