diff options
-rw-r--r-- | fs/xfs/xfs_ag.h | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.c | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.h | 11 |
3 files changed, 12 insertions, 4 deletions
diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 6702bd86581..18ae43f4255 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h | |||
@@ -196,8 +196,8 @@ typedef struct xfs_perag_busy { | |||
196 | #define XFS_PAGB_NUM_SLOTS 128 | 196 | #define XFS_PAGB_NUM_SLOTS 128 |
197 | #endif | 197 | #endif |
198 | 198 | ||
199 | typedef struct xfs_perag | 199 | typedef struct xfs_perag { |
200 | { | 200 | atomic_t pag_ref; /* perag reference count */ |
201 | char pagf_init; /* this agf's entry is initialized */ | 201 | char pagf_init; /* this agf's entry is initialized */ |
202 | char pagi_init; /* this agi's entry is initialized */ | 202 | char pagi_init; /* this agi's entry is initialized */ |
203 | char pagf_metadata; /* the agf is preferred to be metadata */ | 203 | char pagf_metadata; /* the agf is preferred to be metadata */ |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index c04dd83cb57..f241fec2607 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
@@ -215,6 +215,7 @@ xfs_free_perag( | |||
215 | for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { | 215 | for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { |
216 | spin_lock(&mp->m_perag_lock); | 216 | spin_lock(&mp->m_perag_lock); |
217 | pag = radix_tree_delete(&mp->m_perag_tree, agno); | 217 | pag = radix_tree_delete(&mp->m_perag_tree, agno); |
218 | ASSERT(atomic_read(&pag->pag_ref) == 0); | ||
218 | spin_unlock(&mp->m_perag_lock); | 219 | spin_unlock(&mp->m_perag_lock); |
219 | ASSERT(pag); | 220 | ASSERT(pag); |
220 | kmem_free(pag->pagb_list); | 221 | kmem_free(pag->pagb_list); |
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index cfa7a5d22e7..16b22120b98 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
@@ -384,7 +384,7 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) | |||
384 | } | 384 | } |
385 | 385 | ||
386 | /* | 386 | /* |
387 | * perag get/put wrappers for eventual ref counting | 387 | * perag get/put wrappers for ref counting |
388 | */ | 388 | */ |
389 | static inline struct xfs_perag * | 389 | static inline struct xfs_perag * |
390 | xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) | 390 | xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) |
@@ -393,6 +393,12 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) | |||
393 | 393 | ||
394 | spin_lock(&mp->m_perag_lock); | 394 | spin_lock(&mp->m_perag_lock); |
395 | pag = radix_tree_lookup(&mp->m_perag_tree, agno); | 395 | pag = radix_tree_lookup(&mp->m_perag_tree, agno); |
396 | if (pag) { | ||
397 | ASSERT(atomic_read(&pag->pag_ref) >= 0); | ||
398 | /* catch leaks in the positive direction during testing */ | ||
399 | ASSERT(atomic_read(&pag->pag_ref) < 1000); | ||
400 | atomic_inc(&pag->pag_ref); | ||
401 | } | ||
396 | spin_unlock(&mp->m_perag_lock); | 402 | spin_unlock(&mp->m_perag_lock); |
397 | return pag; | 403 | return pag; |
398 | } | 404 | } |
@@ -400,7 +406,8 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) | |||
400 | static inline void | 406 | static inline void |
401 | xfs_perag_put(struct xfs_perag *pag) | 407 | xfs_perag_put(struct xfs_perag *pag) |
402 | { | 408 | { |
403 | /* nothing to see here, move along */ | 409 | ASSERT(atomic_read(&pag->pag_ref) > 0); |
410 | atomic_dec(&pag->pag_ref); | ||
404 | } | 411 | } |
405 | 412 | ||
406 | /* | 413 | /* |