xfs: return the dquot unlocked from xfs_qm_dqget

There is no reason to lock the dquot in xfs_qm_dqget, which just acquires
a reference.  Move the locking to the callers, or remove it in cases where
the caller instantly unlocks the dquot.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
Christoph Hellwig 2025-11-10 14:23:02 +01:00 committed by Carlos Maiolino
parent bf5066e169
commit 55c1bc3eb9
7 changed files with 9 additions and 5 deletions

View File

@ -205,6 +205,7 @@ xchk_dquot_iter(
if (error)
return error;
mutex_lock(&dq->q_qlock);
cursor->id = dq->q_id + 1;
*dqpp = dq;
return 1;

View File

@ -635,6 +635,7 @@ xqcheck_walk_observations(
if (error)
return error;
mutex_lock(&dq->q_qlock);
error = xqcheck_compare_dquot(xqc, dqtype, dq);
mutex_unlock(&dq->q_qlock);
xfs_qm_dqrele(dq);

View File

@ -187,6 +187,7 @@ xqcheck_commit_dqtype(
if (error)
return error;
mutex_lock(&dq->q_qlock);
error = xqcheck_commit_dquot(xqc, dqtype, dq);
mutex_unlock(&dq->q_qlock);
xfs_qm_dqrele(dq);

View File

@ -895,7 +895,7 @@ xfs_qm_dqget_checks(
/*
* Given the file system, id, and type (UDQUOT/GDQUOT/PDQUOT), return a
* locked dquot, doing an allocation (if requested) as needed.
* dquot, doing an allocation (if requested) as needed.
*/
int
xfs_qm_dqget(
@ -940,7 +940,6 @@ xfs_qm_dqget(
trace_xfs_dqget_miss(dqp);
found:
*O_dqpp = dqp;
mutex_lock(&dqp->q_qlock);
return 0;
}
@ -1098,6 +1097,7 @@ xfs_qm_dqget_next(
else if (error != 0)
break;
mutex_lock(&dqp->q_qlock);
if (!XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
*dqpp = dqp;
return 0;

View File

@ -1268,6 +1268,7 @@ xfs_qm_quotacheck_dqadjust(
return error;
}
mutex_lock(&dqp->q_qlock);
error = xfs_dquot_attach_buf(NULL, dqp);
if (error)
goto out_unlock;
@ -1907,7 +1908,6 @@ xfs_qm_vop_dqalloc(
/*
* Get the ilock in the right order.
*/
mutex_unlock(&uq->q_qlock);
lockflags = XFS_ILOCK_SHARED;
xfs_ilock(ip, lockflags);
} else {
@ -1929,7 +1929,6 @@ xfs_qm_vop_dqalloc(
ASSERT(error != -ENOENT);
goto error_rele;
}
mutex_unlock(&gq->q_qlock);
lockflags = XFS_ILOCK_SHARED;
xfs_ilock(ip, lockflags);
} else {
@ -1947,7 +1946,6 @@ xfs_qm_vop_dqalloc(
ASSERT(error != -ENOENT);
goto error_rele;
}
mutex_unlock(&pq->q_qlock);
lockflags = XFS_ILOCK_SHARED;
xfs_ilock(ip, lockflags);
} else {

View File

@ -73,6 +73,7 @@ xfs_qm_statvfs(
struct xfs_dquot *dqp;
if (!xfs_qm_dqget(mp, ip->i_projid, XFS_DQTYPE_PROJ, false, &dqp)) {
mutex_lock(&dqp->q_qlock);
xfs_fill_statvfs_from_dquot(statp, ip, dqp);
mutex_unlock(&dqp->q_qlock);
xfs_qm_dqrele(dqp);

View File

@ -302,6 +302,7 @@ xfs_qm_scall_setqlim(
return error;
}
mutex_lock(&dqp->q_qlock);
defq = xfs_get_defquota(q, xfs_dquot_type(dqp));
mutex_unlock(&dqp->q_qlock);
@ -459,6 +460,7 @@ xfs_qm_scall_getquota(
* If everything's NULL, this dquot doesn't quite exist as far as
* our utility programs are concerned.
*/
mutex_lock(&dqp->q_qlock);
if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
error = -ENOENT;
goto out_put;