diff options
author | Dave Chinner <david@fromorbit.com> | 2010-01-11 06:47:41 -0500 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2010-01-15 16:33:12 -0500 |
commit | a862e0fdcb8862aab2538ec2fc2f0dc07a625c59 (patch) | |
tree | 41e83f478c9414e3376e99aa8565c67cc9930764 /fs/xfs/xfs_alloc_btree.c | |
parent | 5017e97d52628fb8ae56e434e86ac2e72ddaac2b (diff) |
xfs: Don't directly reference m_perag in allocation code
Start abstracting the perag references so that the indexing of the
structures is not directly coded into all the places that uses the
perag structures. This will allow us to separate the use of the
perag structure and the way it is indexed and hence avoid the known
deadlocks related to growing a busy filesystem.
Signed-off-by: Dave Chinner <david@fromorbit.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_alloc_btree.c')
-rw-r--r-- | fs/xfs/xfs_alloc_btree.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index adbd9141aea1..b726e10d2c1c 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c | |||
@@ -61,12 +61,14 @@ xfs_allocbt_set_root( | |||
61 | struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); | 61 | struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); |
62 | xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); | 62 | xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); |
63 | int btnum = cur->bc_btnum; | 63 | int btnum = cur->bc_btnum; |
64 | struct xfs_perag *pag = xfs_perag_get(cur->bc_mp, seqno); | ||
64 | 65 | ||
65 | ASSERT(ptr->s != 0); | 66 | ASSERT(ptr->s != 0); |
66 | 67 | ||
67 | agf->agf_roots[btnum] = ptr->s; | 68 | agf->agf_roots[btnum] = ptr->s; |
68 | be32_add_cpu(&agf->agf_levels[btnum], inc); | 69 | be32_add_cpu(&agf->agf_levels[btnum], inc); |
69 | cur->bc_mp->m_perag[seqno].pagf_levels[btnum] += inc; | 70 | pag->pagf_levels[btnum] += inc; |
71 | xfs_perag_put(pag); | ||
70 | 72 | ||
71 | xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_ROOTS | XFS_AGF_LEVELS); | 73 | xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_ROOTS | XFS_AGF_LEVELS); |
72 | } | 74 | } |
@@ -150,6 +152,7 @@ xfs_allocbt_update_lastrec( | |||
150 | { | 152 | { |
151 | struct xfs_agf *agf = XFS_BUF_TO_AGF(cur->bc_private.a.agbp); | 153 | struct xfs_agf *agf = XFS_BUF_TO_AGF(cur->bc_private.a.agbp); |
152 | xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); | 154 | xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); |
155 | struct xfs_perag *pag; | ||
153 | __be32 len; | 156 | __be32 len; |
154 | int numrecs; | 157 | int numrecs; |
155 | 158 | ||
@@ -193,7 +196,9 @@ xfs_allocbt_update_lastrec( | |||
193 | } | 196 | } |
194 | 197 | ||
195 | agf->agf_longest = len; | 198 | agf->agf_longest = len; |
196 | cur->bc_mp->m_perag[seqno].pagf_longest = be32_to_cpu(len); | 199 | pag = xfs_perag_get(cur->bc_mp, seqno); |
200 | pag->pagf_longest = be32_to_cpu(len); | ||
201 | xfs_perag_put(pag); | ||
197 | xfs_alloc_log_agf(cur->bc_tp, cur->bc_private.a.agbp, XFS_AGF_LONGEST); | 202 | xfs_alloc_log_agf(cur->bc_tp, cur->bc_private.a.agbp, XFS_AGF_LONGEST); |
198 | } | 203 | } |
199 | 204 | ||