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;
}
next prev parent reply other threads:[~2017-03-28 10:32 UTC|newest]
Thread overview: 40+ 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-24 4:34 ` 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 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 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.