|
@@ -1056,16 +1056,17 @@ out:
|
|
|
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(ip, type, true, &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.
|
|
@@ -1138,13 +1139,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;
|
|
@@ -1179,33 +1177,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;
|