From: Dave Chinner Date: Wed, 13 Nov 2013 06:40:54 +0000 (+0000) Subject: libxfs: work around do_div() not handling 32 bit numerators X-Git-Tag: v3.2.0-alpha2~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=839dac7f06d54600b3092a7ad9cb903315a27f97;p=thirdparty%2Fxfsprogs-dev.git libxfs: work around do_div() not handling 32 bit numerators The libxfs dquot buffer code uses do_div() with a 32 bit numerator. This gives incorrect results as do_div() passes the numerator by reference as a pointer to a 64 bit value. Hence it does the division using 32 bits of garbage gives the wrong result. As per Christoph's suggestion, we can kill the usage of do_div() here completely and just do the division directly, both in userspace and kernel space. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Rich Johnston --- diff --git a/libxfs/xfs_dquot_buf.c b/libxfs/xfs_dquot_buf.c index 620d9d3fe..6bbb0ff73 100644 --- a/libxfs/xfs_dquot_buf.c +++ b/libxfs/xfs_dquot_buf.c @@ -23,13 +23,8 @@ xfs_calc_dquots_per_chunk( struct xfs_mount *mp, unsigned int nbblks) /* basic block units */ { - unsigned int ndquots; - ASSERT(nbblks > 0); - ndquots = BBTOB(nbblks); - do_div(ndquots, sizeof(xfs_dqblk_t)); - - return ndquots; + return BBTOB(nbblks) / sizeof(xfs_dqblk_t); } /*