diff options
author | Brian Behlendorf <[email protected]> | 2014-01-08 00:17:24 +0100 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-01-09 15:50:23 -0800 |
commit | b585bc4afaf37b744acba6be87f5909b4564b845 (patch) | |
tree | 7e8b270cb5ec3c94ed98576e5beab7692d2c147c /module/zfs/zfs_vnops.c | |
parent | aa0218d6a12814fac50b287214f9f3b0b99e11b1 (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/zfs/zfs_vnops.c')
-rw-r--r-- | module/zfs/zfs_vnops.c | 7 |
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. |