OSDN Git Service

[XFS] Fix a 32 bit value wraparound when providing a mapping for a large
authorNathan Scott <nathans@sgi.com>
Fri, 25 Nov 2005 05:41:57 +0000 (16:41 +1100)
committerNathan Scott <nathans@sgi.com>
Fri, 25 Nov 2005 05:41:57 +0000 (16:41 +1100)
direct write.

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

Signed-off-by: Nathan Scott <nathans@sgi.com>
fs/xfs/linux-2.6/xfs_aops.c

index c610897..94d3cdf 100644 (file)
@@ -941,13 +941,12 @@ __linvfs_get_block(
        int                     retpbbm = 1;
        int                     error;
 
-       if (blocks) {
-               offset = blocks << inode->i_blkbits;    /* 64 bit goodness */
-               size = (ssize_t) min_t(xfs_off_t, offset, LONG_MAX);
-       } else {
-               size = 1 << inode->i_blkbits;
-       }
        offset = (xfs_off_t)iblock << inode->i_blkbits;
+       if (blocks)
+               size = (ssize_t) min_t(xfs_off_t, LONG_MAX,
+                                       (xfs_off_t)blocks << inode->i_blkbits);
+       else
+               size = 1 << inode->i_blkbits;
 
        VOP_BMAP(vp, offset, size,
                create ? flags : BMAPI_READ, &iomap, &retpbbm, error);
@@ -1007,7 +1006,7 @@ __linvfs_get_block(
                ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0);
                offset = min_t(xfs_off_t,
                                iomap.iomap_bsize - iomap.iomap_delta,
-                               blocks << inode->i_blkbits);
+                               (xfs_off_t)blocks << inode->i_blkbits);
                bh_result->b_size = (u32) min_t(xfs_off_t, UINT_MAX, offset);
        }