From 625ee0a5e0121401bc02b312284975a33312809e Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Wed, 30 Sep 2015 13:25:11 -0400 Subject: [PATCH] zfs_inode_update should not call dmu_object_size_from_db under spinlock We should never block when holding a spin lock, but zfs_inode_update can block in the critical section of a spin lock in zfs_inode_update: zfs_inode_update -> dmu_object_size_from_db -> zrl_add -> mutex_enter Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Issue #3858 --- module/zfs/zfs_znode.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c index eac9ce486d..dc06d0672d 100644 --- a/module/zfs/zfs_znode.c +++ b/module/zfs/zfs_znode.c @@ -610,6 +610,7 @@ zfs_inode_update(znode_t *zp) zfs_sb_t *zsb; struct inode *ip; uint32_t blksize; + u_longlong_t i_blocks; uint64_t atime[2], mtime[2], ctime[2]; ASSERT(zp != NULL); @@ -624,6 +625,8 @@ zfs_inode_update(znode_t *zp) sa_lookup(zp->z_sa_hdl, SA_ZPL_MTIME(zsb), &mtime, 16); sa_lookup(zp->z_sa_hdl, SA_ZPL_CTIME(zsb), &ctime, 16); + dmu_object_size_from_db(sa_get_db(zp->z_sa_hdl), &blksize, &i_blocks); + spin_lock(&ip->i_lock); ip->i_generation = zp->z_gen; ip->i_uid = SUID_TO_KUID(zp->z_uid); @@ -632,8 +635,7 @@ zfs_inode_update(znode_t *zp) ip->i_mode = zp->z_mode; zfs_set_inode_flags(zp, ip); ip->i_blkbits = SPA_MINBLOCKSHIFT; - dmu_object_size_from_db(sa_get_db(zp->z_sa_hdl), &blksize, - (u_longlong_t *)&ip->i_blocks); + ip->i_blocks = i_blocks; ZFS_TIME_DECODE(&ip->i_atime, atime); ZFS_TIME_DECODE(&ip->i_mtime, mtime);