From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@sandeen.net, darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org, Dave Chinner <dchinner@redhat.com>
Subject: [PATCH 8/8] libfrog: refactor open-coded INUMBERS calls
Date: Tue, 03 Sep 2019 21:35:40 -0700 [thread overview]
Message-ID: <156757174089.1836891.5922232574019988618.stgit@magnolia> (raw)
In-Reply-To: <156757168368.1836891.15043200811666785244.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Refactor all the INUMBERS ioctl callsites into helper functions.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
---
io/imap.c | 34 +++++++++++++++++-----------------
io/open.c | 24 ++++++++++++------------
libfrog/bulkstat.c | 26 ++++++++++++++++++++++++++
libfrog/bulkstat.h | 4 ++++
scrub/fscounters.c | 20 ++++++++------------
scrub/inodes.c | 17 ++++++-----------
6 files changed, 73 insertions(+), 52 deletions(-)
diff --git a/io/imap.c b/io/imap.c
index 9667289a..86d8bda3 100644
--- a/io/imap.c
+++ b/io/imap.c
@@ -8,18 +8,21 @@
#include "input.h"
#include "init.h"
#include "io.h"
+#include "fsgeom.h"
+#include "libfrog/bulkstat.h"
static cmdinfo_t imap_cmd;
static int
imap_f(int argc, char **argv)
{
- int count;
- int nent;
- int i;
- __u64 last = 0;
- struct xfs_inogrp *t;
- struct xfs_fsop_bulkreq bulkreq;
+ struct xfs_fd xfd = XFS_FD_INIT(file->fd);
+ struct xfs_inogrp *t;
+ uint64_t last = 0;
+ uint32_t count;
+ uint32_t nent;
+ int i;
+ int error;
if (argc != 2)
nent = 1;
@@ -30,14 +33,8 @@ imap_f(int argc, char **argv)
if (!t)
return 0;
- bulkreq.lastip = &last;
- bulkreq.icount = nent;
- bulkreq.ubuffer = (void *)t;
- bulkreq.ocount = &count;
-
- while (xfsctl(file->name, file->fd, XFS_IOC_FSINUMBERS, &bulkreq) == 0) {
- if (count == 0)
- goto out_free;
+ while ((error = xfrog_inumbers(&xfd, &last, nent, t, &count)) == 0 &&
+ count > 0) {
for (i = 0; i < count; i++) {
printf(_("ino %10llu count %2d mask %016llx\n"),
(unsigned long long)t[i].xi_startino,
@@ -45,9 +42,12 @@ imap_f(int argc, char **argv)
(unsigned long long)t[i].xi_allocmask);
}
}
- perror("xfsctl(XFS_IOC_FSINUMBERS)");
- exitcode = 1;
-out_free:
+
+ if (error) {
+ errno = error;
+ perror("xfsctl(XFS_IOC_FSINUMBERS)");
+ exitcode = 1;
+ }
free(t);
return 0;
}
diff --git a/io/open.c b/io/open.c
index eab85fd7..169f375c 100644
--- a/io/open.c
+++ b/io/open.c
@@ -676,24 +676,24 @@ inode_help(void)
"\n"));
}
+#define IGROUP_NR (1024)
static __u64
get_last_inode(void)
{
- __u64 lastip = 0;
- __u64 lastgrp = 0;
- __s32 ocount = 0;
+ struct xfs_fd xfd = XFS_FD_INIT(file->fd);
+ uint64_t lastip = 0;
+ uint32_t lastgrp = 0;
+ uint32_t 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;
+ struct xfs_inogrp igroup[IGROUP_NR];
for (;;) {
- if (xfsctl(file->name, file->fd, XFS_IOC_FSINUMBERS,
- &bulkreq)) {
+ int ret;
+
+ ret = xfrog_inumbers(&xfd, &lastip, IGROUP_NR, igroup,
+ &ocount);
+ if (ret) {
+ errno = ret;
perror("XFS_IOC_FSINUMBERS");
return 0;
}
diff --git a/libfrog/bulkstat.c b/libfrog/bulkstat.c
index a61e2fd3..fa10f298 100644
--- a/libfrog/bulkstat.c
+++ b/libfrog/bulkstat.c
@@ -51,3 +51,29 @@ xfrog_bulkstat(
return errno;
return 0;
}
+
+/*
+ * Query inode allocation bitmask information. Returns zero or a positive
+ * error code.
+ */
+int
+xfrog_inumbers(
+ struct xfs_fd *xfd,
+ uint64_t *lastino,
+ uint32_t icount,
+ struct xfs_inogrp *ubuffer,
+ uint32_t *ocount)
+{
+ struct xfs_fsop_bulkreq bulkreq = {
+ .lastip = (__u64 *)lastino,
+ .icount = icount,
+ .ubuffer = ubuffer,
+ .ocount = (__s32 *)ocount,
+ };
+ int ret;
+
+ ret = ioctl(xfd->fd, XFS_IOC_FSINUMBERS, &bulkreq);
+ if (ret)
+ return errno;
+ return 0;
+}
diff --git a/libfrog/bulkstat.h b/libfrog/bulkstat.h
index 17520913..83ac0e37 100644
--- a/libfrog/bulkstat.h
+++ b/libfrog/bulkstat.h
@@ -13,4 +13,8 @@ int xfrog_bulkstat_single(struct xfs_fd *xfd, uint64_t ino,
int xfrog_bulkstat(struct xfs_fd *xfd, uint64_t *lastino, uint32_t icount,
struct xfs_bstat *ubuffer, uint32_t *ocount);
+struct xfs_inogrp;
+int xfrog_inumbers(struct xfs_fd *xfd, uint64_t *lastino, uint32_t icount,
+ struct xfs_inogrp *ubuffer, uint32_t *ocount);
+
#endif /* __LIBFROG_BULKSTAT_H__ */
diff --git a/scrub/fscounters.c b/scrub/fscounters.c
index ea6af156..f8cc1e94 100644
--- a/scrub/fscounters.c
+++ b/scrub/fscounters.c
@@ -15,6 +15,7 @@
#include "xfs_scrub.h"
#include "common.h"
#include "fscounters.h"
+#include "libfrog/bulkstat.h"
/*
* Filesystem counter collection routines. We can count the number of
@@ -41,30 +42,25 @@ xfs_count_inodes_range(
uint64_t last_ino,
uint64_t *count)
{
- struct xfs_fsop_bulkreq igrpreq = {NULL};
struct xfs_inogrp inogrp;
- __u64 igrp_ino;
+ uint64_t igrp_ino;
uint64_t nr = 0;
- __s32 igrplen = 0;
+ uint32_t igrplen = 0;
int error;
ASSERT(!(first_ino & (XFS_INODES_PER_CHUNK - 1)));
ASSERT((last_ino & (XFS_INODES_PER_CHUNK - 1)));
- igrpreq.lastip = &igrp_ino;
- igrpreq.icount = 1;
- igrpreq.ubuffer = &inogrp;
- igrpreq.ocount = &igrplen;
-
igrp_ino = first_ino;
- error = ioctl(ctx->mnt.fd, XFS_IOC_FSINUMBERS, &igrpreq);
- while (!error && igrplen && inogrp.xi_startino < last_ino) {
+ while (!(error = xfrog_inumbers(&ctx->mnt, &igrp_ino, 1, &inogrp,
+ &igrplen))) {
+ if (igrplen == 0 || inogrp.xi_startino >= last_ino)
+ break;
nr += inogrp.xi_alloccount;
- error = ioctl(ctx->mnt.fd, XFS_IOC_FSINUMBERS, &igrpreq);
}
if (error) {
- str_errno(ctx, descr);
+ str_liberror(ctx, error, descr);
return false;
}
diff --git a/scrub/inodes.c b/scrub/inodes.c
index c2cbe260..bf98f6ee 100644
--- a/scrub/inodes.c
+++ b/scrub/inodes.c
@@ -91,16 +91,15 @@ xfs_iterate_inodes_range(
xfs_inode_iter_fn fn,
void *arg)
{
- struct xfs_fsop_bulkreq igrpreq = {NULL};
struct xfs_handle handle;
struct xfs_inogrp inogrp;
struct xfs_bstat bstat[XFS_INODES_PER_CHUNK];
char idescr[DESCR_BUFSZ];
struct xfs_bstat *bs;
- __u64 igrp_ino;
+ uint64_t igrp_ino;
uint64_t ino;
uint32_t bulklen = 0;
- __s32 igrplen = 0;
+ uint32_t igrplen = 0;
bool moveon = true;
int i;
int error;
@@ -109,11 +108,6 @@ xfs_iterate_inodes_range(
memset(bstat, 0, XFS_INODES_PER_CHUNK * sizeof(struct xfs_bstat));
- igrpreq.lastip = &igrp_ino;
- igrpreq.icount = 1;
- igrpreq.ubuffer = &inogrp;
- igrpreq.ocount = &igrplen;
-
memcpy(&handle.ha_fsid, fshandle, sizeof(handle.ha_fsid));
handle.ha_fid.fid_len = sizeof(xfs_fid_t) -
sizeof(handle.ha_fid.fid_len);
@@ -121,7 +115,7 @@ xfs_iterate_inodes_range(
/* Find the inode chunk & alloc mask */
igrp_ino = first_ino;
- error = ioctl(ctx->mnt.fd, XFS_IOC_FSINUMBERS, &igrpreq);
+ error = xfrog_inumbers(&ctx->mnt, &igrp_ino, 1, &inogrp, &igrplen);
while (!error && igrplen) {
/* Load the inodes. */
ino = inogrp.xi_startino - 1;
@@ -181,12 +175,13 @@ _("Changed too many times during scan; giving up."));
stale_count = 0;
igrp_retry:
- error = ioctl(ctx->mnt.fd, XFS_IOC_FSINUMBERS, &igrpreq);
+ error = xfrog_inumbers(&ctx->mnt, &igrp_ino, 1, &inogrp,
+ &igrplen);
}
err:
if (error) {
- str_errno(ctx, descr);
+ str_liberror(ctx, error, descr);
moveon = false;
}
out:
prev parent reply other threads:[~2019-09-04 4:37 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-04 4:34 [PATCH v3 0/8] libxfrog: wrap version ioctl calls Darrick J. Wong
2019-09-04 4:34 ` [PATCH 1/8] xfsprogs: update spdx tags in LICENSES/ Darrick J. Wong
2019-09-04 23:20 ` Dave Chinner
2019-09-04 4:34 ` [PATCH 2/8] libfrog: refactor online geometry queries Darrick J. Wong
2019-09-04 4:35 ` [PATCH 3/8] libfrog: introduce xfs_fd to wrap an fd to a file on an xfs filesystem Darrick J. Wong
2019-09-04 4:35 ` [PATCH 4/8] libfrog: store more inode and block geometry in struct xfs_fd Darrick J. Wong
2019-09-04 4:35 ` [PATCH 5/8] libfrog: create online fs geometry converters Darrick J. Wong
2019-09-04 4:35 ` [PATCH 6/8] libfrog: refactor open-coded bulkstat calls Darrick J. Wong
2019-09-04 4:35 ` [PATCH 7/8] libfrog: create xfd_open function Darrick J. Wong
2019-09-04 23:21 ` Dave Chinner
2019-09-04 4:35 ` Darrick J. Wong [this message]
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=156757174089.1836891.5922232574019988618.stgit@magnolia \
--to=darrick.wong@oracle.com \
--cc=dchinner@redhat.com \
--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.