• Eric Sandeen's avatar
    hugetlbfs: fix i_blocks accounting · e4c6f8be
    Eric Sandeen authored
    As reported in Red Hat bz #509671, i_blocks for files on hugetlbfs get
    accounting wrong when doing something like:
    
       $ > foo
       $ date  > foo
       date: write error: Invalid argument
       $ /usr/bin/stat foo
         File: `foo'
         Size: 0          Blocks: 18446744073709547520 IO Block: 2097152 regular
    ...
    
    This is because hugetlb_unreserve_pages() is unconditionally removing
    blocks_per_huge_page(h) on each call rather than using the freed amount.
    If there were 0 blocks, it goes negative, resulting in the above.
    
    This is a regression from commit a5516438
    ("hugetlb: modular state for hugetlb page size")
    
    which did:
    
    -	inode->i_blocks -= BLOCKS_PER_HUGEPAGE * freed;
    +	inode->i_blocks -= blocks_per_huge_page(h);
    
    so just put back the freed multiplier, and it's all happy again.
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Acked-by: default avatarAndi Kleen <andi@firstfloor.org>
    Cc: William Lee Irwin III <wli@holomorphy.com>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e4c6f8be
hugetlb.c 61.7 KB