]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: take BB cluster offset into account when using 'type' cmd
authorAndrey Albershteyn <aalbersh@redhat.com>
Fri, 27 May 2022 20:36:14 +0000 (16:36 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 27 May 2022 20:36:14 +0000 (16:36 -0400)
Changing the interpretation type of data under the cursor moves the
cursor to the beginning of BB cluster. When cursor is set to an
inode the cursor is offset in BB buffer. However, this offset is not
considered when type of the data is changed - the cursor points to
the beginning of BB buffer. For example:

$ xfs_db -c "inode 131" -c "daddr" -c "type text" \
-c "daddr" /dev/sdb1
current daddr is 131
current daddr is 128

Signed-off-by: Andrey Albershteyn <aalbersh@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
db/io.c

diff --git a/db/io.c b/db/io.c
index bfc86cc4a1215e4b4b16f61331847ba30749eb01..3d2572364d398d1ef8e0e6893568190a57e55ebe 100644 (file)
--- a/db/io.c
+++ b/db/io.c
@@ -73,6 +73,13 @@ io_init(void)
        add_command(&ring_cmd);
 }
 
+static inline void set_cur_boff(int off)
+{
+       iocur_top->boff = off;
+       iocur_top->off = ((xfs_off_t)iocur_top->bb << BBSHIFT) + off;
+       iocur_top->data = (void *)((char *)iocur_top->buf + off);
+}
+
 void
 off_cur(
        int     off,
@@ -81,10 +88,8 @@ off_cur(
        if (iocur_top == NULL || off + len > BBTOB(iocur_top->blen))
                dbprintf(_("can't set block offset to %d\n"), off);
        else {
-               iocur_top->boff = off;
-               iocur_top->off = ((xfs_off_t)iocur_top->bb << BBSHIFT) + off;
+               set_cur_boff(off);
                iocur_top->len = len;
-               iocur_top->data = (void *)((char *)iocur_top->buf + off);
        }
 }
 
@@ -589,6 +594,7 @@ set_iocur_type(
        const typ_t     *type)
 {
        int             bb_count = 1;   /* type's size in basic blocks */
+       int             boff = iocur_top->boff;
 
        /*
         * Inodes are special; verifier checks all inodes in the chunk, the
@@ -613,6 +619,7 @@ set_iocur_type(
                bb_count = BTOBB(byteize(fsize(type->fields,
                                       iocur_top->data, 0, 0)));
        set_cur(type, iocur_top->bb, bb_count, DB_RING_IGN, NULL);
+       set_cur_boff(boff);
 }
 
 static void