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 <behlendorf1@llnl.gov>
Signed-off-by: Ned Bass <bass6@llnl.gov>
Signed-off-by: marku89 <mar42@kola.li>
Issue #1700
This commit is contained in:
Brian Behlendorf 2014-01-08 00:17:24 +01:00
parent aa0218d6a1
commit b585bc4afa

View File

@ -2392,6 +2392,8 @@ zfs_getattr_fast(struct inode *ip, struct kstat *sp)
{ {
znode_t *zp = ITOZ(ip); znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ITOZSB(ip); zfs_sb_t *zsb = ITOZSB(ip);
uint32_t blksize;
u_longlong_t nblocks;
ZFS_ENTER(zsb); ZFS_ENTER(zsb);
ZFS_VERIFY_ZP(zp); ZFS_VERIFY_ZP(zp);
@ -2401,7 +2403,10 @@ zfs_getattr_fast(struct inode *ip, struct kstat *sp)
generic_fillattr(ip, sp); generic_fillattr(ip, sp);
ZFS_TIME_DECODE(&sp->atime, zp->z_atime); 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)) { if (unlikely(zp->z_blksz == 0)) {
/* /*
* Block size hasn't been set; suggest maximal I/O transfers. * Block size hasn't been set; suggest maximal I/O transfers.