gfs2: Save ip from gfs2_glock_nq_init
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 30 Sep 2021 18:49:36 +0000 (13:49 -0500)
committerAndreas Gruenbacher <agruenba@redhat.com>
Mon, 25 Oct 2021 06:42:18 +0000 (08:42 +0200)
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: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/glock.c
fs/gfs2/glock.h

index 5d6b253..54a1ed3 100644 (file)
@@ -911,7 +911,7 @@ static void gfs2_glock_poke(struct gfs2_glock *gl)
        struct gfs2_holder gh;
        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);
        if (!error)
                gfs2_glock_dq(&gh);
@@ -1208,12 +1208,12 @@ out:
  *
  */
 
-void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags,
-                     struct gfs2_holder *gh)
+void __gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, u16 flags,
+                       struct gfs2_holder *gh, unsigned long ip)
 {
        INIT_LIST_HEAD(&gh->gh_list);
        gh->gh_gl = gl;
-       gh->gh_ip = _RET_IP_;
+       gh->gh_ip = ip;
        gh->gh_owner_pid = get_pid(task_pid(current));
        gh->gh_state = state;
        gh->gh_flags = flags;
index 9012487..a361042 100644 (file)
@@ -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_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,
                               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,
 {
        int error;
 
-       gfs2_holder_init(gl, state, flags, gh);
+       __gfs2_holder_init(gl, state, flags, gh, _RET_IP_);
 
        error = gfs2_glock_nq(gh);
        if (error)