All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@sandeen.net>
To: linux-xfs <linux-xfs@vger.kernel.org>,
	fsdevel <linux-fsdevel@vger.kernel.org>,
	David Howells <dhowells@redhat.com>
Subject: [PATCH 2/3] xfs_io: refactor stat functions, add raw dump
Date: Thu, 6 Apr 2017 13:48:50 -0500	[thread overview]
Message-ID: <c93e8f2d-8164-c56c-e3a3-6f3b8fa43f99@sandeen.net> (raw)
In-Reply-To: <4bb89f72-962d-a9a2-c224-daa828558444@sandeen.net>

This adds a "-r" raw structure dump to stat options, and
factors the code a bit; statx will also use print_file_info
and print_xfs_info.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/io/stat.c b/io/stat.c
index 3ae9903..770f3c7 100644
--- a/io/stat.c
+++ b/io/stat.c
@@ -59,16 +59,32 @@ filetype(mode_t mode)
 	return NULL;
 }
 
-int
-stat_f(
-	int		argc,
-	char		**argv)
+static int
+dump_raw_stat(struct stat *st)
 {
-	struct dioattr	dio;
-	struct fsxattr	fsx, fsxa;
-	struct stat	st;
-	int		verbose = (argc == 2 && !strcmp(argv[1], "-v"));
+	printf("stat.blksize = %lu\n", st->st_blksize);
+	printf("stat.nlink = %lu\n", st->st_nlink);
+	printf("stat.uid = %u\n", st->st_uid);
+	printf("stat.gid = %u\n", st->st_gid);
+	printf("stat.mode: 0%o\n", st->st_mode);
+	printf("stat.ino = %lu\n", st->st_ino);
+	printf("stat.size = %lu\n", st->st_size);
+	printf("stat.blocks = %lu\n", st->st_blocks);
+	printf("stat.atime.tv_sec = %ld\n", st->st_atim.tv_sec);
+	printf("stat.atime.tv_nsec = %ld\n", st->st_atim.tv_nsec);
+	printf("stat.ctime.tv_sec = %ld\n", st->st_ctim.tv_sec);
+	printf("stat.ctime.tv_nsec = %ld\n", st->st_ctim.tv_nsec);
+	printf("stat.mtime.tv_sec = %ld\n", st->st_mtim.tv_sec);
+	printf("stat.mtime.tv_nsec = %ld\n", st->st_mtim.tv_nsec);
+	printf("stat.rdev_major = %u\n", major(st->st_rdev));
+	printf("stat.rdev_minor = %u\n", minor(st->st_rdev));
+	printf("stat.dev_major = %u\n", major(st->st_dev));
+	printf("stat.dev_minor = %u\n", minor(st->st_dev));
+	return 0;
+}
 
+void print_file_info(void)
+{
 	printf(_("fd.path = \"%s\"\n"), file->name);
 	printf(_("fd.flags = %s,%s,%s%s%s%s%s\n"),
 		file->flags & IO_OSYNC ? _("sync") : _("non-sync"),
@@ -78,21 +94,13 @@ stat_f(
 		file->flags & IO_APPEND ? _(",append-only") : "",
 		file->flags & IO_NONBLOCK ? _(",non-block") : "",
 		file->flags & IO_TMPFILE ? _(",tmpfile") : "");
-	if (fstat(file->fd, &st) < 0) {
-		perror("fstat");
-	} else {
-		printf(_("stat.ino = %lld\n"), (long long)st.st_ino);
-		printf(_("stat.type = %s\n"), filetype(st.st_mode));
-		printf(_("stat.size = %lld\n"), (long long)st.st_size);
-		printf(_("stat.blocks = %lld\n"), (long long)st.st_blocks);
-		if (verbose) {
-			printf(_("stat.atime = %s"), ctime(&st.st_atime));
-			printf(_("stat.mtime = %s"), ctime(&st.st_mtime));
-			printf(_("stat.ctime = %s"), ctime(&st.st_ctime));
-		}
-	}
-	if (file->flags & IO_FOREIGN)
-		return 0;
+}
+
+void print_xfs_info(int verbose)
+{
+	struct dioattr	dio;
+	struct fsxattr	fsx, fsxa;
+
 	if ((xfsctl(file->name, file->fd, FS_IOC_FSGETXATTR, &fsx)) < 0 ||
 	    (xfsctl(file->name, file->fd, XFS_IOC_FSGETXATTRA, &fsxa)) < 0) {
 		perror("FS_IOC_FSGETXATTR");
@@ -112,6 +120,57 @@ stat_f(
 		printf(_("dioattr.miniosz = %u\n"), dio.d_miniosz);
 		printf(_("dioattr.maxiosz = %u\n"), dio.d_maxiosz);
 	}
+}
+
+int
+stat_f(
+	int		argc,
+	char		**argv)
+{
+	struct stat	st;
+	int		c, verbose = 0, raw = 0;
+
+	while ((c = getopt(argc, argv, "rv")) != EOF) {
+		switch (c) {
+		case 'r':
+			raw = 1;
+			break;
+		case 'v':
+			verbose = 1;
+			break;
+		default:
+			return command_usage(&stat_cmd);
+		}
+	}
+
+	if (raw && verbose)
+		return command_usage(&stat_cmd);
+
+	if (fstat(file->fd, &st) < 0) {
+		perror("fstat");
+		return 0;
+	}
+
+	if (raw)
+		return dump_raw_stat(&st);
+
+	print_file_info();
+
+	printf(_("stat.ino = %lld\n"), (long long)st.st_ino);
+	printf(_("stat.type = %s\n"), filetype(st.st_mode));
+	printf(_("stat.size = %lld\n"), (long long)st.st_size);
+	printf(_("stat.blocks = %lld\n"), (long long)st.st_blocks);
+	if (verbose) {
+		printf(_("stat.atime = %s"), ctime(&st.st_atime));
+		printf(_("stat.mtime = %s"), ctime(&st.st_mtime));
+		printf(_("stat.ctime = %s"), ctime(&st.st_ctime));
+	}
+
+	if (file->flags & IO_FOREIGN)
+		return 0;
+
+	print_xfs_info(verbose);
+
 	return 0;
 }
 
@@ -175,7 +234,7 @@ stat_init(void)
 	stat_cmd.argmin = 0;
 	stat_cmd.argmax = 1;
 	stat_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
-	stat_cmd.args = _("[-v]");
+	stat_cmd.args = _("[-v|-r]");
 	stat_cmd.oneline = _("statistics on the currently open file");
 
 	statfs_cmd.name = "statfs";
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index 19e1ae4..e384327 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -872,13 +872,15 @@ Only available in expert mode and requires privileges.
 Force the filesystem to shutdown (with or without flushing the log).
 Only available in expert mode and requires privileges.
 .TP
-.BR stat " [ " \-v " ]"
+.BR stat " [ " \-v "|" \-r " ]"
 Selected statistics from
 .BR stat (2)
 and the XFS_IOC_GETXATTR system call on the current file. If the
 .B \-v
 option is specified, the atime (last access), mtime
-(last modify), and ctime (last change) timestamps are also displayed.
+(last modify), and ctime (last change) timestamps are also displayed.  The
+.B \-r
+option dumps raw fields from the stat structure.
 .TP
 .B statfs
 Selected statistics from

  parent reply	other threads:[~2017-04-06 18:48 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-06 18:43 [PATCH 0/3 V3] xfs_io: hook up statx Eric Sandeen
2017-04-06 18:46 ` [PATCH 1/3] xfs_io: move stat functions to new file Eric Sandeen
2017-04-10 21:47   ` Darrick J. Wong
2017-04-06 18:48 ` Eric Sandeen [this message]
2017-04-10 21:48   ` [PATCH 2/3] xfs_io: refactor stat functions, add raw dump Darrick J. Wong
2017-04-06 18:53 ` [PATCH 3/3] xfs_io: hook up statx Eric Sandeen
2017-04-10 21:33   ` [PATCH 3/3 V4] " Eric Sandeen
2017-04-10 21:56     ` Darrick J. Wong
2017-04-10 22:07     ` [PATCH 3/3 V5] " Eric Sandeen
2017-04-10 22:13       ` Darrick J. Wong
2017-04-10 22:36 ` [PATCH 0/3 V3] " David Howells

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c93e8f2d-8164-c56c-e3a3-6f3b8fa43f99@sandeen.net \
    --to=sandeen@sandeen.net \
    --cc=dhowells@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.