[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>
This commit is contained in:
parent
f33c6797bc
commit
a4656391b7
|
@ -941,13 +941,12 @@ __linvfs_get_block(
|
||||||
int retpbbm = 1;
|
int retpbbm = 1;
|
||||||
int error;
|
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;
|
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,
|
VOP_BMAP(vp, offset, size,
|
||||||
create ? flags : BMAPI_READ, &iomap, &retpbbm, error);
|
create ? flags : BMAPI_READ, &iomap, &retpbbm, error);
|
||||||
|
@ -1007,7 +1006,7 @@ __linvfs_get_block(
|
||||||
ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0);
|
ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0);
|
||||||
offset = min_t(xfs_off_t,
|
offset = min_t(xfs_off_t,
|
||||||
iomap.iomap_bsize - iomap.iomap_delta,
|
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);
|
bh_result->b_size = (u32) min_t(xfs_off_t, UINT_MAX, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue