From: Andrey Albershteyn Date: Fri, 27 May 2022 20:36:14 +0000 (-0400) Subject: xfs_db: take BB cluster offset into account when using 'type' cmd X-Git-Tag: v5.18.0-rc1~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0d376f6cf1799bd359a1c943e063f1a7db928660;p=thirdparty%2Fxfsprogs-dev.git 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 --- 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