[XFS] Fix a 32 bit value wraparound when providing a mapping for a large direct write.

SGI-PV: 944820
SGI-Modid: xfs-linux-melb:xfs-kern:24351a

Signed-off-by: Nathan Scott <nathans@sgi.com>

+6 -7
+6 -7
fs/xfs/linux-2.6/xfs_aops.c
··· 941 941 int retpbbm = 1; 942 942 int error; 943 943 944 - if (blocks) { 945 - offset = blocks << inode->i_blkbits; /* 64 bit goodness */ 946 - size = (ssize_t) min_t(xfs_off_t, offset, LONG_MAX); 947 - } else { 948 - size = 1 << inode->i_blkbits; 949 - } 950 944 offset = (xfs_off_t)iblock << inode->i_blkbits; 945 + if (blocks) 946 + size = (ssize_t) min_t(xfs_off_t, LONG_MAX, 947 + (xfs_off_t)blocks << inode->i_blkbits); 948 + else 949 + size = 1 << inode->i_blkbits; 951 950 952 951 VOP_BMAP(vp, offset, size, 953 952 create ? flags : BMAPI_READ, &iomap, &retpbbm, error); ··· 1006 1007 ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0); 1007 1008 offset = min_t(xfs_off_t, 1008 1009 iomap.iomap_bsize - iomap.iomap_delta, 1009 - blocks << inode->i_blkbits); 1010 + (xfs_off_t)blocks << inode->i_blkbits); 1010 1011 bh_result->b_size = (u32) min_t(xfs_off_t, UINT_MAX, offset); 1011 1012 } 1012 1013