On Sun, Apr 22, 2018 at 08:06:30AM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > Quotacheck only runs during mount, which means that there are no other > processes in the system that could be doing chown or chproj. Therefore > there's no potential for racing to attach dquots to the inode so we can > drop all the ILOCK and race detection bits from quotacheck. > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_qm.c | 28 ++++++++++++---------------- > 1 file changed, 12 insertions(+), 16 deletions(-) > > > diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c > index 385d315..123ea5f 100644 > --- a/fs/xfs/xfs_qm.c > +++ b/fs/xfs/xfs_qm.c > @@ -1065,16 +1065,17 @@ xfs_qm_dqiterate( > STATIC int > xfs_qm_quotacheck_dqadjust( > struct xfs_inode *ip, > - xfs_dqid_t id, > uint type, > xfs_qcnt_t nblks, > xfs_qcnt_t rtblks) > { > struct xfs_mount *mp = ip->i_mount; > struct xfs_dquot *dqp; > + xfs_dqid_t id; > int error; > > - error = xfs_qm_dqget_inode(mp, ip, type, XFS_QMOPT_DQALLOC, &dqp); > + id = xfs_qm_id_for_quotatype(ip, type); > + error = xfs_qm_dqget(mp, id, type, XFS_QMOPT_DQALLOC, &dqp); > if (error) { > /* > * Shouldn't be able to turn off quotas here. > @@ -1147,13 +1148,10 @@ xfs_qm_dqusage_adjust( > } > > /* > - * We don't _need_ to take the ilock EXCL. However, the xfs_qm_dqget > - * interface expects the inode to be exclusively locked because that's > - * the case in all other instances. It's OK that we do this because > - * quotacheck is done only at mount time. > + * We don't _need_ to take the ilock EXCL here because quotacheck runs > + * at mount time and therefore nobody will be racing chown/chproj. > */ > - error = xfs_iget(mp, NULL, ino, XFS_IGET_DONTCACHE, XFS_ILOCK_EXCL, > - &ip); > + error = xfs_iget(mp, NULL, ino, XFS_IGET_DONTCACHE, 0, &ip); > if (error) { > *res = BULKSTAT_RV_NOTHING; > return error; > @@ -1188,33 +1186,31 @@ xfs_qm_dqusage_adjust( > * and quotaoffs don't race. (Quotachecks happen at mount time only). > */ > if (XFS_IS_UQUOTA_ON(mp)) { > - error = xfs_qm_quotacheck_dqadjust(ip, ip->i_d.di_uid, > - XFS_DQ_USER, nblks, rtblks); > + error = xfs_qm_quotacheck_dqadjust(ip, XFS_DQ_USER, nblks, > + rtblks); > if (error) > goto error0; > } > > if (XFS_IS_GQUOTA_ON(mp)) { > - error = xfs_qm_quotacheck_dqadjust(ip, ip->i_d.di_gid, > - XFS_DQ_GROUP, nblks, rtblks); > + error = xfs_qm_quotacheck_dqadjust(ip, XFS_DQ_GROUP, nblks, > + rtblks); > if (error) > goto error0; > } > > if (XFS_IS_PQUOTA_ON(mp)) { > - error = xfs_qm_quotacheck_dqadjust(ip, xfs_get_projid(ip), > - XFS_DQ_PROJ, nblks, rtblks); > + error = xfs_qm_quotacheck_dqadjust(ip, XFS_DQ_PROJ, nblks, > + rtblks); > if (error) > goto error0; > } > > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > IRELE(ip); > *res = BULKSTAT_RV_DIDONE; > return 0; > > error0: > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > IRELE(ip); > *res = BULKSTAT_RV_GIVEUP; > return error; > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html