From b585bc4afaf37b744acba6be87f5909b4564b845 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 8 Jan 2014 00:17:24 +0100 Subject: [PATCH] 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 Signed-off-by: Ned Bass Signed-off-by: marku89 Issue #1700 --- module/zfs/zfs_vnops.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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.