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 [ver #2]
Date: Tue, 28 Mar 2017 15:38:52 +0100 [thread overview]
Message-ID: <29458.1490711932@warthog.procyon.org.uk> (raw)
In-Reply-To: <3791d155-b448-5257-d8b9-8a6f20e12180@sandeen.net>
Here are my current changes to Eric's statx interface patch. I've made it
analoguous to the stat command and so it only does statx-of-fd.
I've made the "-m" flag able to take the words "basic" and "all" in
preference to a number and able to take an octal or hex number as an
alternative too.
I've dropped the -A and -L flags since it no longer passes a path over.
Finally, I've added a -c flag that causes an fstat() to be done as well and
the buffers compared as a consistency check.
David
---
diff --git a/io/stat.c b/io/stat.c
index a7aebcd..961b6d1 100644
--- a/io/stat.c
+++ b/io/stat.c
@@ -189,12 +189,10 @@ 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"
-" -A -- Suppress terminal automount traversal\n"
+" -c -- Compare against fstat/fstatat on the same file/fd\n"
+" -m mask -- Specify the field mask for the statx call (can also be 'basic' or 'all'; default STATX_ALL)\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 +225,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 +296,23 @@ statx_f(
{
int c;
struct statx stx;
- int atflag = AT_SYMLINK_NOFOLLOW;
- unsigned int m_mask = 0; /* mask requested with -m */
- int Oflag = 0, mflag = 0; /* -O or -m was used */
+ struct stat st;
+ int atflag = 0;
unsigned int mask = STATX_ALL;
+ int compare = 0;
- while ((c = getopt(argc, argv, "m:FDLOA")) != EOF) {
+ while ((c = getopt(argc, argv, "cm:FD")) != EOF) {
switch (c) {
+ case 'c':
+ compare = 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;
@@ -258,38 +322,28 @@ statx_f(
atflag &= ~AT_STATX_SYNC_TYPE;
atflag |= AT_STATX_DONT_SYNC;
break;
- case 'L':
- atflag &= ~AT_SYMLINK_NOFOLLOW;
- break;
- case 'O':
- mask = STATX_BASIC_STATS;
- Oflag = 1;
- break;
- case 'A':
- atflag |= AT_NO_AUTOMOUNT;
- break;
default:
return command_usage(&statx_cmd);
}
}
- if (Oflag && mflag) {
- printf("Cannot specify both -m mask and -O\n");
- return 0;
- }
-
- /* -m overrides any other mask options */
- if (mflag)
- mask = m_mask;
-
memset(&stx, 0xbf, sizeof(stx));
- if (statx(AT_FDCWD, file->name, atflag, mask, &stx) < 0) {
+
+ if (statx(file->fd, NULL, atflag, mask, &stx) < 0) {
perror("statx");
return 0;
}
- dump_statx(&stx);
+ if (compare) {
+ if (fstat(file->fd, &st) < 0) {
+ perror("fstat");
+ return 0;
+ }
+ cmp_statx(&stx, &st);
+ }
+
+ dump_statx(&stx);
return 0;
}
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index 77ba760..d82f882 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -884,16 +884,23 @@ and the XFS_IOC_GETXATTR system call on the current file. If the
option is specified, the atime (last access), mtime
(last modify), and ctime (last change) timestamps are also displayed.
.TP
-.BR statx " [ " \-O " | " "\-m mask" " ][ \-" FDLA " ]"
+.BR statx " [ " "\-m mask" " ][ \-" cFD " ]"
Extended information from the statx syscall.
.RS 1.0i
.PD 0
.TP 0.4i
.B \-m mask
-Specify the field mask for the statx call (default STATX_ALL)
+Specify the field mask for the statx call as an decimal, hex or octal integer
+or
+.RI \" basic "\" or \"" all \"
+to specify the basic stats that
+.IR stat ()
+returns or all the stats known by the header file. All is the default.
.TP
-.B \-O
-Add only basic stats (STATX_BASIC_STATS) to default mask
+.B \-c
+Do an
+.IR fstat ()
+call as well and compare the buffers.
.TP
.B \-F
Force the attributes to be sync'd with the server
@@ -901,12 +908,6 @@ Force the attributes to be sync'd with the server
.B \-D
Don't sync attributes with the server
.TP
-.B \-L
-Follow symlinks (statx link target)
-.TP
-.B \-A
-Suppress terminal automount traversal
-.TP
.RE
.IP
.TP
next prev parent reply other threads:[~2017-03-28 14:39 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 ` [PATCH] xfs_io: changes to statx interface David Howells
2017-03-28 10:51 ` 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 ` David Howells [this message]
2017-03-28 18:40 ` [PATCH] xfs_io: changes to statx interface [ver #2] 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=29458.1490711932@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).