From eec6646ea9126d0f3c367e1298e5272b72cda8a4 Mon Sep 17 00:00:00 2001 From: Ryan Moeller Date: Wed, 4 Nov 2020 22:10:13 +0000 Subject: [PATCH] Factor uid, gid, and projid out of loop in zfs_write Reviewed-by: Brian Behlendorf Reviewed-by: Matt Macy Reviewed-by: Alexander Motin Signed-off-by: Ryan Moeller Closes #11176 --- module/zfs/zfs_vnops.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index c2a2d98d1..b1ae6b8c0 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -429,6 +429,10 @@ zfs_write(znode_t *zp, uio_t *uio, int ioflag, cred_t *cr) uint64_t end_size = MAX(zp->z_size, woff + n); zilog_t *zilog = zfsvfs->z_log; + const uint64_t uid = KUID_TO_SUID(ZTOUID(zp)); + const uint64_t gid = KGID_TO_SGID(ZTOGID(zp)); + const uint64_t projid = zp->z_projid; + /* * Write the file in reasonable size chunks. Each chunk is written * in a separate transaction; this keeps the intent log records small @@ -437,13 +441,11 @@ zfs_write(znode_t *zp, uio_t *uio, int ioflag, cred_t *cr) while (n > 0) { woff = uio->uio_loffset; - if (zfs_id_overblockquota(zfsvfs, DMU_USERUSED_OBJECT, - KUID_TO_SUID(ZTOUID(zp))) || - zfs_id_overblockquota(zfsvfs, DMU_GROUPUSED_OBJECT, - KGID_TO_SGID(ZTOGID(zp))) || - (zp->z_projid != ZFS_DEFAULT_PROJID && + if (zfs_id_overblockquota(zfsvfs, DMU_USERUSED_OBJECT, uid) || + zfs_id_overblockquota(zfsvfs, DMU_GROUPUSED_OBJECT, gid) || + (projid != ZFS_DEFAULT_PROJID && zfs_id_overblockquota(zfsvfs, DMU_PROJECTUSED_OBJECT, - zp->z_projid))) { + projid))) { error = SET_ERROR(EDQUOT); break; } @@ -607,7 +609,6 @@ zfs_write(znode_t *zp, uio_t *uio, int ioflag, cred_t *cr) * user 0 is not an ephemeral uid. */ mutex_enter(&zp->z_acl_lock); - uint32_t uid = KUID_TO_SUID(ZTOUID(zp)); if ((zp->z_mode & (S_IXUSR | (S_IXUSR >> 3) | (S_IXUSR >> 6))) != 0 && (zp->z_mode & (S_ISUID | S_ISGID)) != 0 &&