Skip to content

Commit

Permalink
xfs: avoid taking the ilock unnessecarily in xfs_qm_dqattach
Browse files Browse the repository at this point in the history
Check if we actually need to attach a dquot before taking the ilock in
xfs_qm_dqattach.  This avoid superflous lock roundtrips for the common cases
of quota support compiled in but not activated on a filesystem and an
inode that already has the dquots attached.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
  • Loading branch information
Christoph Hellwig authored and Ben Myers committed May 14, 2012
1 parent 8a00ebe commit b4d05e3
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions fs/xfs/xfs_qm.c
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,23 @@ xfs_qm_dqattach_grouphint(
xfs_dqunlock(udq);
}

static bool
xfs_qm_need_dqattach(
struct xfs_inode *ip)
{
struct xfs_mount *mp = ip->i_mount;

if (!XFS_IS_QUOTA_RUNNING(mp))
return false;
if (!XFS_IS_QUOTA_ON(mp))
return false;
if (!XFS_NOT_DQATTACHED(mp, ip))
return false;
if (ip->i_ino == mp->m_sb.sb_uquotino ||
ip->i_ino == mp->m_sb.sb_gquotino)
return false;
return true;
}

/*
* Given a locked inode, attach dquot(s) to it, taking U/G/P-QUOTAON
Expand All @@ -500,11 +517,7 @@ xfs_qm_dqattach_locked(
uint nquotas = 0;
int error = 0;

if (!XFS_IS_QUOTA_RUNNING(mp) ||
!XFS_IS_QUOTA_ON(mp) ||
!XFS_NOT_DQATTACHED(mp, ip) ||
ip->i_ino == mp->m_sb.sb_uquotino ||
ip->i_ino == mp->m_sb.sb_gquotino)
if (!xfs_qm_need_dqattach(ip))
return 0;

ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
Expand Down Expand Up @@ -575,6 +588,9 @@ xfs_qm_dqattach(
{
int error;

if (!xfs_qm_need_dqattach(ip))
return 0;

xfs_ilock(ip, XFS_ILOCK_EXCL);
error = xfs_qm_dqattach_locked(ip, flags);
xfs_iunlock(ip, XFS_ILOCK_EXCL);
Expand Down

0 comments on commit b4d05e3

Please sign in to comment.