Commit b016d9a8 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher

gfs2: Save ip from gfs2_glock_nq_init

Before this patch, when a glock was locked by function gfs2_glock_nq_init,
it initialized the holder gh_ip (return address) as gfs2_glock_nq_init.
That made it extremely difficult to track down problems because many
functions call gfs2_glock_nq_init. This patch changes the function so
that it saves gh_ip from the caller of gfs2_glock_nq_init, which makes
it easy to backtrack which holder took the lock.
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
parent a500bd31
...@@ -911,7 +911,7 @@ static void gfs2_glock_poke(struct gfs2_glock *gl) ...@@ -911,7 +911,7 @@ static void gfs2_glock_poke(struct gfs2_glock *gl)
struct gfs2_holder gh; struct gfs2_holder gh;
int error; int error;
gfs2_holder_init(gl, LM_ST_SHARED, flags, &gh); __gfs2_holder_init(gl, LM_ST_SHARED, flags, &gh, _RET_IP_);
error = gfs2_glock_nq(&gh); error = gfs2_glock_nq(&gh);
if (!error) if (!error)
gfs2_glock_dq(&gh); gfs2_glock_dq(&gh);
...@@ -1208,12 +1208,12 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -1208,12 +1208,12 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
* *
*/ */
void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags, void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags,
struct gfs2_holder *gh) struct gfs2_holder *gh, unsigned long ip)
{ {
INIT_LIST_HEAD(&gh->gh_list); INIT_LIST_HEAD(&gh->gh_list);
gh->gh_gl = gl; gh->gh_gl = gl;
gh->gh_ip = _RET_IP_; gh->gh_ip = ip;
gh->gh_owner_pid = get_pid(task_pid(current)); gh->gh_owner_pid = get_pid(task_pid(current));
gh->gh_state = state; gh->gh_state = state;
gh->gh_flags = flags; gh->gh_flags = flags;
......
...@@ -190,8 +190,15 @@ extern int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -190,8 +190,15 @@ extern int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
extern void gfs2_glock_hold(struct gfs2_glock *gl); extern void gfs2_glock_hold(struct gfs2_glock *gl);
extern void gfs2_glock_put(struct gfs2_glock *gl); extern void gfs2_glock_put(struct gfs2_glock *gl);
extern void gfs2_glock_queue_put(struct gfs2_glock *gl); extern void gfs2_glock_queue_put(struct gfs2_glock *gl);
extern void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state,
u16 flags, struct gfs2_holder *gh); extern void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state,
u16 flags, struct gfs2_holder *gh,
unsigned long ip);
static inline void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state,
u16 flags, struct gfs2_holder *gh) {
__gfs2_holder_init(gl, state, flags, gh, _RET_IP_);
}
extern void gfs2_holder_reinit(unsigned int state, u16 flags, extern void gfs2_holder_reinit(unsigned int state, u16 flags,
struct gfs2_holder *gh); struct gfs2_holder *gh);
extern void gfs2_holder_uninit(struct gfs2_holder *gh); extern void gfs2_holder_uninit(struct gfs2_holder *gh);
...@@ -241,7 +248,7 @@ static inline int gfs2_glock_nq_init(struct gfs2_glock *gl, ...@@ -241,7 +248,7 @@ static inline int gfs2_glock_nq_init(struct gfs2_glock *gl,
{ {
int error; int error;
gfs2_holder_init(gl, state, flags, gh); __gfs2_holder_init(gl, state, flags, gh, _RET_IP_);
error = gfs2_glock_nq(gh); error = gfs2_glock_nq(gh);
if (error) if (error)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment