From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@sandeen.net, darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 06/12] libfrog: create online fs geometry converters
Date: Thu, 20 Jun 2019 09:50:07 -0700 [thread overview]
Message-ID: <156104940780.1172531.1442505572804647669.stgit@magnolia> (raw)
In-Reply-To: <156104936953.1172531.2121427277342917243.stgit@magnolia>
From: Darrick J. Wong <darrick.wong@oracle.com>
Create helper functions to perform unit conversions against a runtime
filesystem, then remove the open-coded versions in scrub.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
include/xfrog.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
libfrog/fsgeom.c | 1 +
scrub/fscounters.c | 4 ++--
scrub/inodes.c | 4 ++--
scrub/phase3.c | 6 +++---
scrub/phase5.c | 4 ++--
scrub/phase6.c | 3 ++-
scrub/phase7.c | 6 +++---
8 files changed, 64 insertions(+), 13 deletions(-)
diff --git a/include/xfrog.h b/include/xfrog.h
index 507f27a4..8d7e38df 100644
--- a/include/xfrog.h
+++ b/include/xfrog.h
@@ -42,6 +42,9 @@ struct xfrog {
/* log2 of sb_inopblock */
unsigned int inopblog;
+
+ /* bits for agino in inum */
+ unsigned int aginolog;
};
/* Static initializers */
@@ -51,4 +54,50 @@ struct xfrog {
int xfrog_prepare_geometry(struct xfrog *froggie);
int xfrog_close(struct xfrog *froggie);
+/* Convert AG number and AG inode number into fs inode number. */
+static inline uint64_t
+xfrog_agino_to_ino(
+ struct xfrog *frog,
+ uint32_t agno,
+ uint32_t agino)
+{
+ return ((uint64_t)agno << frog->aginolog) + agino;
+}
+
+/* Convert fs inode number into AG number. */
+static inline uint32_t
+xfrog_ino_to_agno(
+ struct xfrog *frog,
+ uint64_t ino)
+{
+ return ino >> frog->aginolog;
+}
+
+/* Convert fs inode number into AG inode number. */
+static inline uint32_t
+xfrog_ino_to_agino(
+ struct xfrog *frog,
+ uint64_t ino)
+{
+ return ino & ((1ULL << frog->aginolog) - 1);
+}
+
+/* Convert fs block number into bytes */
+static inline uint64_t
+xfrog_fsb_to_b(
+ struct xfrog *frog,
+ uint64_t fsb)
+{
+ return fsb << frog->blocklog;
+}
+
+/* Convert bytes into (rounded down) fs block number */
+static inline uint64_t
+xfrog_b_to_fsbt(
+ struct xfrog *frog,
+ uint64_t bytes)
+{
+ return bytes >> frog->blocklog;
+}
+
#endif /* __XFROG_H__ */
diff --git a/libfrog/fsgeom.c b/libfrog/fsgeom.c
index 28e4fd62..c61466e2 100644
--- a/libfrog/fsgeom.c
+++ b/libfrog/fsgeom.c
@@ -105,6 +105,7 @@ xfrog_prepare_geometry(
froggie->blocklog = highbit32(froggie->fsgeom.blocksize);
froggie->inodelog = highbit32(froggie->fsgeom.inodesize);
froggie->inopblog = froggie->blocklog - froggie->inodelog;
+ froggie->aginolog = froggie->agblklog + froggie->inopblog;
return 0;
}
diff --git a/scrub/fscounters.c b/scrub/fscounters.c
index ac898764..adb79b50 100644
--- a/scrub/fscounters.c
+++ b/scrub/fscounters.c
@@ -91,8 +91,8 @@ xfs_count_ag_inodes(
minor(ctx->fsinfo.fs_datadev),
agno);
- ag_ino = (__u64)agno << (ctx->mnt.inopblog + ctx->mnt.agblklog);
- next_ag_ino = (__u64)(agno + 1) << (ctx->mnt.inopblog + ctx->mnt.agblklog);
+ ag_ino = xfrog_agino_to_ino(&ctx->mnt, agno, 0);
+ next_ag_ino = xfrog_agino_to_ino(&ctx->mnt, agno + 1, 0);
moveon = xfs_count_inodes_range(ctx, descr, ag_ino, next_ag_ino - 1,
&ci->counters[agno]);
diff --git a/scrub/inodes.c b/scrub/inodes.c
index 873ad425..a9000218 100644
--- a/scrub/inodes.c
+++ b/scrub/inodes.c
@@ -228,8 +228,8 @@ xfs_scan_ag_inodes(
minor(ctx->fsinfo.fs_datadev),
agno);
- ag_ino = (__u64)agno << (ctx->mnt.inopblog + ctx->mnt.agblklog);
- next_ag_ino = (__u64)(agno + 1) << (ctx->mnt.inopblog + ctx->mnt.agblklog);
+ ag_ino = xfrog_agino_to_ino(&ctx->mnt, agno, 0);
+ next_ag_ino = xfrog_agino_to_ino(&ctx->mnt, agno + 1, 0);
moveon = xfs_iterate_inodes_range(ctx, descr, ctx->fshandle, ag_ino,
next_ag_ino - 1, si->fn, si->arg);
diff --git a/scrub/phase3.c b/scrub/phase3.c
index 579e08c3..def9a0de 100644
--- a/scrub/phase3.c
+++ b/scrub/phase3.c
@@ -52,8 +52,8 @@ xfs_scrub_inode_vfs_error(
xfs_agino_t agino;
int old_errno = errno;
- agno = bstat->bs_ino / (1ULL << (ctx->mnt.inopblog + ctx->mnt.agblklog));
- agino = bstat->bs_ino % (1ULL << (ctx->mnt.inopblog + ctx->mnt.agblklog));
+ agno = xfrog_ino_to_agno(&ctx->mnt, bstat->bs_ino);
+ agino = xfrog_ino_to_agino(&ctx->mnt, bstat->bs_ino);
snprintf(descr, DESCR_BUFSZ, _("inode %"PRIu64" (%u/%u)"),
(uint64_t)bstat->bs_ino, agno, agino);
errno = old_errno;
@@ -77,7 +77,7 @@ xfs_scrub_inode(
int error;
xfs_action_list_init(&alist);
- agno = bstat->bs_ino / (1ULL << (ctx->mnt.inopblog + ctx->mnt.agblklog));
+ agno = xfrog_ino_to_agno(&ctx->mnt, bstat->bs_ino);
background_sleep();
/* Try to open the inode to pin it. */
diff --git a/scrub/phase5.c b/scrub/phase5.c
index 36ec27b3..2189c9e4 100644
--- a/scrub/phase5.c
+++ b/scrub/phase5.c
@@ -239,8 +239,8 @@ xfs_scrub_connections(
int fd = -1;
int error;
- agno = bstat->bs_ino / (1ULL << (ctx->mnt.inopblog + ctx->mnt.agblklog));
- agino = bstat->bs_ino % (1ULL << (ctx->mnt.inopblog + ctx->mnt.agblklog));
+ agno = xfrog_ino_to_agno(&ctx->mnt, bstat->bs_ino);
+ agino = xfrog_ino_to_agino(&ctx->mnt, bstat->bs_ino);
snprintf(descr, DESCR_BUFSZ, _("inode %"PRIu64" (%u/%u)"),
(uint64_t)bstat->bs_ino, agno, agino);
background_sleep();
diff --git a/scrub/phase6.c b/scrub/phase6.c
index 48971270..630d15b0 100644
--- a/scrub/phase6.c
+++ b/scrub/phase6.c
@@ -547,7 +547,8 @@ xfs_estimate_verify_work(
if (!moveon)
return moveon;
- *items = ((d_blocks - d_bfree) + (r_blocks - r_bfree)) << ctx->mnt.blocklog;
+ *items = xfrog_fsb_to_b(&ctx->mnt,
+ (d_blocks - d_bfree) + (r_blocks - r_bfree));
*nr_threads = disk_heads(ctx->datadev);
*rshift = 20;
return moveon;
diff --git a/scrub/phase7.c b/scrub/phase7.c
index 41a77356..1c459dfc 100644
--- a/scrub/phase7.c
+++ b/scrub/phase7.c
@@ -148,11 +148,11 @@ xfs_scan_summary(
* filesystem treats them as "free", but since we scanned
* them, we'll consider them used.
*/
- d_bfree -= totalcount.agbytes >> ctx->mnt.blocklog;
+ d_bfree -= xfrog_b_to_fsbt(&ctx->mnt, totalcount.agbytes);
/* Report on what we found. */
- used_data = (d_blocks - d_bfree) << ctx->mnt.blocklog;
- used_rt = (r_blocks - r_bfree) << ctx->mnt.blocklog;
+ used_data = xfrog_fsb_to_b(&ctx->mnt, d_blocks - d_bfree);
+ used_rt = xfrog_fsb_to_b(&ctx->mnt, r_blocks - r_bfree);
used_files = f_files - f_free;
stat_data = totalcount.dbytes;
stat_rt = totalcount.rbytes;
next prev parent reply other threads:[~2019-06-20 16:50 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-20 16:49 [PATCH v3 00/12] xfsprogs-5.1: fix various problems Darrick J. Wong
2019-06-20 16:49 ` [PATCH 01/12] libfrog: don't set negative errno in conversion functions Darrick J. Wong
2019-06-20 18:58 ` Eric Sandeen
2019-06-25 11:02 ` Christoph Hellwig
2019-06-20 16:49 ` [PATCH 02/12] libfrog: cvt_u64 should use strtoull, not strtoll Darrick J. Wong
2019-06-20 19:08 ` Eric Sandeen
2019-06-25 11:02 ` Christoph Hellwig
2019-06-20 16:49 ` [PATCH 03/12] libfrog: refactor online geometry queries Darrick J. Wong
2019-06-20 19:16 ` Eric Sandeen
2019-06-20 21:02 ` Darrick J. Wong
2019-06-25 14:28 ` Christoph Hellwig
2019-06-20 16:49 ` [PATCH 04/12] libfrog: introduce xfrog context Darrick J. Wong
2019-06-20 19:40 ` Eric Sandeen
2019-06-20 16:50 ` [PATCH 05/12] libfrog: store more inode and block geometry in struct xfrog Darrick J. Wong
2019-06-20 16:50 ` Darrick J. Wong [this message]
2019-06-20 16:50 ` [PATCH 07/12] libfrog: refactor open-coded bulkstat calls Darrick J. Wong
2019-06-20 16:50 ` [PATCH 08/12] libfrog: refactor open-coded INUMBERS calls Darrick J. Wong
2019-06-25 23:53 ` Darrick J. Wong
2019-06-20 16:50 ` [PATCH 09/12] mkfs: validate start and end of aligned logs Darrick J. Wong
2019-06-20 19:46 ` Eric Sandeen
2019-06-20 16:50 ` [PATCH 10/12] xfs_io: repair_f should use its own name Darrick J. Wong
2019-06-20 19:52 ` Eric Sandeen
2019-06-20 16:50 ` [PATCH 11/12] libxfs-diff: try harder to find the kernel equivalent libxfs files Darrick J. Wong
2019-06-20 19:53 ` Eric Sandeen
2019-06-20 19:57 ` Darrick J. Wong
2019-06-20 16:50 ` [PATCH 12/12] xfs_db: add a function to compute btree geometry Darrick J. Wong
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=156104940780.1172531.1442505572804647669.stgit@magnolia \
--to=darrick.wong@oracle.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.