xfs: flush outstanding buffers on log mount failure
When we fail to mount the log in xfs_mountfs(), we tear down all the infrastructure we have already allocated. However, the process of mounting the log may have progressed to the point of reading, caching and modifying buffers in memory. Hence before we can free all the infrastructure, we have to flush and remove all the buffers from memory. Problem first reported by Eric Sandeen, later a different incarnation was reported by Ben Myers. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
12bcb3f7d4
commit
d4f3512b08
@ -1288,7 +1288,7 @@ xfs_mountfs(
|
||||
XFS_FSB_TO_BB(mp, sbp->sb_logblocks));
|
||||
if (error) {
|
||||
xfs_warn(mp, "log mount failed");
|
||||
goto out_free_perag;
|
||||
goto out_fail_wait;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1315,7 +1315,7 @@ xfs_mountfs(
|
||||
!mp->m_sb.sb_inprogress) {
|
||||
error = xfs_initialize_perag_data(mp, sbp->sb_agcount);
|
||||
if (error)
|
||||
goto out_free_perag;
|
||||
goto out_fail_wait;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1439,6 +1439,10 @@ xfs_mountfs(
|
||||
IRELE(rip);
|
||||
out_log_dealloc:
|
||||
xfs_log_unmount(mp);
|
||||
out_fail_wait:
|
||||
if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
|
||||
xfs_wait_buftarg(mp->m_logdev_targp);
|
||||
xfs_wait_buftarg(mp->m_ddev_targp);
|
||||
out_free_perag:
|
||||
xfs_free_perag(mp);
|
||||
out_remove_uuid:
|
||||
|
Loading…
Reference in New Issue
Block a user