aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2014-01-08 00:17:24 +0100
committerBrian Behlendorf <[email protected]>2014-01-09 15:50:23 -0800
commitb585bc4afaf37b744acba6be87f5909b4564b845 (patch)
tree7e8b270cb5ec3c94ed98576e5beab7692d2c147c /module
parentaa0218d6a12814fac50b287214f9f3b0b99e11b1 (diff)
Fix zfs_getattr_fast types
On Sparc sp->blksize will be a 64-bit value which is then cast incorrectly to a 32-bit value. For big endian systems this results in an incorrect value for sp->blksize. To resolve the problem local variables of the correct size are used and then assigned to sp->blksize. Signed-off-by: Brian Behlendorf <[email protected]> Signed-off-by: Ned Bass <[email protected]> Signed-off-by: marku89 <[email protected]> Issue #1700
Diffstat (limited to 'module')
-rw-r--r--module/zfs/zfs_vnops.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c
index f56b52ace..91f743aaa 100644
--- a/module/zfs/zfs_vnops.c
+++ b/module/zfs/zfs_vnops.c
@@ -2392,6 +2392,8 @@ zfs_getattr_fast(struct inode *ip, struct kstat *sp)
{
znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ITOZSB(ip);
+ uint32_t blksize;
+ u_longlong_t nblocks;
ZFS_ENTER(zsb);
ZFS_VERIFY_ZP(zp);
@@ -2401,7 +2403,10 @@ zfs_getattr_fast(struct inode *ip, struct kstat *sp)
generic_fillattr(ip, sp);
ZFS_TIME_DECODE(&sp->atime, zp->z_atime);
- sa_object_size(zp->z_sa_hdl, (uint32_t *)&sp->blksize, &sp->blocks);
+ sa_object_size(zp->z_sa_hdl, &blksize, &nblocks);
+ sp->blksize = blksize;
+ sp->blocks = nblocks;
+
if (unlikely(zp->z_blksz == 0)) {
/*
* Block size hasn't been set; suggest maximal I/O transfers.