From: Darrick J. Wong Date: Tue, 29 Oct 2024 00:03:32 +0000 (-0700) Subject: xfs_db: access realtime file blocks X-Git-Tag: v6.12.0~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b05a31722f5d4c5e071238cbedf491d5b109f278;p=thirdparty%2Fxfsprogs-dev.git xfs_db: access realtime file blocks Now that we have the ability to point the io cursor at the realtime device, let's make it so that the "dblock" command can walk the contents of realtime files. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- diff --git a/db/block.c b/db/block.c index 6ad9f038..87118a47 100644 --- a/db/block.c +++ b/db/block.c @@ -196,6 +196,13 @@ dblock_help(void) )); } +static inline bool +is_rtfile( + struct xfs_dinode *dip) +{ + return dip->di_flags & cpu_to_be16(XFS_DIFLAG_REALTIME); +} + static int dblock_f( int argc, @@ -235,8 +242,14 @@ dblock_f( ASSERT(typtab[type].typnm == type); if (nex > 1) make_bbmap(&bbmap, nex, bmp); - set_cur(&typtab[type], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno), - nb * blkbb, DB_RING_ADD, nex > 1 ? &bbmap : NULL); + if (is_rtfile(iocur_top->data)) + set_rt_cur(&typtab[type], xfs_rtb_to_daddr(mp, dfsbno), + nb * blkbb, DB_RING_ADD, + nex > 1 ? &bbmap : NULL); + else + set_cur(&typtab[type], (int64_t)XFS_FSB_TO_DADDR(mp, dfsbno), + nb * blkbb, DB_RING_ADD, + nex > 1 ? &bbmap : NULL); free(bmp); return 0; } diff --git a/db/block.h b/db/block.h index 7c4e8cb2..55843a6b 100644 --- a/db/block.h +++ b/db/block.h @@ -3,8 +3,28 @@ * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. * All Rights Reserved. */ +#ifndef __XFS_DB_BLOCK_H +#define __XFS_DB_BLOCK_H struct field; extern void block_init(void); extern void print_block(const struct field *fields, int argc, char **argv); + +static inline xfs_daddr_t +xfs_rtb_to_daddr( + struct xfs_mount *mp, + xfs_rtblock_t rtb) +{ + return rtb << mp->m_blkbb_log; +} + +static inline xfs_rtblock_t +xfs_daddr_to_rtb( + struct xfs_mount *mp, + xfs_daddr_t daddr) +{ + return daddr >> mp->m_blkbb_log; +} + +#endif /* __XFS_DB_BLOCK_H */ diff --git a/db/faddr.c b/db/faddr.c index ec4aae68..e2f9587d 100644 --- a/db/faddr.c +++ b/db/faddr.c @@ -15,6 +15,7 @@ #include "bmap.h" #include "output.h" #include "init.h" +#include "block.h" void fa_agblock( @@ -323,7 +324,9 @@ fa_drtbno( dbprintf(_("null block number, cannot set new addr\n")); return; } - /* need set_cur to understand rt subvolume */ + + set_rt_cur(&typtab[next], xfs_rtb_to_daddr(mp, bno), blkbb, + DB_RING_ADD, NULL); } /*ARGSUSED*/