xfs: flush outstanding buffers on log mount failure
authorDave Chinner <dchinner@redhat.com>
Mon, 23 Apr 2012 05:59:06 +0000 (15:59 +1000)
committerBen Myers <bpm@sgi.com>
Mon, 14 May 2012 21:21:02 +0000 (16:21 -0500)
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>
fs/xfs/xfs_mount.c

index f511d22fee6f62c3914d737fc195085e1df81427..536021fb3d4e338a0e694ac069191c0b0d4d0cf0 100644 (file)
@@ -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: