Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9057e3d authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Christoph Hellwig
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarFelix Blyakher <felixb@sgi.com>
parent 3228149c
Loading
Loading
Loading
Loading
+35 −42
Original line number Diff line number Diff line
@@ -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:
 *	- reads the superblock from disk and init the mount struct
 *	- if we're a 32-bit kernel, do a size check on the superblock
@@ -905,7 +903,6 @@ xfs_mountfs(
	xfs_inode_t	*rip;
	__uint64_t	resblks;
	uint		quotamount, quotaflags;
	int		uuid_mounted = 0;
	int		error = 0;

	xfs_mount_common(mp, sbp);
@@ -960,7 +957,7 @@ xfs_mountfs(
	 */
	error = xfs_update_alignment(mp);
	if (error)
		goto error1;
		goto out;

	xfs_alloc_compute_maxlevels(mp);
	xfs_bmap_compute_maxlevels(mp, XFS_DATA_FORK);
@@ -977,12 +974,11 @@ xfs_mountfs(
	 * since a single partition filesystem is identical to a single
	 * partition volume/filesystem.
	 */
	if ((mp->m_flags & XFS_MOUNT_NOUUID) == 0) {
	if (!(mp->m_flags & XFS_MOUNT_NOUUID)) {
		if (xfs_uuid_mount(mp)) {
			error = XFS_ERROR(EINVAL);
			goto error1;
			goto out;
		}
		uuid_mounted=1;
	}

	/*
@@ -1007,7 +1003,7 @@ xfs_mountfs(
	 */
	error = xfs_check_sizes(mp);
	if (error)
		goto error1;
		goto out_remove_uuid;

	/*
	 * Initialize realtime fields in the mount structure
@@ -1015,7 +1011,7 @@ xfs_mountfs(
	error = xfs_rtmount_init(mp);
	if (error) {
		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),
				  KM_MAYFAIL);
	if (!mp->m_perag)
		goto error1;
		goto out_remove_uuid;

	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
	 */
	if (likely(sbp->sb_logblocks > 0)) {	/* check for volume case */
	error = xfs_log_mount(mp, mp->m_logdev_targp,
			      XFS_FSB_TO_DADDR(mp, sbp->sb_logstart),
			      XFS_FSB_TO_BB(mp, sbp->sb_logblocks));
	if (error) {
		cmn_err(CE_WARN, "XFS: log mount failed");
			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;
		goto out_free_perag;
	}

	/*
@@ -1086,15 +1082,14 @@ xfs_mountfs(
	 * If we are currently making the filesystem, the initialisation will
	 * fail as the perag data is in an undefined state.
	 */

	if (xfs_sb_version_haslazysbcount(&mp->m_sb) &&
	    !XFS_LAST_UNMOUNT_WAS_CLEAN(mp) &&
	     !mp->m_sb.sb_inprogress) {
		error = xfs_initialize_perag_data(mp, sbp->sb_agcount);
		if (error) {
			goto error2;
		}
		if (error)
			goto out_free_perag;
	}

	/*
	 * Get and sanity-check the root inode.
	 * 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);
	if (error) {
		cmn_err(CE_WARN, "XFS: failed to read root inode");
		goto error3;
		goto out_log_dealloc;
	}

	ASSERT(rip != NULL);
@@ -1116,7 +1111,7 @@ xfs_mountfs(
		XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW,
				 mp);
		error = XFS_ERROR(EFSCORRUPTED);
		goto error4;
		goto out_rele_rip;
	}
	mp->m_rootip = rip;	/* save it */

@@ -1131,7 +1126,7 @@ xfs_mountfs(
		 * Free up the root inode.
		 */
		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);
		if (error) {
			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);
	if (error)
		goto error4;
		goto out_rele_rip;

	/*
	 * Finish recovering the file system.  This part needed to be
@@ -1162,7 +1157,7 @@ xfs_mountfs(
	error = xfs_log_mount_finish(mp);
	if (error) {
		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);
	if (error)
		goto error4;
		goto out_rele_rip;

	/*
	 * Now we are mounted, reserve a small amount of unused space for
@@ -1194,18 +1189,16 @@ xfs_mountfs(

	return 0;

 error4:
	/*
	 * Free up the root inode.
	 */
 out_rele_rip:
	IRELE(rip);
 error3:
 out_log_dealloc:
	xfs_log_unmount_dealloc(mp);
 error2:
 out_free_perag:
	xfs_free_perag(mp);
 error1:
	if (uuid_mounted)
 out_remove_uuid:
	if (!(mp->m_flags & XFS_MOUNT_NOUUID))
		uuid_table_remove(&mp->m_sb.sb_uuid);
 out:
	return error;
}