From: Christoph Hellwig Date: Mon, 10 Nov 2025 13:23:02 +0000 (+0100) Subject: xfs: return the dquot unlocked from xfs_qm_dqget X-Git-Tag: v6.19-rc1~164^2~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=55c1bc3eb9d0f39ea4c078b339a6228f5f62584b;p=thirdparty%2Fkernel%2Flinux.git 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 Reviewed-by: Darrick J. Wong Signed-off-by: Carlos Maiolino --- diff --git a/fs/xfs/scrub/dqiterate.c b/fs/xfs/scrub/dqiterate.c index 20c4daedd48df..6f1185afbf396 100644 --- a/fs/xfs/scrub/dqiterate.c +++ b/fs/xfs/scrub/dqiterate.c @@ -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; diff --git a/fs/xfs/scrub/quotacheck.c b/fs/xfs/scrub/quotacheck.c index 180449f654f68..bef63f19cd877 100644 --- a/fs/xfs/scrub/quotacheck.c +++ b/fs/xfs/scrub/quotacheck.c @@ -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); diff --git a/fs/xfs/scrub/quotacheck_repair.c b/fs/xfs/scrub/quotacheck_repair.c index 11153e24b565d..3b23219d43eda 100644 --- a/fs/xfs/scrub/quotacheck_repair.c +++ b/fs/xfs/scrub/quotacheck_repair.c @@ -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); diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 862fec529512f..1c9c17892874f 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -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 @@ restart: 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; diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index f3f7947bc4ed4..a81b8b7a4e4f5 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -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 { diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index e5a30b12253c6..edc0aef3cf34a 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -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); diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 441f9806cddb1..6c8924780d7a6 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -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;