• Darrick J. Wong's avatar
    xfs: fix broken logic when detecting mergeable bmap records · 6be73cec
    Darrick J. Wong authored
    Commit 6bc6c99a944c was a well-intentioned effort to initiate
    consolidation of adjacent bmbt mapping records by setting the PREEN
    flag.  Consolidation can only happen if the length of the combined
    record doesn't overflow the 21-bit blockcount field of the bmbt
    recordset.  Unfortunately, the length test is inverted, leading to it
    triggering on data forks like these:
    
     EXT: FILE-OFFSET           BLOCK-RANGE        AG AG-OFFSET               TOTAL
       0: [0..16777207]:        76110848..92888055  0 (76110848..92888055) 16777208
       1: [16777208..20639743]: 92888056..96750591  0 (92888056..96750591)  38625368
    
    Note that record 0 has a length of 16777208 512b blocks.  This
    corresponds to 2097151 4k fsblocks, which is the maximum.  Hence the two
    records cannot be merged.
    
    However, the logic is still wrong even if we change the in-loop
    comparison, because the scope of our examination isn't broad enough
    inside the loop to detect mappings like this:
    
       0: [0..9]:               76110838..76110847  0 (76110838..76110847)       10
       1: [10..16777217]:       76110848..92888055  0 (76110848..92888055) 16777208
       2: [16777218..20639753]: 92888056..96750591  0 (92888056..96750591)  38625368
    
    These three records could be merged into two, but one cannot determine
    this purely from looking at records 0-1 or 1-2 in isolation.
    
    Hoist the mergability detection outside the loop, and base its decision
    making on whether or not a merged mapping could be expressed in fewer
    bmbt records.  While we're at it, fix the incorrect return type of the
    iter function.
    
    Fixes: 336642f7 ("xfs: alert the user about data/attr fork mappings that could be merged")
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    6be73cec
bmap.c 26.4 KB