]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: report the device associated with each io cursor
authorDarrick J. Wong <djwong@kernel.org>
Wed, 20 Dec 2023 16:53:44 +0000 (08:53 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 22 Dec 2023 02:29:14 +0000 (18:29 -0800)
When db is reporting on an io cursor, have it print out the device
that the cursor is pointing to.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
db/block.c
db/io.c
db/io.h

index 788337d37092460ab7f133046d7a874b3feb7291..d730c77967103af1dbf6bded0d8e0a921b7713d0 100644 (file)
@@ -126,7 +126,15 @@ daddr_f(
        char            *p;
 
        if (argc == 1) {
-               dbprintf(_("current daddr is %lld\n"), iocur_top->off >> BBSHIFT);
+               xfs_daddr_t     daddr = iocur_top->off >> BBSHIFT;
+
+               if (iocur_is_ddev(iocur_top))
+                       dbprintf(_("datadev daddr is %lld\n"), daddr);
+               else if (iocur_is_extlogdev(iocur_top))
+                       dbprintf(_("logdev daddr is %lld\n"), daddr);
+               else
+                       dbprintf(_("current daddr is %lld\n"), daddr);
+
                return 0;
        }
        d = (int64_t)strtoull(argv[1], &p, 0);
@@ -220,6 +228,10 @@ fsblock_f(
        char            *p;
 
        if (argc == 1) {
+               if (!iocur_is_ddev(iocur_top)) {
+                       dbprintf(_("cursor does not point to data device\n"));
+                       return 0;
+               }
                dbprintf(_("current fsblock is %lld\n"),
                        XFS_DADDR_TO_FSB(mp, iocur_top->off >> BBSHIFT));
                return 0;
diff --git a/db/io.c b/db/io.c
index 5ccfe3b536a0296b0b1c303a16e5f1b02832f317..590dd1f82f7bc7f8331e41ba08a5b8eee7e323fd 100644 (file)
--- a/db/io.c
+++ b/db/io.c
@@ -137,18 +137,47 @@ pop_help(void)
                ));
 }
 
+bool
+iocur_is_ddev(const struct iocur *ioc)
+{
+       if (!ioc->bp)
+               return false;
+
+       return ioc->bp->b_target == ioc->bp->b_mount->m_ddev_targp;
+}
+
+bool
+iocur_is_extlogdev(const struct iocur *ioc)
+{
+       struct xfs_buf  *bp = ioc->bp;
+
+       if (!bp)
+               return false;
+       if (bp->b_mount->m_logdev_targp == bp->b_mount->m_ddev_targp)
+               return false;
+
+       return bp->b_target == bp->b_mount->m_logdev_targp;
+}
+
 void
 print_iocur(
        char    *tag,
        iocur_t *ioc)
 {
+       const char      *block_unit = "fsbno?";
        int     i;
 
+       if (iocur_is_ddev(ioc))
+               block_unit = "fsbno";
+       else if (iocur_is_extlogdev(ioc))
+               block_unit = "logbno";
+
        dbprintf("%s\n", tag);
        dbprintf(_("\tbyte offset %lld, length %d\n"), ioc->off, ioc->len);
-       dbprintf(_("\tbuffer block %lld (fsbno %lld), %d bb%s\n"), ioc->bb,
-               (xfs_fsblock_t)XFS_DADDR_TO_FSB(mp, ioc->bb), ioc->blen,
-               ioc->blen == 1 ? "" : "s");
+       dbprintf(_("\tbuffer block %lld (%s %lld), %d bb%s\n"), ioc->bb,
+                       block_unit,
+                       (xfs_fsblock_t)XFS_DADDR_TO_FSB(mp, ioc->bb),
+                       ioc->blen, ioc->blen == 1 ? "" : "s");
        if (ioc->bbmap) {
                dbprintf(_("\tblock map"));
                for (i = 0; i < ioc->bbmap->nmaps; i++)
diff --git a/db/io.h b/db/io.h
index bd86c31f67e58b37f494a1a7040902375169dcf5..f48b67b47a2b55af2719f039f9651781f34bc14a 100644 (file)
--- a/db/io.h
+++ b/db/io.h
@@ -56,6 +56,9 @@ extern void   set_iocur_type(const struct typ *type);
 extern void    xfs_dummy_verify(struct xfs_buf *bp);
 extern void    xfs_verify_recalc_crc(struct xfs_buf *bp);
 
+bool iocur_is_ddev(const struct iocur *ioc);
+bool iocur_is_extlogdev(const struct iocur *ioc);
+
 /*
  * returns -1 for unchecked, 0 for bad and 1 for good
  */