[Cluster-devel] [GFS2 PATCH resend/revised] GFS2: Add new debug trace point and evict code path

Bob Peterson rpeterso at redhat.com
Fri May 26 14:21:52 UTC 2017


Hi,

I first sent out this patch on 16 March, but with all the other
activity (e.g. non-recursive delete) it got lost in the shuffle
and got no acks.

Since then I needed to revise it due to changes in the evict code.
This, then, is the revised patch.

Patch description:
------------------
This patch adds a new kernel trace point for general gfs2 debugging.
Its first use is to trace which codepath is taken when an inode is
evicted.

Signed-off-by: Bob Peterson <rpeterso at redhat.com>
---
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 29b0473..1c5c0ea 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -41,6 +41,7 @@
 #include "recovery.h"
 #include "rgrp.h"
 #include "super.h"
+#include "trace_gfs2.h"
 #include "trans.h"
 #include "util.h"
 #include "sys.h"
@@ -815,6 +816,7 @@ static void gfs2_dirty_inode(struct inode *inode, int flags)
 	}
 
 	ret = gfs2_meta_inode_buffer(ip, &bh);
+	trace_gfs2_debug(ip->i_gl, ret, "gfs2_dirty_inode");
 	if (ret == 0) {
 		gfs2_trans_add_meta(ip->i_gl, bh);
 		gfs2_dinode_out(ip, bh->b_data);
@@ -1528,31 +1530,39 @@ static void gfs2_evict_inode(struct inode *inode)
 	int error;
 
 	if (test_bit(GIF_FREE_VFS_INODE, &ip->i_flags)) {
+		trace_gfs2_debug(ip->i_gl, inode->i_nlink, "evict_case_3a");
 		clear_inode(inode);
 		return;
 	}
 
-	if (inode->i_nlink || (sb->s_flags & MS_RDONLY))
+	if (inode->i_nlink || (sb->s_flags & MS_RDONLY)) {
+		trace_gfs2_debug(ip->i_gl, inode->i_state, "evict_case_3");
 		goto out;
+	}
 
 	/* Must not read inode block until block type has been verified */
 	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh);
 	if (unlikely(error)) {
 		ip->i_iopen_gh.gh_flags |= GL_NOCACHE;
 		gfs2_glock_dq_uninit(&ip->i_iopen_gh);
+		trace_gfs2_debug(ip->i_gl, error, "evict_case_glerr");
 		goto out;
 	}
 
 	if (!test_bit(GIF_ALLOC_FAILED, &ip->i_flags)) {
 		error = gfs2_check_blk_type(sdp, ip->i_no_addr, GFS2_BLKST_UNLINKED);
-		if (error)
+		if (error) {
+			trace_gfs2_debug(ip->i_gl, error, "evict_case_2a");
 			goto out_truncate;
+		}
 	}
 
 	if (test_bit(GIF_INVALID, &ip->i_flags)) {
 		error = gfs2_inode_refresh(ip);
-		if (error)
+		if (error) {
+			trace_gfs2_debug(ip->i_gl, error, "evict_case_2b");
 			goto out_truncate;
+		}
 	}
 
 	if (gfs2_holder_initialized(&ip->i_iopen_gh) &&
@@ -1562,8 +1572,10 @@ static void gfs2_evict_inode(struct inode *inode)
 		gfs2_holder_reinit(LM_ST_EXCLUSIVE, LM_FLAG_TRY_1CB | GL_NOCACHE,
 				   &ip->i_iopen_gh);
 		error = gfs2_glock_nq(&ip->i_iopen_gh);
-		if (error)
+		if (error) {
+			trace_gfs2_debug(ip->i_gl, error, "evict_case_2c");
 			goto out_truncate;
+		}
 	}
 
 	/* Case 1 starts here */
@@ -1571,22 +1583,29 @@ static void gfs2_evict_inode(struct inode *inode)
 	if (S_ISDIR(inode->i_mode) &&
 	    (ip->i_diskflags & GFS2_DIF_EXHASH)) {
 		error = gfs2_dir_exhash_dealloc(ip);
-		if (error)
+		if (error) {
+			trace_gfs2_debug(ip->i_gl, error, "evict_case_1a");
 			goto out_unlock;
+		}
 	}
 
 	if (ip->i_eattr) {
 		error = gfs2_ea_dealloc(ip);
-		if (error)
+		if (error) {
+			trace_gfs2_debug(ip->i_gl, error, "evict_case_1b");
 			goto out_unlock;
+		}
 	}
 
 	if (!gfs2_is_stuffed(ip)) {
 		error = gfs2_file_dealloc(ip);
-		if (error)
+		if (error) {
+			trace_gfs2_debug(ip->i_gl, error, "evict_case_1c");
 			goto out_unlock;
+		}
 	}
 
+	trace_gfs2_debug(ip->i_gl, error, "evict_case_1");
 	error = gfs2_dinode_dealloc(ip);
 	goto out_unlock;
 
diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h
index 49ac55d..3d24bbb 100644
--- a/fs/gfs2/trace_gfs2.h
+++ b/fs/gfs2/trace_gfs2.h
@@ -548,6 +548,38 @@ TRACE_EVENT(gfs2_rs,
 		  rs_func_name(__entry->func), (unsigned long)__entry->free)
 );
 
+/* Generic debug messages */
+TRACE_EVENT(gfs2_debug,
+
+	TP_PROTO(struct gfs2_glock *gl, int ret, const char *msg),
+
+	TP_ARGS(gl, ret, msg),
+
+	TP_STRUCT__entry(
+		__field(        dev_t,  dev                     )
+		__field(	u64,	glnum			)
+		__field(	u32,	gltype			)
+		__field(	int,	ret			)
+		__field(	int,	nrpages			)
+		__string(	msg,	msg			)
+	),
+
+	TP_fast_assign(
+		__entry->dev	= gl->gl_name.ln_sbd->sd_vfs->s_dev;
+		__entry->glnum	= gl->gl_name.ln_number;
+		__entry->gltype	= gl->gl_name.ln_type;
+		__entry->ret = ret;
+		__entry->nrpages = (gfs2_glock2aspace(gl) ?
+				    gfs2_glock2aspace(gl)->nrpages : 0);
+		__assign_str(msg, msg);
+	),
+
+	TP_printk("%u,%u %u:%llu rc:%d pgs: %d %s",
+		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->gltype,
+		  (unsigned long long)__entry->glnum, __entry->ret,
+		  __entry->nrpages, __get_str(msg))
+);
+
 #endif /* _TRACE_GFS2_H */
 
 /* This part must be outside protection */




More information about the Cluster-devel mailing list