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 |
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 --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 }
"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> ---