aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_mount.c
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2012-04-23 01:59:06 -0400
committerBen Myers <bpm@sgi.com>2012-05-14 17:21:02 -0400
commitd4f3512b0891658b6b4d5fc99567242b3fc2d6b7 (patch)
treedfe5cd3093ed3d58cd2d9c1934b9821af8b530e3 /fs/xfs/xfs_mount.c
parent12bcb3f7d4371f74bd25372e98e0d2da978e82b2 (diff)
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>
Diffstat (limited to 'fs/xfs/xfs_mount.c')
-rw-r--r--fs/xfs/xfs_mount.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index f511d22fee6f..536021fb3d4e 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -1288,7 +1288,7 @@ xfs_mountfs(
1288 XFS_FSB_TO_BB(mp, sbp->sb_logblocks)); 1288 XFS_FSB_TO_BB(mp, sbp->sb_logblocks));
1289 if (error) { 1289 if (error) {
1290 xfs_warn(mp, "log mount failed"); 1290 xfs_warn(mp, "log mount failed");
1291 goto out_free_perag; 1291 goto out_fail_wait;
1292 } 1292 }
1293 1293
1294 /* 1294 /*
@@ -1315,7 +1315,7 @@ xfs_mountfs(
1315 !mp->m_sb.sb_inprogress) { 1315 !mp->m_sb.sb_inprogress) {
1316 error = xfs_initialize_perag_data(mp, sbp->sb_agcount); 1316 error = xfs_initialize_perag_data(mp, sbp->sb_agcount);
1317 if (error) 1317 if (error)
1318 goto out_free_perag; 1318 goto out_fail_wait;
1319 } 1319 }
1320 1320
1321 /* 1321 /*
@@ -1439,6 +1439,10 @@ xfs_mountfs(
1439 IRELE(rip); 1439 IRELE(rip);
1440 out_log_dealloc: 1440 out_log_dealloc:
1441 xfs_log_unmount(mp); 1441 xfs_log_unmount(mp);
1442 out_fail_wait:
1443 if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
1444 xfs_wait_buftarg(mp->m_logdev_targp);
1445 xfs_wait_buftarg(mp->m_ddev_targp);
1442 out_free_perag: 1446 out_free_perag:
1443 xfs_free_perag(mp); 1447 xfs_free_perag(mp);
1444 out_remove_uuid: 1448 out_remove_uuid: