* [PATCH 0/5] xfs_io: address various "inode" command issues
@ 2016-09-30 20:50 Eric Sandeen
2016-09-30 20:52 ` [PATCH 1/5] xfs_io: fix inode command help and argsmax Eric Sandeen
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Eric Sandeen @ 2016-09-30 20:50 UTC (permalink / raw)
To: linux-xfs
With these 5 patches the fstest I sent yesterday will
pass.
A lot of it is code re-org, but there a couple small bugs
resolved as well.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/5] xfs_io: fix inode command help and argsmax
2016-09-30 20:50 [PATCH 0/5] xfs_io: address various "inode" command issues Eric Sandeen
@ 2016-09-30 20:52 ` Eric Sandeen
2016-09-30 20:53 ` [PATCH 2/5] xfs_io: factor out new get_last_inode() helper Eric Sandeen
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2016-09-30 20:52 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
The short help implied that -n and -v were exclusive, and the longer
help wasn't particularly clear.
Further, argsmax is wrong; "-n -v num" is 3, not 2.
# xfs_io -c "inode -n -v 123" /mnt/test2
bad argument count 3 to inode, expected between 0 and 2 arguments
# xfs_io -c "inode -vn 123" /mnt/test2
128:32
Fix up all of those issues.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
io/open.c | 19 ++++++++-----------
1 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/io/open.c b/io/open.c
index 3eaa013..5efa739 100644
--- a/io/open.c
+++ b/io/open.c
@@ -757,16 +757,13 @@ inode_help(void)
{
printf(_(
"\n"
-"Query physical information about the inode"
+"Query physical information about an inode"
"\n"
-" Default: -- Return true(1) or false(0) if any inode greater than\n"
-" 32bits has been found in the filesystem\n"
-"[num] -- Return inode number [num] or 0 if the inode [num] is in use\n"
-" or not\n"
-" -n [num] -- Return the next valid inode after [num]\n"
-" -v -- verbose mode\n"
-" Display the inode number and its physical size (in bits)\n"
-" according to the argument used\n"
+" Default: -- Return 1 if any inode number greater than 32 bits exists in\n"
+" the filesystem, or 0 if none exist\n"
+" num -- Return inode number [num] if in use, or 0 if not in use\n"
+" -n num -- Return the next used inode after [num]\n"
+" -v -- Verbose mode - display returned inode number's size in bits\n"
"\n"));
}
@@ -956,9 +953,9 @@ open_init(void)
inode_cmd.name = "inode";
inode_cmd.cfunc = inode_f;
- inode_cmd.args = _("[-n | -v] [num]");
+ inode_cmd.args = _("[-nv] [num]");
inode_cmd.argmin = 0;
- inode_cmd.argmax = 2;
+ inode_cmd.argmax = 3;
inode_cmd.flags = CMD_NOMAP_OK;
inode_cmd.oneline =
_("Query inode number usage in the filesystem");
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/5] xfs_io: factor out new get_last_inode() helper
2016-09-30 20:50 [PATCH 0/5] xfs_io: address various "inode" command issues Eric Sandeen
2016-09-30 20:52 ` [PATCH 1/5] xfs_io: fix inode command help and argsmax Eric Sandeen
@ 2016-09-30 20:53 ` Eric Sandeen
2016-09-30 20:54 ` [PATCH 3/5] xfs_io: move inode command arg handling to top Eric Sandeen
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2016-09-30 20:53 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
The inode command by default finds the last allocated
inode in the filesystem via bulkstat, and this specific
function is open-coded after other cases are handled, leading
to a fairly long inode_f function and confusing code flow.
Clean it up by factoring it into a new function, more refactoring
will follow.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
io/open.c | 68 +++++++++++++++++++++++++++++++++++++++---------------------
1 files changed, 44 insertions(+), 24 deletions(-)
diff --git a/io/open.c b/io/open.c
index 5efa739..c8c82b7 100644
--- a/io/open.c
+++ b/io/open.c
@@ -767,14 +767,51 @@ inode_help(void)
"\n"));
}
+static __u64
+get_last_inode(void)
+{
+ __u64 lastip = 0;
+ __u64 lastgrp = 0;
+ __s32 ocount = 0;
+ __u64 last_ino;
+ struct xfs_inogrp igroup[1024];
+ struct xfs_fsop_bulkreq bulkreq;
+
+ bulkreq.lastip = &lastip;
+ bulkreq.ubuffer = &igroup;
+ bulkreq.icount = sizeof(igroup) / sizeof(struct xfs_inogrp);
+ bulkreq.ocount = &ocount;
+
+ for (;;) {
+ if (xfsctl(file->name, file->fd, XFS_IOC_FSINUMBERS,
+ &bulkreq)) {
+ perror("XFS_IOC_FSINUMBERS");
+ return 0;
+ }
+
+ /* Did we reach the last inode? */
+ if (ocount == 0)
+ break;
+
+ /* last inode in igroup table */
+ lastgrp = ocount;
+ }
+
+ lastgrp--;
+
+ /* The last inode number in use */
+ last_ino = igroup[lastgrp].xi_startino +
+ libxfs_highbit64(igroup[lastgrp].xi_allocmask);
+
+ return last_ino;
+}
+
static int
inode_f(
int argc,
char **argv)
{
__s32 count = 0;
- __s32 lastgrp = 0;
- __u64 last = 0;
__u64 lastino = 0;
__u64 userino = 0;
char *p;
@@ -782,7 +819,6 @@ inode_f(
int verbose = 0;
int ret_next = 0;
int cmd = 0;
- struct xfs_inogrp igroup[1024];
struct xfs_fsop_bulkreq bulkreq;
struct xfs_bstat bstat;
@@ -854,29 +890,13 @@ inode_f(
return command_usage(&inode_cmd);
}
- bulkreq.lastip = &last;
- bulkreq.icount = 1024; /* User-defined maybe!? */
- bulkreq.ubuffer = &igroup;
- bulkreq.ocount = &count;
-
- for (;;) {
- if (xfsctl(file->name, file->fd, XFS_IOC_FSINUMBERS,
- &bulkreq)) {
- perror("XFS_IOC_FSINUMBERS");
- exitcode = 1;
- return 0;
- }
-
- if (count == 0)
- break;
-
- lastgrp = count;
+ /* We are finding last inode in use */
+ lastino = get_last_inode();
+ if (!lastino) {
+ exitcode = 1;
+ return 0;
}
- lastgrp--;
- lastino = igroup[lastgrp].xi_startino +
- libxfs_highbit64(igroup[lastgrp].xi_allocmask);
-
if (verbose)
printf("%llu:%d\n", lastino,
lastino > XFS_MAXINUMBER_32 ? 64 : 32);
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/5] xfs_io: move inode command arg handling to top
2016-09-30 20:50 [PATCH 0/5] xfs_io: address various "inode" command issues Eric Sandeen
2016-09-30 20:52 ` [PATCH 1/5] xfs_io: fix inode command help and argsmax Eric Sandeen
2016-09-30 20:53 ` [PATCH 2/5] xfs_io: factor out new get_last_inode() helper Eric Sandeen
@ 2016-09-30 20:54 ` Eric Sandeen
2016-09-30 20:56 ` [PATCH 4/5] xfs_io: refactor inode command Eric Sandeen
2016-09-30 20:57 ` [PATCH 5/5] xfs_io: fix inode command with "-n" for bogus inode Eric Sandeen
4 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2016-09-30 20:54 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
As it stands, collecting the inode number and testing args
validity is all tangled up; for example the test for
"-n" having no inode is buried in an else after a large
code block which handles something else.
Get inode number argument collection and testing out of the
way before doing anything else.
Clean up the error message if a non-numeric inode arg is given.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
io/open.c | 40 +++++++++++++++++++++-------------------
1 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/io/open.c b/io/open.c
index c8c82b7..ba8b243 100644
--- a/io/open.c
+++ b/io/open.c
@@ -813,7 +813,7 @@ inode_f(
{
__s32 count = 0;
__u64 lastino = 0;
- __u64 userino = 0;
+ __u64 userino = NULLFSINO;
char *p;
int c;
int verbose = 0;
@@ -835,27 +835,32 @@ inode_f(
}
}
- /*
- * Inode number can be passed with or without extra arguments, so we
- * should handle inode numbers passed by user out of getopt()
- */
+ /* Last arg (if present) should be an inode number */
if (optind < argc) {
-
- if (ret_next) {
- cmd = XFS_IOC_FSBULKSTAT;
- } else {
- if ((argc > 2) && !verbose)
- return command_usage(&inode_cmd);
- else
- cmd = XFS_IOC_FSBULKSTAT_SINGLE;
- }
-
userino = strtoull(argv[optind], &p, 10);
if ((*p != '\0')) {
- printf(_("[num] must be a numeric value\n"));
+ printf(_("%s is not a numeric inode value\n"),
+ argv[optind]);
exitcode = 1;
return 0;
}
+ optind++;
+ }
+
+ /* Extra junk? */
+ if (optind < argc)
+ return command_usage(&inode_cmd);
+
+ /* -n option requires an inode number */
+ if (ret_next && userino == NULLFSINO)
+ return command_usage(&inode_cmd);
+
+ if (userino != NULLFSINO) {
+
+ if (ret_next) /* get next inode */
+ cmd = XFS_IOC_FSBULKSTAT;
+ else /* get this inode */
+ cmd = XFS_IOC_FSBULKSTAT_SINGLE;
bulkreq.lastip = &userino;
bulkreq.icount = 1;
@@ -885,9 +890,6 @@ inode_f(
printf("%llu\n", userino);
return 0;
- /* -n option must not be used stand alone */
- } else if (ret_next) {
- return command_usage(&inode_cmd);
}
/* We are finding last inode in use */
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/5] xfs_io: refactor inode command
2016-09-30 20:50 [PATCH 0/5] xfs_io: address various "inode" command issues Eric Sandeen
` (2 preceding siblings ...)
2016-09-30 20:54 ` [PATCH 3/5] xfs_io: move inode command arg handling to top Eric Sandeen
@ 2016-09-30 20:56 ` Eric Sandeen
2016-09-30 20:57 ` [PATCH 5/5] xfs_io: fix inode command with "-n" for bogus inode Eric Sandeen
4 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2016-09-30 20:56 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
The inode_f function is a bit convoluted; the default
find-last-inode case appears at the end, there are several return
points, we print the same basic information using 2 different variables
in 2 different locations depending on the mode we're in, the
"inode not found" was a printf & exit in the middle of the function,
etc.
Move the default case up to the top so it's more obvious, not
buried.
Make a new var, result_ino, which holds whatever we want to print
regardless of the mode, and then handle all the output at the end.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
io/open.c | 65 ++++++++++++++++++++++++++++--------------------------------
1 files changed, 30 insertions(+), 35 deletions(-)
diff --git a/io/open.c b/io/open.c
index ba8b243..7d952a0 100644
--- a/io/open.c
+++ b/io/open.c
@@ -812,7 +812,7 @@ inode_f(
char **argv)
{
__s32 count = 0;
- __u64 lastino = 0;
+ __u64 result_ino = 0;
__u64 userino = NULLFSINO;
char *p;
int c;
@@ -855,8 +855,14 @@ inode_f(
if (ret_next && userino == NULLFSINO)
return command_usage(&inode_cmd);
- if (userino != NULLFSINO) {
-
+ if (userino == NULLFSINO) {
+ /* We are finding last inode in use */
+ result_ino = get_last_inode();
+ if (!result_ino) {
+ exitcode = 1;
+ return 0;
+ }
+ } else {
if (ret_next) /* get next inode */
cmd = XFS_IOC_FSBULKSTAT;
else /* get this inode */
@@ -868,43 +874,32 @@ inode_f(
bulkreq.ocount = &count;
if (xfsctl(file->name, file->fd, cmd, &bulkreq)) {
- if (errno == EINVAL) {
- if (!ret_next)
- printf("0\n");
+ if (!ret_next && errno == EINVAL) {
+ /* Not in use */
+ result_ino = 0;
} else {
perror("xfsctl");
+ exitcode = 1;
+ return 0;
}
- exitcode = 1;
- return 0;
- }
-
- if (ret_next)
- userino = bstat.bs_ino;
-
- if (verbose)
- printf("%llu:%d\n",
- userino,
- userino > XFS_MAXINUMBER_32 ? 64 : 32);
- else
- /* Inode in use */
- printf("%llu\n", userino);
- return 0;
-
- }
-
- /* We are finding last inode in use */
- lastino = get_last_inode();
- if (!lastino) {
- exitcode = 1;
- return 0;
+ } else if (ret_next) /* The next inode in use */
+ result_ino = bstat.bs_ino;
+ else /* The inode we asked about */
+ result_ino = userino;
+ }
+
+ if (verbose && result_ino) {
+ /* Requested verbose and we have an answer */
+ printf("%llu:%d\n", result_ino,
+ result_ino > XFS_MAXINUMBER_32 ? 64 : 32);
+ } else if (userino == NULLFSINO) {
+ /* Just checking 32 or 64 bit presence, non-verbose */
+ printf("%d\n", result_ino > XFS_MAXINUMBER_32 ? 1 : 0);
+ } else {
+ /* We asked about a specific inode, non-verbose */
+ printf("%llu\n", result_ino);
}
- if (verbose)
- printf("%llu:%d\n", lastino,
- lastino > XFS_MAXINUMBER_32 ? 64 : 32);
- else
- printf("%d\n", lastino > XFS_MAXINUMBER_32 ? 1 : 0);
-
return 0;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 5/5] xfs_io: fix inode command with "-n" for bogus inode
2016-09-30 20:50 [PATCH 0/5] xfs_io: address various "inode" command issues Eric Sandeen
` (3 preceding siblings ...)
2016-09-30 20:56 ` [PATCH 4/5] xfs_io: refactor inode command Eric Sandeen
@ 2016-09-30 20:57 ` Eric Sandeen
4 siblings, 0 replies; 6+ messages in thread
From: Eric Sandeen @ 2016-09-30 20:57 UTC (permalink / raw)
To: Eric Sandeen, linux-xfs
If we ask for the next allocated inode after a number for which
no other inode exists, the bulkstat returns success, but with
count == 0. If we ignore this fact, we print a garbage result
from bstat.bs_ino in this case, so fix it.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---
io/open.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/io/open.c b/io/open.c
index 7d952a0..4279062 100644
--- a/io/open.c
+++ b/io/open.c
@@ -882,10 +882,16 @@ inode_f(
exitcode = 1;
return 0;
}
- } else if (ret_next) /* The next inode in use */
- result_ino = bstat.bs_ino;
- else /* The inode we asked about */
+ } else if (ret_next) {
+ /* The next inode in use, or 0 if none */
+ if (*bulkreq.ocount)
+ result_ino = bstat.bs_ino;
+ else
+ result_ino = 0;
+ } else {
+ /* The inode we asked about */
result_ino = userino;
+ }
}
if (verbose && result_ino) {
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-09-30 20:57 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-30 20:50 [PATCH 0/5] xfs_io: address various "inode" command issues Eric Sandeen
2016-09-30 20:52 ` [PATCH 1/5] xfs_io: fix inode command help and argsmax Eric Sandeen
2016-09-30 20:53 ` [PATCH 2/5] xfs_io: factor out new get_last_inode() helper Eric Sandeen
2016-09-30 20:54 ` [PATCH 3/5] xfs_io: move inode command arg handling to top Eric Sandeen
2016-09-30 20:56 ` [PATCH 4/5] xfs_io: refactor inode command Eric Sandeen
2016-09-30 20:57 ` [PATCH 5/5] xfs_io: fix inode command with "-n" for bogus inode Eric Sandeen
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).