diff options
author | Christoph Hellwig <hch@infradead.org> | 2013-12-06 15:30:13 -0500 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2013-12-18 17:04:18 -0500 |
commit | f4df8adc8325127ff015ef9c2a8f005edaaedd07 (patch) | |
tree | 28838c20c5a81d1574023752262fe25135dd1053 | |
parent | 4f317369d46956ccd76b5d28cf66b3f8b24f3480 (diff) |
xfs: use xfs_ilock_data_map_shared in xfs_qm_dqtobp
We might not have read in the extent list at this point, so make sure we
take the ilock exclusively if we have to do so.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
-rw-r--r-- | fs/xfs/xfs_dquot.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 6b1e695caf0e..7aeb4c895b32 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c | |||
@@ -469,16 +469,17 @@ xfs_qm_dqtobp( | |||
469 | struct xfs_mount *mp = dqp->q_mount; | 469 | struct xfs_mount *mp = dqp->q_mount; |
470 | xfs_dqid_t id = be32_to_cpu(dqp->q_core.d_id); | 470 | xfs_dqid_t id = be32_to_cpu(dqp->q_core.d_id); |
471 | struct xfs_trans *tp = (tpp ? *tpp : NULL); | 471 | struct xfs_trans *tp = (tpp ? *tpp : NULL); |
472 | uint lock_mode; | ||
472 | 473 | ||
473 | dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk; | 474 | dqp->q_fileoffset = (xfs_fileoff_t)id / mp->m_quotainfo->qi_dqperchunk; |
474 | 475 | ||
475 | xfs_ilock(quotip, XFS_ILOCK_SHARED); | 476 | lock_mode = xfs_ilock_data_map_shared(quotip); |
476 | if (!xfs_this_quota_on(dqp->q_mount, dqp->dq_flags)) { | 477 | if (!xfs_this_quota_on(dqp->q_mount, dqp->dq_flags)) { |
477 | /* | 478 | /* |
478 | * Return if this type of quotas is turned off while we | 479 | * Return if this type of quotas is turned off while we |
479 | * didn't have the quota inode lock. | 480 | * didn't have the quota inode lock. |
480 | */ | 481 | */ |
481 | xfs_iunlock(quotip, XFS_ILOCK_SHARED); | 482 | xfs_iunlock(quotip, lock_mode); |
482 | return ESRCH; | 483 | return ESRCH; |
483 | } | 484 | } |
484 | 485 | ||
@@ -488,7 +489,7 @@ xfs_qm_dqtobp( | |||
488 | error = xfs_bmapi_read(quotip, dqp->q_fileoffset, | 489 | error = xfs_bmapi_read(quotip, dqp->q_fileoffset, |
489 | XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0); | 490 | XFS_DQUOT_CLUSTER_SIZE_FSB, &map, &nmaps, 0); |
490 | 491 | ||
491 | xfs_iunlock(quotip, XFS_ILOCK_SHARED); | 492 | xfs_iunlock(quotip, lock_mode); |
492 | if (error) | 493 | if (error) |
493 | return error; | 494 | return error; |
494 | 495 | ||