diff options
author | Dave Chinner <dchinner@redhat.com> | 2010-11-08 08:55:04 +0000 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2010-11-10 12:00:48 -0600 |
commit | f83282a8ef799c0bdcb0c32971487087da1bc216 (patch) | |
tree | 953c706c4c96a85348cc6e1404436411919b6d80 /fs/xfs | |
parent | 6762b938eac878a30a90e770ac655874c36bc642 (diff) | |
download | op-kernel-dev-f83282a8ef799c0bdcb0c32971487087da1bc216.zip op-kernel-dev-f83282a8ef799c0bdcb0c32971487087da1bc216.tar.gz |
xfs: fix per-ag reference counting in inode reclaim tree walking
The walk fails to decrement the per-ag reference count when the
non-blocking walk fails to obtain the per-ag reclaim lock, leading
to an assert failure on debug kernels when unmounting a filesystem.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.c | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.c | 1 |
2 files changed, 2 insertions, 0 deletions
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 37d3325..afb0d7c 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c @@ -853,6 +853,7 @@ restart: if (trylock) { if (!mutex_trylock(&pag->pag_ici_reclaim_lock)) { skipped++; + xfs_perag_put(pag); continue; } first_index = pag->pag_ici_reclaim_cursor; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index b1498ab..19e9dfa 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -275,6 +275,7 @@ xfs_free_perag( pag = radix_tree_delete(&mp->m_perag_tree, agno); spin_unlock(&mp->m_perag_lock); ASSERT(pag); + ASSERT(atomic_read(&pag->pag_ref) == 0); call_rcu(&pag->rcu_head, __xfs_free_perag); } } |