Re: [PATCH 1/2] xfsprogs: xfs_fsr: Interpret arguments of qsort's compare function correctly
From: Eric Sandeen <hidden>
Date: 2021-01-26 05:18:22
On 1/25/21 3:58 AM, Chandan Babu R wrote:
The first argument passed to qsort() in fsrfs() is an array of "struct xfs_bulkstat". Hence the two arguments to the cmp() function must be interpreted as being of type "struct xfs_bulkstat *" as against "struct xfs_bstat *" that is being used to currently typecast them. Signed-off-by: Chandan Babu R <redacted>
Yikes. Broken since 5.3.0, and the structures have different sizes and
different bs_extents offsets. :(
Fixes: 4cca629d6 ("misc: convert xfrog_bulkstat functions to have v5 semantics")
Reviewed-by: Eric Sandeen <redacted>
At least it's only affecting the whole-fs defragment which is generally not
recommended, but is still available and does get used.
I wonder if it explains this bug report:
Jan 07 20:52:44 <Tharn> hey, quick question... the first time I ran xfs_fsr last night, it ran for 2 hours and looking at the console log, it ended with a lot of "start inode=0" repeating
quoted hunk ↗ jump to hunk
--- fsr/xfs_fsr.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 77a10a1d..635e4c70 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c@@ -702,9 +702,8 @@ out0: int cmp(const void *s1, const void *s2) { - return( ((struct xfs_bstat *)s2)->bs_extents - - ((struct xfs_bstat *)s1)->bs_extents); - + return( ((struct xfs_bulkstat *)s2)->bs_extents - + ((struct xfs_bulkstat *)s1)->bs_extents); } /*