• Eric Sandeen's avatar
    xfs: fix overflow in xfs_growfs_data_private · e6da7c9f
    Eric Sandeen authored
    In the case where growing a filesystem would leave the last AG
    too small, the fixup code has an overflow in the calculation
    of the new size with one fewer ag, because "nagcount" is a 32
    bit number.  If the new filesystem has > 2^32 blocks in it
    this causes a problem resulting in an EINVAL return from growfs:
    
     # xfs_io -f -c "truncate 19998630180864" fsfile
     # mkfs.xfs -f -bsize=4096 -dagsize=76288719b,size=3905982455b fsfile
     # mount -o loop fsfile /mnt
     # xfs_growfs /mnt
    
    meta-data=/dev/loop0             isize=256    agcount=52,
    agsize=76288719 blks
             =                       sectsz=512   attr=2
    data     =                       bsize=4096   blocks=3905982455, imaxpct=5
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0
    log      =internal               bsize=4096   blocks=32768, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=0
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument
    
    Reported-by: richard.ems@cape-horn-eng.com
    Signed-off-by: default avatarEric Sandeen <sandeen@sandeen.net>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarFelix Blyakher <felixb@sgi.com>
    Signed-off-by: default avatarFelix Blyakher <felixb@sgi.com>
    e6da7c9f
xfs_fsops.c 18 KB