linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: David Howells <dhowells@redhat.com>
To: Eric Sandeen <sandeen@sandeen.net>
Cc: dhowells@redhat.com, linux-xfs <linux-xfs@vger.kernel.org>,
	Andreas Dilger <adilger@dilger.ca>,
	Christoph Hellwig <hch@infradead.org>,
	fsdevel <linux-fsdevel@vger.kernel.org>
Subject: [PATCH] xfs_io: changes to statx interface
Date: Tue, 28 Mar 2017 11:22:31 +0100	[thread overview]
Message-ID: <22058.1490696551@warthog.procyon.org.uk> (raw)
In-Reply-To: <3791d155-b448-5257-d8b9-8a6f20e12180@sandeen.net>

Eric Sandeen <sandeen@sandeen.net> wrote:

> Wire up the statx syscall to xfs_io.
> 
> xfs_io> help statx
> statx [-O | -m mask][-FDLA] -- extended information about the currently open file
> ...

I would like to make the attached changes, to make it more capable, except
that xfs_io seems to precheck the "-m mask" argument somewhere:

	[root@andromeda ~]# xfs_io -c statx -m all /dev/null
	non-numeric mode -- all

and interprets "-c" for itself on the command line:

	[root@andromeda ~]# xfs_io -c statx -c /dev/null
	command "/dev/null" not found

though both these seem to work when used from xfs_io's command prompt.  I
guess I should switch -c to -C and also -m to -M since it's not a file mode as
I think the core is expecting.

Also, how do you get xfs_io to tell you what fd it has opened from its own
command prompt?  I would need to pass that to the -d flag as a dir fd.

David
---
commit 03e4ca1cdc59aaa362fdd51f079493a1f0da254c
Author: David Howells <dhowells@redhat.com>
Date:   Tue Mar 28 10:42:23 2017 +0100

    changes

diff --git a/io/stat.c b/io/stat.c
index a7aebcd..0b05ec9 100644
--- a/io/stat.c
+++ b/io/stat.c
@@ -189,12 +189,14 @@ statx_help(void)
 " Display extended file status.\n"
 "\n"
 " Options:\n"
-" -m mask -- Specify the field mask for the statx call (default STATX_ALL)\n"
+" -c -- Compare against fstat/fstatat on the same file/fd\n"
+" -d dirfd -- Use a specific directory fd\n"
+" -f -- Do fstat equivalent and operate on fd\n"
+" -m mask -- Specify the field mask for the statx call (can also be 'basic' or 'all'; default STATX_ALL)\n"
 " -A -- Suppress terminal automount traversal\n"
 " -D -- Don't sync attributes with the server\n"
 " -F -- Force the attributes to be sync'd with the server\n"
 " -L -- Follow symlinks (statx link target)\n"
-" -O -- Add only basic stats (STATX_BASIC_STATS) to default mask\n"
 "\n"));
 }
 
@@ -227,6 +229,65 @@ dump_statx(struct statx *stx)
 }
 
 /*
+ * Compare the contents of a statx struct with that of a stat struct and check
+ * that they're the same.
+ */
+static int
+cmp_statx(const struct statx *stx, const struct stat *st)
+{
+	const char *what = NULL;
+
+#define cmp(x) \
+	do {					\
+		what = #x;		\
+		if (stx->stx_##x != st->st_##x)	\
+			goto mismatch;		\
+	} while (0)
+
+	cmp(blksize);
+	cmp(nlink);
+	cmp(uid);
+	cmp(gid);
+	cmp(mode);
+	cmp(ino);
+	cmp(size);
+	cmp(blocks);
+
+#define devcmp(x) \
+	do {						\
+		what = #x".major";			\
+		if (stx->stx_##x##_major != major(st->st_##x))	\
+			goto mismatch;			\
+		what = #x".minor";			\
+		if (stx->stx_##x##_minor != minor(st->st_##x))	\
+			goto mismatch;			\
+	} while (0)
+
+	devcmp(dev);
+	devcmp(rdev);
+
+#define timecmp(x) \
+	do {						\
+		what = #x".tv_sec";			\
+		if (stx->stx_##x##time.tv_sec != st->st_##x##tim.tv_sec)	\
+			goto mismatch;			\
+		what = #x".tv_nsec";			\
+		if (stx->stx_##x##time.tv_nsec != st->st_##x##tim.tv_nsec)	\
+			goto mismatch;			\
+	} while (0)
+
+	timecmp(a);
+	timecmp(c);
+	timecmp(m);
+
+	return 0;
+
+mismatch:
+	fprintf(stderr, "Mismatch between stat and statx output (%s)\n", what);
+	return -1;
+}
+
+/*
  * options:
  * 	- input flags - query type
  * 	- output style for flags (and all else?) (chars vs. hex?)
@@ -239,16 +300,31 @@ statx_f(
 {
 	int		c;
 	struct statx	stx;
+	struct stat	st;
 	int		atflag = AT_SYMLINK_NOFOLLOW;
-	unsigned int	m_mask = 0;	/* mask requested with -m */
-	int		Oflag = 0, mflag = 0;	/* -O or -m was used */
 	unsigned int	mask = STATX_ALL;
+	int		use_fd = 0;
+	int		dirfd = AT_FDCWD;
+	int		compare = 0;
 
-	while ((c = getopt(argc, argv, "m:FDLOA")) != EOF) {
+	while ((c = getopt(argc, argv, "d:cfm:FDLA")) != EOF) {
 		switch (c) {
+		case 'c':
+			compare = 1;
+			break;
+		case 'd':
+			dirfd = strtoul(optarg, NULL, 0);
+			break;
+		case 'f':
+			use_fd = 1;
+			break;
 		case 'm':
-			m_mask = atoi(optarg);
-			mflag = 1;
+			if (strcmp(optarg, "basic") == 0)
+				mask = STATX_BASIC_STATS;
+			else if (strcmp(optarg, "all") == 0)
+				mask = STATX_ALL;
+			else
+				mask = strtoul(optarg, NULL, 0);
 			break;
 		case 'F':
 			atflag &= ~AT_STATX_SYNC_TYPE;
@@ -261,10 +337,6 @@ statx_f(
 		case 'L':
 			atflag &= ~AT_SYMLINK_NOFOLLOW;
 			break;
-		case 'O':
-			mask = STATX_BASIC_STATS;
-			Oflag = 1;
-			break;
 		case 'A':
 			atflag |= AT_NO_AUTOMOUNT;
 			break;
@@ -273,23 +345,38 @@ statx_f(
 		}
 	}
 
-	if (Oflag && mflag) {
-		printf("Cannot specify both -m mask and -O\n");
-		return 0;
+	memset(&stx, 0xbf, sizeof(stx));
+
+	if (use_fd) {
+		if (statx(file->fd, NULL, atflag, mask, &stx) < 0) {
+			perror("statx");
+			return 0;
+		}
+	} else {
+		if (statx(dirfd, file->name, atflag, mask, &stx) < 0) {
+			perror("statx");
+			return 0;
+		}
 	}
 
-	/* -m overrides any other mask options */
-	if (mflag)
-		mask = m_mask;
+	if (compare) {
+		if (use_fd) {
+			if (fstat(file->fd, &st) < 0) {
+				perror("fstat");
+				return 0;
+			}
+		} else {
+			if (fstatat(dirfd, file->name, &st,
+				    atflag & ~AT_STATX_SYNC_TYPE) < 0) {
+				perror("fstatat");
+				return 0;
+			}
+		}
 
-	memset(&stx, 0xbf, sizeof(stx));
-	if (statx(AT_FDCWD, file->name, atflag, mask, &stx) < 0) {
-		perror("statx");
-		return 0;
+		cmp_statx(&stx, &st);
 	}
-
+	
 	dump_statx(&stx);
-
 	return 0;
 }
 

  parent reply	other threads:[~2017-03-28 10:32 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-24  4:32 [PATCH 0/2 V2] xfs_io: hook up statx Eric Sandeen
2017-03-24  4:34 ` [PATCH 1/2 V2] xfs_io: move stat functions to new file Eric Sandeen
2017-03-27 15:52   ` Darrick J. Wong
2017-03-24  4:45 ` [PATCH 2/2 V2] xfs_io: hook up statx Eric Sandeen
2017-03-27 15:54   ` Darrick J. Wong
2017-03-27 20:58   ` Eric Biggers
2017-03-28 21:57     ` Eric Sandeen
2017-03-27 10:00 ` [PATCH 0/2 " David Howells
2017-03-27 17:47   ` Eric Sandeen
2017-03-27 18:05     ` Eric Sandeen
2017-03-27 21:58     ` Dave Chinner
2017-03-28  7:30   ` Amir Goldstein
2017-03-28  9:39   ` David Howells
2017-03-27 20:20 ` [PATCH 2/2 " David Howells
2017-03-27 20:26 ` [PATCH 1/2 V2] xfs_io: move stat functions to new file David Howells
2017-03-27 20:32   ` Darrick J. Wong
2017-03-28 10:22 ` David Howells [this message]
2017-03-28 10:51   ` [PATCH] xfs_io: changes to statx interface Amir Goldstein
2017-03-28 12:31   ` David Howells
2017-03-28 13:34     ` Amir Goldstein
2017-03-28 14:04     ` David Howells
2017-03-28 18:01       ` Amir Goldstein
2017-03-28 14:38 ` [PATCH] xfs_io: changes to statx interface [ver #2] David Howells
2017-03-28 18:40   ` Andreas Dilger
2017-03-28 19:07     ` Amir Goldstein
2017-03-28 22:12       ` Eric Sandeen
2017-03-28 23:18   ` Dave Chinner
2017-03-29 15:24   ` David Howells
2017-03-28 14:41 ` David Howells
2017-03-28 16:42   ` Eric Sandeen
2017-03-28 17:35     ` Amir Goldstein
2017-03-28 20:36       ` Eric Sandeen
2017-03-28 17:56     ` David Howells
2017-03-28 18:11       ` Amir Goldstein
2017-03-29 15:49 ` [PATCH] xfs_io: changes to statx interface [ver #3] David Howells
2017-03-29 21:32   ` Eric Sandeen
2017-03-29 16:40 ` David Howells
2017-03-29 21:55 ` [PATCH] xfs_io: changes to statx interface [ver #4] 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=22058.1490696551@warthog.procyon.org.uk \
    --to=dhowells@redhat.com \
    --cc=adilger@dilger.ca \
    --cc=hch@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@sandeen.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).