mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-15 21:23:23 +00:00
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>
This commit is contained in:
parent
6762b938ea
commit
f83282a8ef
@ -853,6 +853,7 @@ restart:
|
|||||||
if (trylock) {
|
if (trylock) {
|
||||||
if (!mutex_trylock(&pag->pag_ici_reclaim_lock)) {
|
if (!mutex_trylock(&pag->pag_ici_reclaim_lock)) {
|
||||||
skipped++;
|
skipped++;
|
||||||
|
xfs_perag_put(pag);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
first_index = pag->pag_ici_reclaim_cursor;
|
first_index = pag->pag_ici_reclaim_cursor;
|
||||||
|
@ -275,6 +275,7 @@ xfs_free_perag(
|
|||||||
pag = radix_tree_delete(&mp->m_perag_tree, agno);
|
pag = radix_tree_delete(&mp->m_perag_tree, agno);
|
||||||
spin_unlock(&mp->m_perag_lock);
|
spin_unlock(&mp->m_perag_lock);
|
||||||
ASSERT(pag);
|
ASSERT(pag);
|
||||||
|
ASSERT(atomic_read(&pag->pag_ref) == 0);
|
||||||
call_rcu(&pag->rcu_head, __xfs_free_perag);
|
call_rcu(&pag->rcu_head, __xfs_free_perag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user