diff mbox series

xfs_db: print freecount in xfs_inobt_rec as unsigned

Message ID 3fb12611-2ce0-7e8d-0c65-dcbddf5e55b7@redhat.com (mailing list archive)
State Accepted
Headers show
Series xfs_db: print freecount in xfs_inobt_rec as unsigned | expand

Commit Message

Eric Sandeen Oct. 24, 2018, 10:20 p.m. UTC
"freecount" in the xfs_inobt_rec is unsigned, so xfs_db should
print it as such.

Not doing so tickles a bug in getbitval() where we try to handle
sign extension for signed fields and fail badly on big endian
machines, causing us to incorrectly report negative numbers when
printing structures even when the number is nowhere near the
signed maximum value.

So this fix works around that bug by properly marking this field
as unsigned, because I have yet to convince myself of the proper
fix for the underlying bug.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=201453
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

Comments

Darrick J. Wong Oct. 26, 2018, 3:48 p.m. UTC | #1
On Wed, Oct 24, 2018 at 05:20:08PM -0500, Eric Sandeen wrote:
> "freecount" in the xfs_inobt_rec is unsigned, so xfs_db should
> print it as such.
> 
> Not doing so tickles a bug in getbitval() where we try to handle
> sign extension for signed fields and fail badly on big endian
> machines, causing us to incorrectly report negative numbers when
> printing structures even when the number is nowhere near the
> signed maximum value.
> 
> So this fix works around that bug by properly marking this field
> as unsigned, because I have yet to convince myself of the proper
> fix for the underlying bug.
> 
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=201453
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>

Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> ---
> 
> diff --git a/db/btblock.c b/db/btblock.c
> index cbd2990..5a5b061 100644
> --- a/db/btblock.c
> +++ b/db/btblock.c
> @@ -513,7 +513,7 @@ const field_t	inobt_sprec_flds[] = {
>  	{ "holemask", FLDT_UINT16X, OI(ROFF(ir_u.sp.ir_holemask)), C1, 0,
>  	  TYP_NONE },
>  	{ "count", FLDT_UINT8D, OI(ROFF(ir_u.sp.ir_count)), C1, 0, TYP_NONE },
> -	{ "freecount", FLDT_INT8D, OI(ROFF(ir_u.sp.ir_freecount)), C1, 0,
> +	{ "freecount", FLDT_UINT8D, OI(ROFF(ir_u.sp.ir_freecount)), C1, 0,
>  	  TYP_NONE },
>  	{ "free", FLDT_INOFREE, OI(ROFF(ir_free)), C1, 0, TYP_NONE },
>  	{ NULL }
>
diff mbox series

Patch

diff --git a/db/btblock.c b/db/btblock.c
index cbd2990..5a5b061 100644
--- a/db/btblock.c
+++ b/db/btblock.c
@@ -513,7 +513,7 @@  const field_t	inobt_sprec_flds[] = {
 	{ "holemask", FLDT_UINT16X, OI(ROFF(ir_u.sp.ir_holemask)), C1, 0,
 	  TYP_NONE },
 	{ "count", FLDT_UINT8D, OI(ROFF(ir_u.sp.ir_count)), C1, 0, TYP_NONE },
-	{ "freecount", FLDT_INT8D, OI(ROFF(ir_u.sp.ir_freecount)), C1, 0,
+	{ "freecount", FLDT_UINT8D, OI(ROFF(ir_u.sp.ir_freecount)), C1, 0,
 	  TYP_NONE },
 	{ "free", FLDT_INOFREE, OI(ROFF(ir_free)), C1, 0, TYP_NONE },
 	{ NULL }