xfs: cleanup error handling in xfs_mountfs:

Clean up the error handling in xfs_mountfs.  Use readable goto label names,
simplify the uuid handling and other error conditions.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Felix Blyakher <felixb@sgi.com>
This commit is contained in:
Christoph Hellwig 2009-02-04 09:31:52 +01:00 committed by Christoph Hellwig
parent 3228149ceb
commit f9057e3da7

View File

@ -886,8 +886,6 @@ xfs_check_sizes(xfs_mount_t *mp)
} }
/* /*
* xfs_mountfs
*
* This function does the following on an initial mount of a file system: * This function does the following on an initial mount of a file system:
* - reads the superblock from disk and init the mount struct * - reads the superblock from disk and init the mount struct
* - if we're a 32-bit kernel, do a size check on the superblock * - if we're a 32-bit kernel, do a size check on the superblock
@ -905,7 +903,6 @@ xfs_mountfs(
xfs_inode_t *rip; xfs_inode_t *rip;
__uint64_t resblks; __uint64_t resblks;
uint quotamount, quotaflags; uint quotamount, quotaflags;
int uuid_mounted = 0;
int error = 0; int error = 0;
xfs_mount_common(mp, sbp); xfs_mount_common(mp, sbp);
@ -960,7 +957,7 @@ xfs_mountfs(
*/ */
error = xfs_update_alignment(mp); error = xfs_update_alignment(mp);
if (error) if (error)
goto error1; goto out;
xfs_alloc_compute_maxlevels(mp); xfs_alloc_compute_maxlevels(mp);
xfs_bmap_compute_maxlevels(mp, XFS_DATA_FORK); xfs_bmap_compute_maxlevels(mp, XFS_DATA_FORK);
@ -977,12 +974,11 @@ xfs_mountfs(
* since a single partition filesystem is identical to a single * since a single partition filesystem is identical to a single
* partition volume/filesystem. * partition volume/filesystem.
*/ */
if ((mp->m_flags & XFS_MOUNT_NOUUID) == 0) { if (!(mp->m_flags & XFS_MOUNT_NOUUID)) {
if (xfs_uuid_mount(mp)) { if (xfs_uuid_mount(mp)) {
error = XFS_ERROR(EINVAL); error = XFS_ERROR(EINVAL);
goto error1; goto out;
} }
uuid_mounted=1;
} }
/* /*
@ -1007,7 +1003,7 @@ xfs_mountfs(
*/ */
error = xfs_check_sizes(mp); error = xfs_check_sizes(mp);
if (error) if (error)
goto error1; goto out_remove_uuid;
/* /*
* Initialize realtime fields in the mount structure * Initialize realtime fields in the mount structure
@ -1015,7 +1011,7 @@ xfs_mountfs(
error = xfs_rtmount_init(mp); error = xfs_rtmount_init(mp);
if (error) { if (error) {
cmn_err(CE_WARN, "XFS: RT mount failed"); cmn_err(CE_WARN, "XFS: RT mount failed");
goto error1; goto out_remove_uuid;
} }
/* /*
@ -1045,26 +1041,26 @@ xfs_mountfs(
mp->m_perag = kmem_zalloc(sbp->sb_agcount * sizeof(xfs_perag_t), mp->m_perag = kmem_zalloc(sbp->sb_agcount * sizeof(xfs_perag_t),
KM_MAYFAIL); KM_MAYFAIL);
if (!mp->m_perag) if (!mp->m_perag)
goto error1; goto out_remove_uuid;
mp->m_maxagi = xfs_initialize_perag(mp, sbp->sb_agcount); mp->m_maxagi = xfs_initialize_perag(mp, sbp->sb_agcount);
if (!sbp->sb_logblocks) {
cmn_err(CE_WARN, "XFS: no log defined");
XFS_ERROR_REPORT("xfs_mountfs", XFS_ERRLEVEL_LOW, mp);
error = XFS_ERROR(EFSCORRUPTED);
goto out_free_perag;
}
/* /*
* log's mount-time initialization. Perform 1st part recovery if needed * log's mount-time initialization. Perform 1st part recovery if needed
*/ */
if (likely(sbp->sb_logblocks > 0)) { /* check for volume case */ error = xfs_log_mount(mp, mp->m_logdev_targp,
error = xfs_log_mount(mp, mp->m_logdev_targp, XFS_FSB_TO_DADDR(mp, sbp->sb_logstart),
XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), XFS_FSB_TO_BB(mp, sbp->sb_logblocks));
XFS_FSB_TO_BB(mp, sbp->sb_logblocks)); if (error) {
if (error) { cmn_err(CE_WARN, "XFS: log mount failed");
cmn_err(CE_WARN, "XFS: log mount failed"); goto out_free_perag;
goto error2;
}
} else { /* No log has been defined */
cmn_err(CE_WARN, "XFS: no log defined");
XFS_ERROR_REPORT("xfs_mountfs_int(1)", XFS_ERRLEVEL_LOW, mp);
error = XFS_ERROR(EFSCORRUPTED);
goto error2;
} }
/* /*
@ -1086,15 +1082,14 @@ xfs_mountfs(
* If we are currently making the filesystem, the initialisation will * If we are currently making the filesystem, the initialisation will
* fail as the perag data is in an undefined state. * fail as the perag data is in an undefined state.
*/ */
if (xfs_sb_version_haslazysbcount(&mp->m_sb) && if (xfs_sb_version_haslazysbcount(&mp->m_sb) &&
!XFS_LAST_UNMOUNT_WAS_CLEAN(mp) && !XFS_LAST_UNMOUNT_WAS_CLEAN(mp) &&
!mp->m_sb.sb_inprogress) { !mp->m_sb.sb_inprogress) {
error = xfs_initialize_perag_data(mp, sbp->sb_agcount); error = xfs_initialize_perag_data(mp, sbp->sb_agcount);
if (error) { if (error)
goto error2; goto out_free_perag;
}
} }
/* /*
* Get and sanity-check the root inode. * Get and sanity-check the root inode.
* Save the pointer to it in the mount structure. * Save the pointer to it in the mount structure.
@ -1102,7 +1097,7 @@ xfs_mountfs(
error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip, 0); error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip, 0);
if (error) { if (error) {
cmn_err(CE_WARN, "XFS: failed to read root inode"); cmn_err(CE_WARN, "XFS: failed to read root inode");
goto error3; goto out_log_dealloc;
} }
ASSERT(rip != NULL); ASSERT(rip != NULL);
@ -1116,7 +1111,7 @@ xfs_mountfs(
XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW, XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW,
mp); mp);
error = XFS_ERROR(EFSCORRUPTED); error = XFS_ERROR(EFSCORRUPTED);
goto error4; goto out_rele_rip;
} }
mp->m_rootip = rip; /* save it */ mp->m_rootip = rip; /* save it */
@ -1131,7 +1126,7 @@ xfs_mountfs(
* Free up the root inode. * Free up the root inode.
*/ */
cmn_err(CE_WARN, "XFS: failed to read RT inodes"); cmn_err(CE_WARN, "XFS: failed to read RT inodes");
goto error4; goto out_rele_rip;
} }
/* /*
@ -1143,7 +1138,7 @@ xfs_mountfs(
error = xfs_mount_log_sb(mp, mp->m_update_flags); error = xfs_mount_log_sb(mp, mp->m_update_flags);
if (error) { if (error) {
cmn_err(CE_WARN, "XFS: failed to write sb changes"); cmn_err(CE_WARN, "XFS: failed to write sb changes");
goto error4; goto out_rele_rip;
} }
} }
@ -1152,7 +1147,7 @@ xfs_mountfs(
*/ */
error = XFS_QM_INIT(mp, &quotamount, &quotaflags); error = XFS_QM_INIT(mp, &quotamount, &quotaflags);
if (error) if (error)
goto error4; goto out_rele_rip;
/* /*
* Finish recovering the file system. This part needed to be * Finish recovering the file system. This part needed to be
@ -1162,7 +1157,7 @@ xfs_mountfs(
error = xfs_log_mount_finish(mp); error = xfs_log_mount_finish(mp);
if (error) { if (error) {
cmn_err(CE_WARN, "XFS: log mount finish failed"); cmn_err(CE_WARN, "XFS: log mount finish failed");
goto error4; goto out_rele_rip;
} }
/* /*
@ -1170,7 +1165,7 @@ xfs_mountfs(
*/ */
error = XFS_QM_MOUNT(mp, quotamount, quotaflags); error = XFS_QM_MOUNT(mp, quotamount, quotaflags);
if (error) if (error)
goto error4; goto out_rele_rip;
/* /*
* Now we are mounted, reserve a small amount of unused space for * Now we are mounted, reserve a small amount of unused space for
@ -1194,18 +1189,16 @@ xfs_mountfs(
return 0; return 0;
error4: out_rele_rip:
/*
* Free up the root inode.
*/
IRELE(rip); IRELE(rip);
error3: out_log_dealloc:
xfs_log_unmount_dealloc(mp); xfs_log_unmount_dealloc(mp);
error2: out_free_perag:
xfs_free_perag(mp); xfs_free_perag(mp);
error1: out_remove_uuid:
if (uuid_mounted) if (!(mp->m_flags & XFS_MOUNT_NOUUID))
uuid_table_remove(&mp->m_sb.sb_uuid); uuid_table_remove(&mp->m_sb.sb_uuid);
out:
return error; return error;
} }