[Ocfs2-tools-devel] [PATCH 3/3] debugfs.ocfs2: Add the -t and -T options to the "stat" command.

Joel Becker Joel.Becker at oracle.com
Mon Jun 7 14:48:58 PDT 2010


The "stat" command walks the extents or chains of an inode to print
details about its metadata.  This can be expensive when there are a lot
of extents or chains and the user merely wants information from the
inode itself.  The -t and -T options select and deselect traversal of
the this metadata respectively.  The -t option remains the default.

Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
 debugfs.ocfs2/commands.c         |   55 +++++++++++++++++++++++++++----------
 debugfs.ocfs2/debugfs.ocfs2.8.in |    8 ++++-
 2 files changed, 46 insertions(+), 17 deletions(-)

diff --git a/debugfs.ocfs2/commands.c b/debugfs.ocfs2/commands.c
index e546dc2..1f60049 100644
--- a/debugfs.ocfs2/commands.c
+++ b/debugfs.ocfs2/commands.c
@@ -874,7 +874,7 @@ static void do_help (char **args)
 	printf ("refcount [-e] <filespec>\t\t\tDump the refcount tree "
 		"for the specified inode or refcount block\n");
 	printf ("slotmap\t\t\t\t\tShow slot map\n");
-	printf ("stat <filespec>\t\t\t\tShow inode\n");
+	printf ("stat [-t|-T] <filespec>\t\t\t\tShow inode\n");
 	printf ("stats [-h]\t\t\t\tShow superblock\n");
 	printf ("xattr [-v] <filespec>\t\t\tShow Extended Attributes\n");
 }
@@ -1041,9 +1041,28 @@ static void do_stat (char **args)
 	char *buf = NULL;
 	FILE *out;
 	errcode_t ret = 0;
+	const char *stat_usage = "usage: stat [-t|-T] <filespec>";
+	int index = 1, traverse = 1;
 
-	if (process_inode_args(args, &blkno))
+	if (!args[index]) {
+		fprintf(stderr, "%s\n", stat_usage);
+		return ;
+	}
+
+	if (!strncmp(args[index], "-t", 2)) {
+		traverse = 1;
+		index++;
+	} else if (!strncmp(args[index], "-T", 2)) {
+		traverse = 0;
+		index++;
+	}
+
+	ret = string_to_inode(gbls.fs, gbls.root_blkno, gbls.cwd_blkno,
+			      args[index], &blkno);
+	if (ret) {
+		com_err(args[0], ret, "'%s'", args[index]);
 		return ;
+	}
 
 	buf = gbls.blockbuf;
 	ret = ocfs2_read_inode(gbls.fs, blkno, buf);
@@ -1057,20 +1076,26 @@ static void do_stat (char **args)
 	out = open_pager(gbls.interactive);
 	dump_inode(out, inode);
 
-	if ((inode->i_flags & OCFS2_LOCAL_ALLOC_FL))
-		dump_local_alloc(out, &(inode->id2.i_lab));
-	else if ((inode->i_flags & OCFS2_CHAIN_FL))
-		ret = traverse_chains(gbls.fs, &(inode->id2.i_chain), out);
-	else if (S_ISLNK(inode->i_mode) && !inode->i_clusters)
-		dump_fast_symlink(out, (char *)inode->id2.i_symlink);
-	else if (inode->i_flags & OCFS2_DEALLOC_FL)
-		dump_truncate_log(out, &(inode->id2.i_dealloc));
-	else if (!(inode->i_dyn_features & OCFS2_INLINE_DATA_FL))
-		ret = traverse_extents(gbls.fs, &(inode->id2.i_list), out);
+	if (traverse) {
+		if ((inode->i_flags & OCFS2_LOCAL_ALLOC_FL))
+			dump_local_alloc(out, &(inode->id2.i_lab));
+		else if ((inode->i_flags & OCFS2_CHAIN_FL))
+			ret = traverse_chains(gbls.fs,
+					      &(inode->id2.i_chain), out);
+		else if (S_ISLNK(inode->i_mode) && !inode->i_clusters)
+			dump_fast_symlink(out,
+					  (char *)inode->id2.i_symlink);
+		else if (inode->i_flags & OCFS2_DEALLOC_FL)
+			dump_truncate_log(out, &(inode->id2.i_dealloc));
+		else if (!(inode->i_dyn_features & OCFS2_INLINE_DATA_FL))
+			ret = traverse_extents(gbls.fs,
+					       &(inode->id2.i_list), out);
 
-	if (ret)
-		com_err(args[0], ret, "while traversing inode at block "
-			"%"PRIu64, blkno);
+		if (ret)
+			com_err(args[0], ret,
+				"while traversing inode at block "
+				"%"PRIu64, blkno);
+	}
 
 	close_pager(out);
 
diff --git a/debugfs.ocfs2/debugfs.ocfs2.8.in b/debugfs.ocfs2/debugfs.ocfs2.8.in
index c4b9cdd..978741c 100644
--- a/debugfs.ocfs2/debugfs.ocfs2.8.in
+++ b/debugfs.ocfs2/debugfs.ocfs2.8.in
@@ -235,8 +235,12 @@ Display the refcount block, and optionally its tree, of the specified inode.
 Display the contents of the \fIslotmap\fR system file.
 
 .TP
-\fIstat filespec\fR
-Display the contents of the inode structure for the \fIfilespec\fR.
+\fIstat [\-t|\-T] filespec\fR
+Display the contents of the inode structure for the \fIfilespec\fR.  The
+\fI-t\fR ("traverse") option selects traversal of the inode's metadata.
+The extent tree, chain list, or other extra metadata will be dumped.  This
+is the default.  The \fI-T\fR option turns off traversal to reduce the I/O
+required when basic inode information is needed.
 
 .TP
 \fIstats [\-h] [\-s backup\-number]\fR
-- 
1.7.1


-- 

Life's Little Instruction Book #337

	"Reread your favorite book."

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127



More information about the Ocfs2-tools-devel mailing list