From 0d376f6cf1799bd359a1c943e063f1a7db928660 Mon Sep 17 00:00:00 2001 From: Andrey Albershteyn Date: Fri, 27 May 2022 16:36:14 -0400 Subject: [PATCH] xfs_db: take BB cluster offset into account when using 'type' cmd 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 Reviewed-by: Darrick J. Wong Signed-off-by: Eric Sandeen --- db/io.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/db/io.c b/db/io.c index bfc86cc4a..3d2572364 100644 --- 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 -- 2.47.3