Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50e0bdbe authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: grab dquots without taking the ilock



Add a new dqget flag that grabs the dquot without taking the ilock.
This will be used by the scrubber (which will have already grabbed
the ilock) to perform basic sanity checking of the quota data.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
parent 244e3dea
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -136,6 +136,8 @@ typedef uint16_t xfs_qwarncnt_t;
 */
#define XFS_QMOPT_INHERIT	0x1000000

#define XFS_QMOPT_NOLOCK	0x2000000 /* don't ilock during dqget */

/*
 * flags to xfs_trans_mod_dquot.
 */
+10 −4
Original line number Diff line number Diff line
@@ -472,17 +472,22 @@ xfs_qm_dqtobp(
	struct xfs_mount	*mp = dqp->q_mount;
	xfs_dqid_t		id = be32_to_cpu(dqp->q_core.d_id);
	struct xfs_trans	*tp = (tpp ? *tpp : NULL);
	uint			lock_mode;
	uint			lock_mode = 0;

	quotip = xfs_quota_inode(dqp->q_mount, dqp->dq_flags);
	dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk;

	ASSERT(!(flags & XFS_QMOPT_NOLOCK) ||
		xfs_isilocked(quotip, XFS_ILOCK_SHARED) ||
		xfs_isilocked(quotip, XFS_ILOCK_EXCL));
	if (!(flags & XFS_QMOPT_NOLOCK))
		lock_mode = xfs_ilock_data_map_shared(quotip);
	if (!xfs_this_quota_on(dqp->q_mount, dqp->dq_flags)) {
		/*
		 * Return if this type of quotas is turned off while we
		 * didn't have the quota inode lock.
		 */
		if (lock_mode)
			xfs_iunlock(quotip, lock_mode);
		return -ESRCH;
	}
@@ -493,6 +498,7 @@ xfs_qm_dqtobp(
	error = xfs_bmapi_read(quotip, dqp->q_fileoffset,
			       XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0);

	if (lock_mode)
		xfs_iunlock(quotip, lock_mode);
	if (error)
		return error;